【问题标题】:Surface plot with 3 vectors Matlab具有 3 个向量的曲面图 Matlab
【发布时间】:2015-12-12 01:51:51
【问题描述】:

我需要能够使用来自 3 个向量的数据来绘制曲面图。我找到了类似的信息,但似乎没有任何方法适用于我的数据。我的 X 和 Y 列是均匀分布的,但不是按递增顺序排列的。我尝试了不同的方法,但似乎都没有给我想要的东西,这是一个简单的曲面,将近点连接在一起。我尝试了以下方法:

[X Y]=meshgrid(x,y);
Z=griddata(x,y,z, X,Y);
surf(X,Y,Z);

这并不完全是我想要的,因为它在 z=0 处创建了一个曲面,使它看起来更像是一个体积图,而不仅仅是一个曲面。它在我的电脑上运行也很慢(可能是因为创建了所有的网格点)。如果我能得到不需要太多内存的东西,那将是理想的(我的向量每个都有大约 20k 个值),但这不是必需的。

***编辑:我也尝试使用找到here的scatterInterpolant方法,但MATLAB似乎无法识别该函数,我收到此错误:

Undefined function 'scatteredInterpolant' for input arguments of type 'double'.

这也是我的问题的图像:

你可以看到我们在地表下看不到,有一些 z=0 平面挡住了它。

如果您有什么要给我的,我们将不胜感激。

提前致谢。

**编辑 2:我添加了示例 vectors,它们是我从左到右的 x、y 和 z 值。

***编辑 3:这是我得到的三角测量的图像。正如您所看到的,由于某种原因,某些点被忽略了,从而产生了那些看起来很长且看起来很奇怪的蓝色三角形。

迈克

【问题讨论】:

  • Z(~Z)=NaN 有帮助吗?或者,如果您使用 doc griddata 中所述的不同 method 怎么办?否则请发布一些示例代码和向量以完全复制问题。
  • @DennisJaheruddin 当我执行 Z(~Z)=NaN 时,我得到一个 flatter bottom 但我仍然无法看穿它,它会关闭它并形成一个卷。我的向量很大,我会尝试找到一种方法来链接它们。
  • 您确定您的数据实际上不包含绘制的低值吗? x 和 y 值在 0.8 和 1.2 之间时的最小 z 是多少?另外,不要忘记尝试不同的 griddata 选项。
  • @DennisJaheruddin 是的,在做散点图的时候,我们可以清楚地看到曲面下没有点。我尝试了griddata中的所有方法,它们看起来都很相似。有没有办法不使用网格来做到这一点?如果它们彼此足够接近,是否没有仅查看分散点并尝试将它们与表面链接的选项?网格会使边缘呈正方形,这并不是很理想/ delaunay 方法几乎可以实现这一点,但三角剖分似乎存在错误,这会产生奇怪的链接、颜色和相同的 z=0 平面问题。

标签: matlab vector plot


【解决方案1】:

由于传统方法似乎失败,我建议您手动进行。

  1. 创建一个充满NaN 值的Z 矩阵。矩阵的大小应取决于您的 xy 值。
  2. 循环所有出现的x,y 对,并将它们的(平均?)z 值放在Z 矩阵的正确位置。
  3. 循环所有NaN 值并插入它们的值。也许使用filter2
  4. 使用surf 绘制结果曲面

【讨论】:

  • 感谢您的回答。我真的不太明白,你是什么意思“把他们的z值放在正确的位置”?我的向量 x,y,z 已经排序,使得 (x(i),y(i),z(i)) 形成我想要绘制的点(散点图工作正常)。另外,如果 NaN 值没有定义上的值,如何插值?再次感谢,非常感谢。
  • @MikeNelson 我想说的是:griddata 方法生成一个由出现值和插值组成的Z 矩阵。尝试以某种方式自己创建这个矩阵。也许只从出现的值开始,然后进行自己的插值。
【解决方案2】:

如果您有由向量描述的点,并且您想绘制它们,您总是可以使用 Delauny 三角剖分。 matlab 中的函数称为Tri=delauny(X,Y,Z)。此函数生成的数据可以用trimesh(Tri,X,Y,Z)trisurf(Tri,X,Y,Z) 显示。请记住,trisurf 仅适用于 3D 数据。如果您想调整图表中图表的透明度,请使用alpha 设置。

希望对你有帮助

【讨论】:

  • 在我的数据上尝试了 trimesh 之后,我得到了一些看起来像 this 的东西。我们可以看到从表面下方穿过的线条。 trisurf 看起来不错,但从我在 trimesh 中看到的线条来看,我猜我仍然在 z=0 处得到那架飞机。
  • 对不起,我的回复很慢,我周末出去了。如果我理解正确,您希望摆脱 z=0 平面中的三角形。这可以通过识别哪些三角形描述该区域来轻松完成。 trisurf 命令可以选择用矢量(我们在帮助中将其称为 C)trisurf(Tri,X,Y,Z,C) 为特定三角形着色。使用 C,您可以四处走动并识别特定的三角形。确定后,创建一个新数组 Tri2,它与 Tri 相同,但没有违规三角形。然后做 trisurf(Tri2,X,Y,Z)。这有点笨拙,但很难预测三角形
  • 另一种更通用的方法是编写一个算法来测试每个三角形的每个顶点的 z 分量。如果所有顶点的 z 分量 = 0,则它描述了 z=0 平面并且可以被移除。
【解决方案3】:

在我看来,您只需要在绘图之前对数据进行排序即可。

这是一个我认为与您的情况相似的示例(因为我无法下载您的数据)。

x = [2 1 4 3 -1 -3 -4 -2];
y = [1 2 3 4 -1 -2 -3 -4];
z = 32 - x.*x - y.*y;

[X1 Y1] = meshgrid(x,y);
Z1 = 32 - X1.*X1 -Y1.*Y1; 
surf(X1,Y1,Z1)

aux = sort([x;y],2);
x = aux(1,:);
y = aux(2,:);

[X2 Y2] = meshgrid(x,y);

Z2 = 32 - X.*X - Y.*Y;
figure()
surf(X2,Y2,Z2)

第一个图导致了一个非常有问题的表面:

第二个数字包含所需的表面:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多