残念ながら、「解決策」は 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 を色としてサポートしていないようです。この次の例を 1 行ずつ実行すると、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 を同じ方法で場所として処理するように見えます。
うまくいけば、これは私がしたのと同じ問題に遭遇した人を助けるでしょう.