5 views (last 30 days)

Show older comments

Hi All,

I am trying to draw 3D plot from a 2D line graph (in x/z-axis).

I have discrete data points in x and z-axis like below graph. I want to roate it around z-axis. Therefore, I used 'surf'

Here is what I obtained so far.

filename = 'filename.xlsx';

x(:,:)= xlsread(filename);

r = (x(4:49,12))'; z = (x(4:49,13))'; %% data from excel

for i = 1:46;

theta = linspace(0,2*pi,200); %% to rotate around z-axis

X = r(i)*cos(theta);

Y = r(i)*sin(theta);

Z = z(i)*ones(length(Y), length(X));

plot(X,Y); %% just for checking X and Y are on circles

surf(X,Y,Z); %% wanted to obtain a smooth mountain with an empty center.

if i < 46;

hold on;

i = i+1;

end;

end

xlabel('x'); ylabel('y');zlabel('z');

hold off

shading interp

colorbar

and this is the result..

The profile has to be very smooth, no sharp edges on the boundary. However, it has four edges. Also, when x<450, there is be no data points in z-axis.. but it shows very flat top surface (yellow). I think I need to assign z-values at the correct x and y coordinates. However, I am not sure how to fix this.

Please help me to resolve this issue.

Thanks a lot for your comments and time in advance!

Star Strider
on 20 Jul 2021

Without the Excel file, I experimented to create an approsimately equal curve. I then used it as the radiuc argument to the cylinder fucntion to create the surf plot.

x = linspace(460, 700, 50);

z = 1E-194*exp(-0.025*x+460) + 1.5;

figure

plot(x, z)

title('Radius Curve')

[X,Y,Z] = cylinder(z,50);

X = X .* x(:)/2;

Y = Y .* x(:)/2;

Z = Z*max(z) + min(z);

figure

surfc(X, Y, Z, 'EdgeColor','none')

colorbar

zlim([0 max(z)])

That likely approximates what appears to have been requested. Make appropriate changes so it works correctly with the actual data.

.

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!