surface plot
Show older comments
Hello all,
I have the following code:
a = 0:.1:1;
b = 0:.01:.1;
for k = 1:length(a)
c = a(k) + b(k);
end
I would like to plot 'c' versus 'a' and 'b' using 'surfl'; Is there a way to do it? thanks.
Answers (3)
Grzegorz Knor
on 29 Nov 2011
[a b] = meshgrid(0:.1:1,0:.01:.1);
c = a + b;
surfl(a,b,c)
1 Comment
Walter Roberson
on 29 Nov 2011
Bahareh's previous question was specifically asking about combining a(K) and b(K) instead of producing a grid, so it seems your code (fine in most circumstances) is not what is desired _here_
Walter Roberson
on 29 Nov 2011
a = 0:.1:1;
b = 0:.01:.1;
c = a + b;
t = nan(length(a),length(a));
z = diag(c) + tril(t,-1) + triu(t,1); %defined on diag, else nan
surfl(a,b,z);
I would not expect the plot to have any useful content, though. surface plots do interpolation from vertices to determine what to draw, but you are only defining the result along a line.
I will not suggest that you want the entire grid of a(J) + b(K) values as that would not be in accordance with your previous question.
Albert J. G.
on 17 Mar 2019
This question is about how to plot a surface diagram.
The data are in an excel file, as you can find.
My question is how to plot a surface diagram using data from A2 to C72? (if you think data is no enough, you can use C491)
Maybe x=kp; y = ki; z = delay. What I need is like surf(x,y,z), and it will give a surface plot with NO ERROR (this is the most important, I think).
This is the question borthering me for a long time.
BTW, it not hard to plot a 3D scattor diagram, using:
[num, txt]= xlsread('rank.xlsx', 'A2:C72');
x = num(:,1);
y = num(:,2);
z = num(:,3);
% the point on 3d diagram:
plot3(x,y,z,'.','color','black','markersize',12)
xlabel('kp')
ylabel('ki')
zlabel('delay')
grid on
But I really donnot how to plot a surface since Z do not have a obvious relation with X and Y.
11 Comments
Walter Roberson
on 18 Mar 2019
See scatteredInterpolant() or griddata()
Albert J. G.
on 5 Apr 2019
Edited: Albert J. G.
on 5 Apr 2019
Thanks for replying.
I tried this but it seems doesn't work.
The data I have is more like scatter so it's a soild one.
The question is how can i draw a perfect surface plot with MATLAB.
p.s. 1. the updated excel file is attached; 2. For the surface plot we have x-axis: kp, y-axis: ki, z-axis: delay; 3. If you can show the source code and the diagram, i will be grateful!
Walter Roberson
on 5 Apr 2019
Edited: Walter Roberson
on 5 Apr 2019
num = xlsread('rank.xlsx', 'A2:C491');
x = num(:,1);
y = num(:,2);
z = num(:,3);
xv = linspace(min(x), max(x));
yv = linspace(min(y), max(y));
[X, Y] = meshgrid(xv, yv);
Z = griddata(x, y, z, X, Y);
surf(X, Y, Z, 'edgecolor', 'none');
Albert J. G.
on 6 Apr 2019
Thanks for answering!
However, there is a big mistake in your answer: the program didn't show the graph when delay (z-axis) is bigger than 0.11 sec. (The graph should show a full data till 0.21 sec (z-axis).)
A guess is that the program average the data of z-axis.
Is there any way to solve it?
Walter Roberson
on 6 Apr 2019
You have a lot of duplicated data points. You only have 20 different x, and only 10 different y. I do not know what a "surface plot with NO ERROR" means to you.
Albert J. G.
on 6 Apr 2019
It should be like a three-dimensional trapezoid, as shown in the attached file.
I just cannot find a way get it using MATLAB.
Walter Roberson
on 6 Apr 2019
Your data is not compatible with a plot that looks like that.
num = xlsread('rank.xlsx', 'A2:C491');
x = num(:,1);
y = num(:,2);
z = num(:,3);
xv = linspace(min(x), max(x));
yv = linspace(min(y), max(y));
[X, Y] = meshgrid(xv, yv);
[ux, ~, xidx] = unique(x);
[uy, ~, yidx] = unique(y);
zz = accumarray([xidx,yidx],z(:),[], @(v) max(v), nan);
mask = ~isnan(zz);
ind = find(~isnan(zz));
[xind,yind] = ind2sub(size(zz),ind);
xux = ux(xind); yuy = uy(yind); zuz = zz(mask);
Z = griddata(xux,yuy,zuz,X,Y);
surf(X,Y,Z,'edgecolor','none')
Albert J. G.
on 6 Apr 2019
Edited: Albert J. G.
on 6 Apr 2019
I have to mention that I have updated my excel file (named rank.xlsx below).
num = xlsread('rank.xlsx', 'A2:C10745');
The graph is more and more perfect, but it seems there are a lot of sawtooths, which the attached file shows, around kp (x-axis) smaller than 50 when using the following codes you give:
num = xlsread('rank.xlsx', 'A2:C10745');
x = num(:,1);
y = num(:,2);
z = num(:,3);
xv = linspace(min(x), max(x));
yv = linspace(min(y), max(y));
[X, Y] = meshgrid(xv, yv);
[ux, ~, xidx] = unique(x);
[uy, ~, yidx] = unique(y);
zz = accumarray([xidx,yidx],z(:),[], @(v) max(v), nan);
mask = ~isnan(zz);
ind = find(~isnan(zz));
[xind,yind] = ind2sub(size(zz),ind);
xux = ux(xind); yuy = uy(yind); zuz = zz(mask);
Z = griddata(xux,yuy,zuz,X,Y);
surf(X,Y,Z,'edgecolor','none')
Walter Roberson
on 6 Apr 2019
griddata has to do interpolation. Your data has some location with a single z of 0 and beside it locations with multiple z at higher values. So you end up with adjacent high and low locations when you do the maximum value projection. Interpolation for that turns out sawtooth.
Walter Roberson
on 6 Apr 2019
Perhaps you would prefer a different approach:
num = xlsread('rank.xlsx', 'A2:C10745');
x = num(:,1);
y = num(:,2);
z = num(:,3);
K = boundary(x, y, z, 1);
trisurf(K, x, y, z);
Albert J. G.
on 6 Apr 2019
Wow! That works!! Thx!!!
Categories
Find more on Graphics Performance in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!