不幸的是,我认为“解决方案”是 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 处理为位置。
希望这会帮助遇到与我相同的问题的人。