24

plot_surface コマンドを使用して、matplotlib の同じ軸に 2 つの 3D サーフェスをプロットしようとしています。

fig = plt.figure()
fig.figsize = fig_size
ax = fig.gca(projection='3d')

surf = ax.plot_surface(X, Y, Exp_Fric_map, alpha = 1, rstride=1, cstride=1, cmap=cm.winter, linewidth=0.5, antialiased=True)
surf = ax.plot_surface(X, Y, Fric_map, alpha = 1, rstride=1, cstride=1, cmap=cm.autumn,linewidth=0.5, antialiased=True)

私が抱えている問題は、プロットを表示するときに、たとえばプロットのように、常に正しいサーフェスが「上」にあるとは限らないことです:

プロット例

奥の隅 (200N、軸上で 2.5Hz) では、青緑色の表面が「上」ですが、実際には黄赤色が観察者に近づいています。プロットを回転すると:

2 番目のサンプル プロット

青緑色の表面は、200N および 2.5Hz の黄赤色の表面の下にあります (現在は左側にあります)。stackoverflow と Google を検索してみましたが、解決策に関する同様の問題は見つかりません。

LinuxでPython 2.7.3、Numpy 1.6.1、およびMatplotlib 1.1.1rcを使用しています。

4

5 に答える 5

11

絵を描くのと同じです。どちらが「上」になるかは、最後にどちらを描くかによって決まります。

プロパティを使用zorderして、サーフェスをペイントする順序を matplotlib に伝えることができます。

例えば:

ax.plot_surface(X, Y, Exp_Fric_map, alpha = 1, rstride=1, cstride=1, cmap=cm.winter, linewidth=0.5, antialiased=True, zorder = 0.5)
ax.plot_surface(X, Y, Fric_map, alpha = 1, rstride=1, cstride=1, cmap=cm.autumn,linewidth=0.5, antialiased=True, zorder = 0.3)

更新

いくつかのテストを実行しましたが、複数のサーフェスを 1 つの図にペイントする際の matplotlibのバグだと思います。たとえば、次のように、3D ワールドに存在しないはずのいくつかのサーフェスが作成されました。

ここに画像の説明を入力

、試してみても効果的な解決策がわかりません。私が言ったように、因果関係は描画の順序です: matplotlib は常に物事を 1 つずつ描画します。表面の一部が上にあり、別の部分が下にある場合、matplotlib はうまくいきません。

したがって、私の提案は、この問題への取り組みを停止することです。matplotlib に貢献したくない場合を除き、時間の無駄です。これを解決する必要がある場合は、別のプロットツールを見つけて仕事を終えることをお勧めします。

于 2012-12-18T12:23:03.780 に答える