0

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

我已经确认保持状态。我颠倒了对 surf 和 scatter3 的调用顺序,但它没有任何影响。我是否需要从 scatter3 切换到 plot3(此处建议类似)或者我可以为 scatter3 更改一些限制?

我正在使用 Matlab 2012b。

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

4

2 回答 2

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 渲染器如何显示 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 处理为位置。

希望这会帮助遇到与我相同的问题的人。

于 2013-09-09T21:12:07.440 回答
0

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

于 2013-09-05T22:58:38.423 回答