Matlab 3D绘图绘制奇怪的线条?

时间:2013-05-17 15:46:38

标签: matlab graph 3d plot line

我有3个数组X, Y, Z,看起来像这样:

x = [1, 1, 1, 2, 2, 2, 3, 3, 3]
y = [1, 2, 3, 1, 2, 3, 1, 2, 3]
z = [1, 2, 3, 2, 4, 6, 3, 6, 9]

然后我用plot3(x,y,z)绘制这些点。 然而,结果是意想不到的..它基本上意味着看起来像一个日志图,它做到这一点,但它也有额外的线。我不知道它是怎么发生的,也许这里有人可以启发我!

这是我的图表的一个示例(显然我已经为X, Y, Z绘制了我的值,上面的数组只是它们的样子的一个示例): image

正如你所看到的,底部曲线是我很高兴看到的对数线,但是上面出现的那条线让我感到困惑。我尝试显示符合以下模式的X Y Z值:X is between 110 and 120Y = 0.05。理论上,这应该为每个X提供两个匹配。即。在X = [110, 120]之间,我应该得到20个匹配,因为图表显示每个Y = 0.05X处有两条线。

为了更清楚地说明X的值是什么,它基本上是0.1的增量所以在X = 120X = 119之间,它正在绘制{{1} }。在任何情况下,只有119.0, 119.1, ... , 120.0的两个点在X, Z之间点击Y = 0.05

正如我所说,我检查了匹配119-120的{​​{1}}的值,并且每X, Z只返回一个结果。也就是说,对于Y = 0.05,只返回了10个匹配项。这些值是底线(即对数图线)的值和 NOT 的顶线。如此有效,这些线并不意味着存在。他们肯定会点击X并介于X = [110, 120]之间,所以他们应该出现在匹配之中..

所以你有它。不确定发生了什么! 如果有人可以提供帮助,那就太好了。

编辑 - 更多信息。 即使手动将Y = 0.05值放到返回X = [110, 120]的函数中,也永远不会达到上面一行的值。

感谢。

2 个答案:

答案 0 :(得分:2)

xyz的示例实际上很好地说明了您的问题。
您没有绘制单个曲线(每个对数图一个),而是绘制一条连续曲线。因此,额外行实际上是将日志曲线的一端连接到下一行的开头 你必须打破你的情节命令。

修改
最后,它需要了解您的数据集,但对于您在上面提供的xyz,这将生成三条独立曲线而不是一条:

x = [1, 1, 1, 2, 2, 2, 3, 3, 3];
y = [1, 2, 3, 1, 2, 3, 1, 2, 3];
z = [1, 2, 3, 2, 4, 6, 3, 6, 9];

DATASET_SIZE = 3;

hold on;

for i=1:size(x,2)/DATASET_SIZE

    plot3(x((i-1)*DATASET_SIZE+1:i*DATASET_SIZE),y((i-1)*DATASET_SIZE+1:i*DATASET_SIZE),z((i-1)*DATASET_SIZE+1:i*DATASET_SIZE));
    plot3(x(i*DATASET_SIZE+1:2*DATASET_SIZE),y(i*DATASET_SIZE+1:2*DATASET_SIZE),z(i*DATASET_SIZE+1:2*DATASET_SIZE));
    plot3(x(2*DATASET_SIZE+1:3*DATASET_SIZE),y(2*DATASET_SIZE+1:3*DATASET_SIZE),z(2*DATASET_SIZE+1:3*DATASET_SIZE));

    view(3)

end  

修改2

找出这个“问题”的简单方法是使用MATLAB绘图窗口中的Data Cursor。将其放在图表的任意位置,然后使用updown箭头键移动。如果您可以沿着图的整个长度移动,则它是一条连续的线。此外,你应该看到Cursor从一条曲线的“结束”跳到下一条曲线的“开始”。

答案 1 :(得分:0)

我使用surface(x,y,z)遇到了同样的问题,并通过更改渲染器解决了这个问题。 MATLAB有3种不同的渲染器用于绘制数据,默认情况下,openGL渲染器绘制如图所示。您可以使用GET(gcf)查看您的数字使用的hwich渲染器。您可以使用以下方式更改渲染器:set(gcf,' Renderer',' painters') 我认为第三个渲染器是zbuffer,也可以正常工作。