2013-03-25 62 views
0

我想創建一些電磁散射過程的遠場圖。matplotlib中的距離依賴着色

爲此,我計算了θ,φ和r值。座標θ和φ在unitphere上創建一個規則網格,所以我可以使用plot_Surfacefound here)轉換爲笛卡爾座標。

我現在的問題是,我需要一種方法來對半徑爲r而不是高度爲z的表面着色,這似乎是默認的。

有沒有辦法改變這種依賴?

+0

也許這有助於:http:// s tackoverflow.com/questions/6539944/color-matplotlib-plot-surface-command-with-surface-gradient/6543777#6543777 – Paul 2013-03-25 14:02:41

+0

我沒有注意到這種可能性。我試圖實現這一點。謝謝! – Stefan 2013-03-25 14:19:53

+0

也從Enthought中查看「mayavi」。它是一個不同的框架,但它是圍繞openGL構建的,所以在3D渲染方面做得更好。 – tacaswell 2013-03-25 15:14:20

回答

0

我不知道你是怎麼做的,所以也許你已經解決了它。但是,基於Paul評論的鏈接,你可以做這樣的事情。我們使用plot_surface的facecolor參數傳遞我們想要的顏色值。

(我已經從matplotlib文檔修改的surface3d演示)

編輯:正如斯蒂芬在他的評論中指出的那樣,我的回答可以簡化爲:

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

fig = plt.figure() 
ax = fig.gca(projection='3d') 
X = np.arange(-5, 5, 0.25) 
xlen = len(X) 
Y = np.arange(-5, 5, 0.25) 
ylen = len(Y) 
X, Y = np.meshgrid(X, Y) 
R = np.sqrt(X**2 + Y**2) 
maxR = np.amax(R) 
Z = np.sin(R) 

# Note that the R values must still be normalized. 
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=cm.jet(R/maxR), 
     linewidth=0) 

plt.show() 

和(結束)我不必要的複雜的原始版本,使用與上面相同的代碼,但省略matplotlib.cm導入,

# We will store (R, G, B, alpha) 
colorshape = R.shape + (4,) 
colors = np.empty(colorshape) 
for y in range(ylen): 
    for x in range(xlen): 
     # Normalize the radial value. 
     # 'jet' could be any of the built-in colormaps (or your own). 
     colors[x, y] = plt.cm.jet(R[x, y]/maxR) 

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors, 
     linewidth=0) 

plt.show() 
+1

謝謝!這基本上是我所做的。但是我直接通過'plot_surface'中的'facecolors = cm.jet(rdata)'使用半徑。 – Stefan 2013-03-27 12:43:14

+0

啊,當然!更乾淨。在我的回答中,我會在其他人身上發現這一點。 – Sam 2013-03-27 14:56:49