2013-12-18 129 views
1

我已經捕獲了一個球體上的三維測量數據(這是一個天線輻射模式,所以測量天線從每個phi,theta方向捕獲輻射強度並將該值記錄爲phi的函數, THETA)。測量數據的Python三維繪圖

我很難獲取所代表的數據。 我試過了多個選項。這是我現在嘗試的最後一個:

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

nElevationPoints = 16 
nAzimuthPoints = 40 
stepSizeRad = 0.05 * np.pi 
def r(phi,theta): 
    radius = 1 
    return radius 

phi = np.arange(0,nAzimuthPoints*stepSizeRad,stepSizeRad) 
theta = np.arange(0,nElevationPoints*stepSizeRad,stepSizeRad) 

x = (r(phi,theta)*np.outer(r(phi,theta)*np.cos(phi), np.sin(theta))) 
y = (-r(phi,theta)*np.outer(np.sin(phi), np.sin(theta))) 
z = (r(phi,theta)*np.outer(np.ones(np.size(phi)), np.cos(theta))) 

fig = plt.figure(1) 
ax = fig.add_subplot(111, projection='3d') 
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='b') 

plt.ioff() 
plt.show() 

這段代碼本身正在工作,它繪製了一個球體。現在的事情是,根據測量數據,我實際上需要的半徑不是常數「1」,而是與測得的輻射強度相對應。所以它需要是phi,theta的函數。

但是,只要將「r」函數更改爲包含phi或theta參數的任何內容,就會收到有關無法廣播的操作數的錯誤。

如果有任何解決方法可以通過phi循環,theta也是完美的。

但現在我卡住了,所以我會很感激:-)

任何幫助順便說一句,我去上面的方法的原因是因爲我沒有任何意義的是如何在x,y, z應該被定義爲可以被plot_surface函數接受。 我確實設法通過計算phi,theta,強度數據的實際位置(x,y,z)來生成散點圖,但這只是單個點的表示,並且不會產生任何良好可見的天線輻射模式情節。爲此,我假設等值線圖會更好,但是我又陷入了「r」函數調用或理解x,y,z應該如何格式化(文檔指的是x,y,z需要是二維數組,但這超出了我的理解,因爲x,y,z通常都是一維數組)。

無論如何,期待任何人可能願意給予的幫助。

- 編輯 -

隨着@ M4rtini的修改建議我得出如下:

import numpy as np 
from mayavi import mlab 

def r(phi,theta): 
    r = np.sin(phi)**2 
    return r 


phi, theta = np.mgrid[0:2*np.pi:201j, 0:np.pi:101j] 

x = r(phi,theta)*np.sin(phi)*np.cos(theta) 
y = r(phi,theta)*np.sin(phi)*np.sin(theta) 
z = r(phi,theta)*np.cos(phi) 

intensity = phi * theta 

obj = mlab.mesh(x, y, z, scalars=intensity, colormap='jet') 
obj.enable_contours = True 
obj.contour.filled_contours = True 
obj.contour.number_of_contours = 20 
mlab.show() 

這工作,謝謝,@ M4rtini,而我現在能夠有一個披,theta依賴「r」功能。 然而,注意到這個例子現在確保phi和theta長度相同(由於mgrid函數)。在我的測量中,情況並非如此。當分別和不同維度地聲明phi和theta時,它仍然不起作用。所以我現在將看看測量插值。

+0

你可以看看numpy。fromfunc,它可以將功能轉換爲支持廣播的功能。 – M4rtini

+0

感謝您的建議(我不知道這個功能),但它似乎沒有幫助。如果nElevationPoints等於nAzimuthPOints(這在我的測量中不是這樣),它似乎只能工作。 – niels

回答

2

這可能不是您正在尋找的確切答案,但是如果您可以接受使用強度值作爲顏色的映射,則應該起作用。
其實,你也可以在這裏計算一個特定的r。但我沒有測試。
使用mayavi,因爲在我看來,它比3D的matplotlib優越。

import numpy as np 
from mayavi import mlab 
r = 1.0 
phi, theta = np.mgrid[0:np.pi:200j, 0:2*np.pi:101j] 

x = r*np.sin(phi)*np.cos(theta) 
y = r*np.sin(phi)*np.sin(theta) 
z = r*np.cos(phi) 

intensity = phi * theta 

obj = mlab.mesh(x, y, z, scalars=intensity, colormap='jet') 
obj.enable_contours = True 
obj.contour.filled_contours = True 
obj.contour.number_of_contours = 20 
mlab.show() 

示例腳本的輸出,現在在一個交互式gui中。所以你可以旋轉,翻譯,按比例縮放。甚至可以交互式操作數據和表示選項。 Output of example script

+0

謝謝@ M4rtini!雖然我無法爲我的windows python 2.6安裝找到Mayavi lib。我看到一個巨大的200MB +可執行文件,包括python 2.7。 – niels

+0

您受限於使用Python 2.6的項目限制嗎? – M4rtini

+0

是的,我實際上(有些庫在2.6以後不可用)。但是,由於你的建議和我繼續碰撞到牆上,我只選擇了Canopy包(無法在2.6以下安裝它),現在有了Python2.7的Mayavi,並將看到我如何解決2.6 lib依賴關係後來;-) 順便說一句,我剛剛取得了一些很好的進展,現在我能夠有一個「適當的」輻射情節。當繪圖影響繪圖中的顏色時,我只需要查看「標量」選項,因爲現在它只有z軸相關而不應該是。感謝您一直以來的幫助! – niels