我想在同一个图上绘制一个带有曲面图的三维散点图,这样我最终会得到这样的结果:
我原以为下面的代码可能达到了我想要的但显然不是。我有x
,y
和z
数据来绘制scatter3
:
x = [1 1 1 1 0.95 0.95 0.95 0.95 0.85 0.85 0.85 0.85 0.8 0.8 0.8 0.8 0.75 0.75 0.75 0.75]';
y = [0.3 0.2 0.15 0.1 0.3 0.2 0.15 0.1 0.3 0.2 0.15 0.1 0.3 0.2 0.15 0.1 0.3 0.2 0.15 0.1]';
z = [0.1 0.15 0.2 0.3 0.1 0.15 0.2 0.3 0.1 0.15 0.2 0.3 0.1 0.15 0.2 0.3 0.1 0.15 0.2 0.3]';
scatter3(x,y,z)
hold on
现在添加一个表面??
p = [x y z];
surf(p)
有什么想法吗?谢谢。
答案 0 :(得分:2)
问题在于冲浪将你的矩阵p视为z值的二维数组,x&的整数值。年。幸运的是,冲浪有多种方式输入值(见http://au.mathworks.com/help/matlab/ref/surf.html)。
试试这个:
x = [1 1 1 1 0.95 0.95 0.95 0.95 0.85 0.85 0.85 0.85 0.8 0.8 0.8 0.8 0.75 0.75 0.75 0.75]';
y = [0.3 0.2 0.15 0.1 0.3 0.2 0.15 0.1 0.3 0.2 0.15 0.1 0.3 0.2 0.15 0.1 0.3 0.2 0.15 0.1]';
z = [0.1 0.15 0.2 0.3 0.1 0.15 0.2 0.3 0.1 0.15 0.2 0.3 0.1 0.15 0.2 0.3 0.1 0.15 0.2 0.3]';
xr = reshape(x, 4, 5);
yr = reshape(y, 4, 5);
zr = reshape(z, 4, 5);
surf(xr, yr, zr)
xlabel('x')
ylabel('y')
zlabel('z')
在这种情况下,surf需要一个x,y和z值的二维数组(如果从上到下看它们就会出现)。这样,surf就知道要连接到表面的顶点。幸运的是,只需将矢量重新整形为矩阵,就可以轻松实现这一点。
将来,如果你的所有点位于相同的x和y坐标上,你可以用[1,0,0.95,0.85,0.8,0.75]代替xr,用[0.3,0.2,0.15,0.1]代替yr并且冲浪将将它们转换为数组。
答案 1 :(得分:0)
我不得不处理同样的问题;我认为回答这个问题可能仍然有用
您需要创建一个兼容的z轴/矩阵。我写
scatt2surf
将散点数据转换为曲面。希望对您有所帮助。
clear all;clc
xx = [1 1 1 1 0.95 0.95 0.95 0.95 0.85 0.85 0.85 0.85 0.8 0.8 0.8 0.8 0.75 0.75 0.75 0.75];
yy= [0.3 0.2 0.15 0.1 0.3 0.2 0.15 0.1 0.3 0.2 0.15 0.1 0.3 0.2 0.15 0.1 0.3 0.2 0.15 0.1];
zz= [0.1 0.15 0.2 0.3 0.1 0.15 0.2 0.3 0.1 0.15 0.2 0.3 0.1 0.15 0.2 0.3 0.1 0.15 0.2 0.3];
[x1,y1,z_surf]=scatt2surf(xx,yy,zz);
figure(3)
surf(x1,y1,z_surf);
xlabel('\it X');ylabel('\it Y');zlabel('\it Z');
colormap(hot)
hold on
scatter3(xx,yy,zz,[],zz,'o','filled','MarkerEdgeColor','none');
grid on;
function [x1,y1,z_surf]=scatt2surf(xx,yy,zz)
x1= unique(round(xx,7));
y1=unique(round(yy,7));
z_surf=ones(length(x1),length(y1));
for i=1:length(x1)
for j=1:length(y1)
indx=[xx==x1(i) & yy==y1(j)];
z_surf(i,j)=zz(indx);
end
end
z_surf=z_surf';
end