MATLAB 从 scatter3 数据绘制 3D 曲面图

3
我想在同一张图上绘制一个三维散点图和一个曲面图,最终效果如下图所示: enter image description here 我认为下面的代码可以实现我的需求,但显然没有成功。我有xyz数据要绘制一个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)

有什么想法吗?谢谢。

这个漂亮的pgfplots-plot生成的可能是你的数据的双三次插值。这是可能的,因为点是作为正则网格的一部分给出的。个人认为,如果你的文档已经是LaTeX格式的话,应该使用pgfplots而不是MATLAB。 - knedlsepp
2个回答

3
问题在于surf将您的矩阵p视为一个由z值组成的2D数组,其中x和y的值为整数。幸运的是,surf有多种输入值的方法(请参见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坐标上,则可以将xr替换为[1, 0.95, 0.85, 0.8, 0.75],yr替换为[0.3, 0.2, 0.15, 0.1],然后surf会为您转换它们成为数组。

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

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接