MATLAB:同时使用scatter3和mesh

MATLAB:同时使用scatter3和mesh,matlab,plot,Matlab,Plot,我有一个3d绘图,其中包含一个使用surf绘制的半球,我正在尝试使用scatter3绘制更多数据。只要我传递给scatter3的数据集包含的点不超过2000点,这就可以正常工作。如果有超过2000个点,则scatter3不会绘制任何内容。如果我删除了对surf的调用,那么scatter3将工作并绘制数据 我已经核实了等待时间。我颠倒了呼叫冲浪和散射的顺序,但没有任何影响。我是否需要从scatter3切换到plot3(建议类似),或者我是否可以更改scatter3的某些限制 我正在使用Matlab

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

我已经核实了等待时间。我颠倒了呼叫冲浪和散射的顺序,但没有任何影响。我是否需要从scatter3切换到plot3(建议类似),或者我是否可以更改scatter3的某些限制

我正在使用Matlab2012b


编辑:我做了一些进一步的挖掘,并查看了正在使用的渲染器。当我没有显示半透明半球时,渲染器是“画师”,但添加半球会将渲染器更改为OpenGL。如果我强制渲染器为“painters”(使用set(gcf,'renderer','painters'))然后scatter3可以正常工作,但我失去了半球上的透明度。这是有道理的,但我确实需要透明度,因为使用scatter3绘制的部分数据位于半球内。添加第二个轴不会有帮助,因为渲染器用于整个图形,而不是每个轴(对吗?)

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

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

此代码使用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作为与painters渲染器相同的颜色。如果逐行运行下一个示例,您可以看到OpenGL渲染器如何显示painters渲染器未显示的点

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作为位置


希望这将有助于遇到与我相同问题的人。

这听起来更像是一个评论,而不是对我的回答。@Schorsch对不起,我不明白这一点。它完全解决了问题(因为我无法复制它并测试解决方案,所以没有解决它-顺便说一句,网上其他地方没有提到这种错误)。问题是:当一起绘制时,“散布>2000”显示为空白。建议的解决方案是:在两个单独的轴上拆分重叠(顶部散布)。这不是注释,而是两行答案。相反,我读了很多应该是答案的注释().我认为你对这个错误的看法是正确的,因为我也经历了同样的事情。直到我将矩阵中的最后一个值设置为none nan值,OpenGL才绘制任何东西。但是我现在没有得到你关于如何使颜色向量中的nan不可见的解决方案?nan显然映射到最低值的颜色。。