0

surf を使用して描画された半球を含む 3D プロットがあり、scatter3 を使用してさらに多くのデータをプロットしようとしています。これは、scatter3 に渡すデータ セットに 2000 個以下のポイントが含まれている限り、問題なく機能します。点が 2000 を超える場合、scatter3 は何もプロットしません。surf の呼び出しを削除すると、scatter3 が機能してデータを描画します。

ホールドがオンになっていることを確認しました。surf と scatter3 の呼び出しの順序を逆にしましたが、影響はありませんでした。scatter3 から plot3 に切り替える必要がありますか (同様にここで提案されています)、または scatter3 に対して変更できる制限はありますか?

Matlab 2012b を使用しています。

編集:さらに掘り下げて、使用されているレンダラーを調べました。半透明の半球が表示されていない場合、レンダラーは「ペインター」ですが、半球を追加するとレンダラーが OpenGL に変更されます。レンダラーを強制的に「ペインター」にすると (set(gcf, 'Renderer', 'painters') を使用)、scatter3 は適切に機能しますが、半球の透明度が失われます。これは理にかなっていますが、実際には透明度が必要です。 scatter3 を使用してプロットされたデータは半球内にあります.レンダラーは各軸ではなく図全体を対象としているため、2 番目の軸を追加しても役に立ちません (右?)

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 を色としてサポートしていないようです。この次の例を 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 を同じ方法で場所として処理するように見えます。

うまくいけば、これは私がしたのと同じ問題に遭遇した人を助けるでしょう.

于 2013-09-09T21:12:07.440 に答える