MATLAB:同时使用scatter3和mesh

时间:2013-09-05 22:22:37

标签: matlab plot

我有一个包含使用surf绘制的半球的3d图,我正在尝试使用scatter3绘制更多数据。只要我传递给scatter3的数据集包含不超过2000个点,这就可以正常工作。如果有超过2000个点,则scatter3不会绘制任何内容。如果我删除了对冲浪的调用,那么scatter3将工作并绘制数据。

我已经确认暂停。我颠倒了冲浪和散射3的调用顺序,但它没有任何影响。我是否需要从scatter3切换到plot3(类似于建议here)或者我可以为scatter3更改一些限制吗?

我正在使用Matlab 2012b。

编辑:我做了一些挖掘并研究了正在使用的渲染器。当我没有显示半透明半球时,渲染器是“画家”,但添加半球会将渲染器更改为OpenGL。如果我强制渲染器是“画家”(使用set(gcf,'Renderer','painters'),那么scatter3正常工作但我失去了半球的透明度。这是有道理的,但我真的需要透明度因为部分使用scatter3绘制的数据位于半球内。添加第二个轴无济于事,因为渲染器适用于整个图形,而不是每个轴(右图?)

2 个答案:

答案 0 :(得分:1)

不幸的是,我认为“解决方案”是Matlab中OpenGL渲染器中的一个错误。使用OpenGL渲染器时,如果颜色向量中的最后一个值为NaN,则Matlab将不会显示传递给scatter3的任何数据。但是,矢量中的其他值可以是NaN。只要最后一个值是非NaN,对scatter3支持的点数似乎没有限制。

此代码工作使用2001随机点调用scatter3:

myX = randi(300, 1, 2001)
myY = randi(300, 1, length(myX))
myZ = randi(300, 1, length(myX))
myColors = ones(1, length(myX))
[x,y,z] = sphere(10)

% Figure 1
figure
surf(x*50, y*50, z*50, 'FaceAlpha', 0.2, 'EdgeAlpha', 0.0, 'FaceColor', [1 0 0])
hold on
scatter3(myX, myY, myZ, 100, myColors, 'filled')

如果更改颜色矢量使最后一个值为NaN,则结果图不包含任何scatter3数据

myX = randi(300, 1, 2001)
myY = randi(300, 1, length(myX))
myZ = randi(300, 1, length(myX))
myColors = ones(1, length(myX))
[x,y,z] = sphere(10)

% Figure 1
figure
myColors = ones(1, length(myX))
myColors(1,length(myX)) = NaN;
surf(x*50, y*50, z*50, 'FaceAlpha', 0.2, 'EdgeAlpha', 0.0, 'FaceColor', [1 0 0])
hold on
scatter3(myX, myY, myZ, 100, myColors, 'filled')

OpenGL渲染器似乎也不像画家渲染器一样支持NaN作为颜色。如果逐行运行下一个示例,则可以看到OpenGL渲染器如何显示画家渲染器未显示的点。

myX = randi(300, 1, 10)
myY = randi(300, 1, length(myX))
myZ = randi(300, 1, length(myX))
myColors = ones(1, length(myX))
[x,y,z] = sphere(10)

% Figure 1
figure
myColors(1,1:5) = NaN;
scatter3(myX, myY, myZ, 100, myColors, 'filled')
get(gcf, 'Renderer')

% Figure 2
figure
myColors(1,1:5) = NaN;
scatter3(myX, myY, myZ, 100, myColors, 'filled')
get(gcf, 'Renderer')
hold on
surf(x*50, y*50, z*50, 'FaceAlpha', 0.2, 'EdgeAlpha', 0.0, 'FaceColor', [1 0 0])
get(gcf, 'Renderer')

我只是使用逻辑标记来设置根据颜色向量中的NaN值更新X向量中的值,而不是重写我的程序的大部分内容

myX(isnan(myColors)) = NaN

画家和OpenGL渲染器似乎以同样的方式处理NaN作为位置。

希望这能帮助遇到同样问题的人。

答案 1 :(得分:0)

您可以尝试在两个不同的轴中使用scatter3surf。第二个轴的属性Visible设置为off,两个轴的限制相同。