2011-06-30 5 views
15

MATLABからsurfコマンドをmatplotlibのplot_surfaceコマンドに変換したいと思います。カラーmatplotlib plot_surfaceコマンド(サーフェスグラデーションあり)

cmapの機能をplot_surfaceコマンドで使用すると、グラデーションを使用してサーフェスを色付けすることができます。ここで

は、このようなコマンドからの図は、ここで見つけることができMATLABスクリプト

% Matlab Commands 
x = -5:.25:5; y = x 
[x,y] = meshgrid(x); 
R = sqrt(x.^2 + y.^2); 
Z = sin(R) 
surf(x,y,Z,gradient(Z)) 

です。 pythonを使用して、私はグラデーションで表面を色付けすることができません同様の機能を作成するために、matplotlibの場合はここで

(http://www.mathworks.com/help/techdoc/visualize/f0-18164.html#f0-46458)のpythonザ・スクリプト です。

Traceback (most recent call last): 
    File "<ipython console>", line 1, in <module> 
    File "C:\Python26\lib\site-packages\spyderlib\widgets\externalshell\startup.py", line 122, in runfile 
    execfile(filename, glbs) 
    File "C:\Documents and Settings\mramacha\My Documents\Python\Candela\tmp.py", line 13, in <module> 
    surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=gradient(Z), linewidth=0, antialiased=False) 
    File "C:\Python26\lib\site-packages\mpl_toolkits\mplot3d\axes3d.py", line 729, in plot_surface 
    polyc = art3d.Poly3DCollection(polys, *args, **kwargs) 
    File "C:\Python26\lib\site-packages\mpl_toolkits\mplot3d\art3d.py", line 344, in __init__ 
    PolyCollection.__init__(self, verts, *args, **kwargs) 
    File "C:\Python26\lib\site-packages\matplotlib\collections.py", line 570, in __init__ 
    Collection.__init__(self,**kwargs) 
    File "C:\Python26\lib\site-packages\matplotlib\collections.py", line 86, in __init__ 
    cm.ScalarMappable.__init__(self, norm, cmap) 
    File "C:\Python26\lib\site-packages\matplotlib\cm.py", line 155, in __init__ 
    self.cmap = get_cmap(cmap) 
    File "C:\Python26\lib\site-packages\matplotlib\cm.py", line 126, in get_cmap 
    if name in cmap_d: 
TypeError: unhashable type: 'list' 

どれ入力は参考になる:

# Python-matplotlib Commands 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
X = np.arange(-5, 5, 0.25) 
Y = np.arange(-5, 5, 0.25) 
X, Y = np.meshgrid(X, Y) 
R = np.sqrt(X**2 + Y**2) 
Z = np.sin(R) 
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=gradient(Z), linewidth=0, antialiased=False) 
plt.show() 

は、私は、次のエラーメッセージが表示されます。あなたは勾配の大きさからマッピングされた色をしたいよう

Praboo

答えて

38

まず、それが見えます。グラデーションベクトルを使用しようとしています。そのため、「リスト」エラーが発生しています。

第2に、cmapを指定できますが、Z値をどのように色にマッピングするかを定義するだけです。新しい顔色が必要な場合は、facecolors argumentを使用してください。

第3に、値を0..1に正規化してから、カラーマップにマッピングします。

# Python-matplotlib Commands 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
X = np.arange(-5, 5, .25) 
Y = np.arange(-5, 5, .25) 
X, Y = np.meshgrid(X, Y) 
R = np.sqrt(X**2 + Y**2) 
Z = np.sin(R) 
Gx, Gy = np.gradient(Z) # gradients with respect to x and y 
G = (Gx**2+Gy**2)**.5 # gradient magnitude 
N = G/G.max() # normalize 0..1 
surf = ax.plot_surface(
    X, Y, Z, rstride=1, cstride=1, 
    facecolors=cm.jet(N), 
    linewidth=0, antialiased=False, shade=False) 
plt.show() 

そして結果:

enter image description here

+0

ファンタスティックここでコードがあります(私は別の方法があると思いますが、最大でマグニチュードを分割することは非常に簡単です)

。ありがとうポール。 – praboo

+0

カラーマップの変更を反映するために、このプロットにどのようにカラーバーを追加しますか? – praboo

+2

@praboo ScalarMappableをインスタンス化する必要があります。これは興味深い重要な話題であり、これが別の質問として導入された場合、コミュニティは十分に役立つだろう。 – Paul

関連する問題