2017-02-13 9 views
-1

3Dポリゴンにカラーマップを適用しようとしています。 多角形がきれいで、正しい位置に表示されます。 私ができないのは、グラデーションで塗りつぶすことだけです。ここで3Dマットプリティブプロットの三角形をカラーグラデーションで塗りつぶす

は私のコードです:

import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.colors import LinearSegmentedColormap 
from mpl_toolkits.mplot3d.art3d import Poly3DCollection 

fig = plt.figure() 
ax = Axes3D(fig) 

x = [0,0,0] 
y = [0,1,0] 
z = [0,0,1] 
verts = [zip(x, y,z)] #(0,0,0) (0,1,0) (0,0,1) 

colors = ['red', 'gray', 'gray', 'green'] 
index = [0.0, 0.49, 0.509, 1.0] 
cm = LinearSegmentedColormap.from_list('my_colormap', zip(index, colors)) 

collection = Poly3DCollection(verts, cmap=cm) 
ax.add_collection3d(collection) 
plt.show() 

誰かが、私を助けてくださいことはできますか?

EDIT:

また、コレクションのすべてのメンバーにのみ、それに関連付けられた単一の色を持つことができるので、勾配がthis

+0

カラーマップは、色を番号にマッピングします。ここにはどの番号を入力しますか?あなたは何を達成しようとしていますか? – ImportanceOfBeingErnest

+0

コードを実行すると、青色の三角形が表示されます。代わりに、この三角形をグラデーションで塗りつぶしてください。グラデーションは私のコードで定義されたものです –

+0

カラーマップはあなたのコードで定義されていますが、カラーマップにマップする値はありません。いずれの場合でも、ここでは単一のメンバー(三角形)を持つコレクションを作成し、この単一のメンバーは単一の色を持ちます。 – ImportanceOfBeingErnest

答えて

0

のようになります、あなたは、単にグラデーション塗りを達成するために三角形を使用することはできません。

三角形の勾配を取得する方法の1つは、plt.contourfを使用することです。ここで

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

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

X, Y = np.meshgrid(np.linspace(0,1), np.linspace(0,1)) 
Z = 1.-X-Y 
Z[Z<0] = 0 

cset = ax.contourf(X, Y, Z, zdir='x', levels=np.linspace(0,1),offset=0, cmap=plt.cm.jet) 
ax.set_xlabel('X') 
ax.set_xlim(0, 1) 
ax.set_ylabel('Y') 
ax.set_ylim(0,1) 
ax.set_zlabel('Z') 
ax.set_zlim(0,1)  
plt.show() 

enter image description here

contourfの使用は、ハッキングのビットです。他の方向のグラデーションを得るには、サーフェスプロット(plot_surface)を使用する方が良いでしょう。

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

fig = plt.figure() 
ax = fig.gca(projection='3d') 
points=50 
Y, Z = np.meshgrid(np.linspace(0,1,points), np.linspace(0,1,points)) 
Z = Z*(1-Y) 
color =(1-Y+Z)*0.5 

ax.plot_surface(np.zeros_like(Y), Y, Z, facecolors=plt.cm.jet(color), 
       rcount=points, ccount=points, shade=False) 

ax.set_xlabel('X') 
ax.set_xlim(0, 1) 
ax.set_ylabel('Y') 
ax.set_ylim(0,1) 
ax.set_zlabel('Z') 
ax.set_zlim(0,1)  
plt.show() 

スムーズな画像を得るために、あなたはpointsを増やすことができ、これもかなりの時間を描く増加することができます。

enter image description here

+0

それはまさに私が探していたものでした。大変ありがとう@ImportanceOfBeingErnest –

+0

いつものように、これがあなたの質問に答えるなら、[回答を受け入れる](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)を考えてみてください。そうでない場合は、誰かがより良い答えを出すための要件を絞り込んでください。 – ImportanceOfBeingErnest

+0

さらにもう1つは、グラデーションを「回転」することです。私は、他の "方向"にグラデーション "スライス"を持っていることを意味します –

関連する問題