2016-04-12 10 views
4

私は答えを探していましたが、私のコードでは投影された輪郭がサーフェスの後ろに現れないのが分かりません。matplotlibのサーフェスの前に輪郭を表示

from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 
from matplotlib import cm 
from mpl_toolkits.mplot3d import Axes3D 
import numpy as np 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
X = np.array([[200,800,1500,2000,3000],[200,700,1500,2000,3000],[200,800,1500,2000,3000],[200,800,1500,2000,3000]]) 
Y = np.array([[50,50,50,50,50],[350,350,350,350,350],[500,500,500,500,500],[1000,1000,1000,1000,1000]]) 
Z = np.array([[0,0,33,64,71],[44,62,69,74,76],[59,67,72,75,77],[63,68,73,76,77]]) 

ax.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.5) 
cset = ax.contourf(X, Y, Z, zdir='z', offset=0, cmap=cm.coolwarm) 
cset = ax.contourf(X, Y, Z, zdir='x', offset=200, cmap=cm.coolwarm) 
cset = ax.contourf(X, Y, Z, zdir='y', offset=1000, cmap=cm.coolwarm) 

ax.set_xlabel('X') 
ax.set_xlim(200, 3000) 
ax.set_ylabel('Y') 
ax.set_ylim(0, 1000) 
ax.set_zlabel('Z') 
ax.set_zlim(0, 100) 

plt.show() 

私はテンプレートとして、このページから塗りつぶし等高線プロットのいずれかを使用されています:http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#scatter-plots

現時点では私が得ることができる最高のは、輪郭のアルファ値を変更することでした。私はまた輪郭の後に表面をプロットしようとしましたが、それは何も変化しませんでした。

アドバイスは大歓迎です!

+0

あなたのコードは実行されません: '不明な投影 '3d'' – Chiel

+1

このmweを動作させるために' mpl_toolkits.mplot3dからAxes3Dをインポートしました'を追加しました。 – WWhisperer

+0

謝罪...私は質問を編集しました。 – Sorade

答えて

2

問題はmatplotlibでよく知られているbug/missing featureです。引用してくださいa co-lead developer of matplotlib

私はそれがすべてハックのビットとしてプロットするすべてのことを理解しています。

この問題は、隣接するブロックの表面が完全に他のものよりも完全に後ろにあるように連続してプロットされていることから始まります。これは、任意の2つのオブジェクトが特定の角度からのみ適切に描画されることを意味し、合理的な角度で適切な順序ですべてのオブジェクトを描画するという保証はありません。

一つのさまざまなオブジェクトのためのzorderプロパティを設定すると、結果に影響を与える可能性があると思うだろうが、this is not the case

分割までのプロットは、「上記」と「以下の」一部に決定されることがあるので、難解なものを道

in other words

Axes3DはZORDERを無視し、ために芸術家を描きます彼らはそうすべきだと思う。

これは、そのようなときplotting text with surfacesplotting complicated surfaces、あるいはplotting 3d bar plots(1は、それが1つの関数呼び出し内の描画順序を決定する方が簡単だということが期待できるにもかかわらず)などの3Dプロット、のすべての種類で現れます。

単一のコマンドでプロットされたサーフェス(つまり、単一のPoly3DCollectionを含むサーフェス)の場合は、set_zsort()メソッドを使用して、好ましいプロット順序についてmatplotlibに非常に粗いヒントを与えることができます。これ以外に、あなたの唯一の選択肢は、問題が見えないように、あるいは少なくとも完全にはっきりとは見えないように、あなたのサーフェスや視野角を(できるだけ)動かすことです。 @tcaswellによって提案された別のオプションは、mplot3dの代わりにto use mayaviです(しかし、私は決してそれをやっていません)。

関連する問題