我有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
绘制了我的值,上面的数组只是它们的样子的一个示例):
正如你所看到的,底部曲线是我很高兴看到的对数线,但是上面出现的那条线让我感到困惑。我尝试显示符合以下模式的X Y Z
值:X is between 110 and 120
和Y = 0.05
。理论上,这应该为每个X
提供两个匹配。即。在X = [110, 120]
之间,我应该得到20个匹配,因为图表显示每个Y = 0.05
点X
处有两条线。
为了更清楚地说明X
的值是什么,它基本上是0.1
的增量所以在X = 120
和X = 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]
的函数中,也永远不会达到上面一行的值。
感谢。
答案 0 :(得分:2)
x
,y
和z
的示例实际上很好地说明了您的问题。
您没有绘制单个曲线(每个对数图一个),而是绘制一条连续曲线。因此,额外行实际上是将日志曲线的一端连接到下一行的开头
你必须打破你的情节命令。
修改强>
最后,它需要了解您的数据集,但对于您在上面提供的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];
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
。将其放在图表的任意位置,然后使用up
或down
箭头键移动。如果您可以沿着图的整个长度移动,则它是一条连续的线。此外,你应该看到Cursor
从一条曲线的“结束”跳到下一条曲线的“开始”。
答案 1 :(得分:0)
我使用surface(x,y,z)遇到了同样的问题,并通过更改渲染器解决了这个问题。 MATLAB有3种不同的渲染器用于绘制数据,默认情况下,openGL渲染器绘制如图所示。您可以使用GET(gcf)查看您的数字使用的hwich渲染器。您可以使用以下方式更改渲染器:set(gcf,' Renderer',' painters') 我认为第三个渲染器是zbuffer,也可以正常工作。