我已經捕獲了一個球體上的三維測量數據(這是一個天線輻射模式,所以測量天線從每個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時,它仍然不起作用。所以我現在將看看測量插值。
你可以看看numpy。fromfunc,它可以將功能轉換爲支持廣播的功能。 – M4rtini
感謝您的建議(我不知道這個功能),但它似乎沒有幫助。如果nElevationPoints等於nAzimuthPOints(這在我的測量中不是這樣),它似乎只能工作。 – niels