簡體   English   中英

Python 3D測量數據繪圖

[英]Python 3D plotting of measurement data

我已經在球體上捕獲了3D測量數據(這是天線的輻射方向圖,因此測量天線捕獲了每個phi,θ方向的輻射強度,並將該值記錄為phi,θ的函數)。

我很難獲得表示的數據。 我嘗試了多種選擇。 這是我現在要嘗試的最后一個:

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,θ,強度數據計算實際位置(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,它可以工作,而且我現在可以使用依賴於phi,theta的“ r”函數。 但是,請注意,該示例現在確保phi和theta的長度相同(由於mgrid函數)。 在我的測量中情況並非如此。 當分別聲明phi和theta且具有不同的尺寸時,它仍然無法正常工作。 現在,我將介紹測量插值。

這可能不是您想要的確切答案,但是如果您可以接受使用強度值作為顏色映射,則應該可以使用。
實際上,您可能也可以在此處計算特定的r。 但是我沒有測試。
我認為使用mayavi是因為它比3p的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中。 因此您可以隨意旋轉,平移,縮放。 甚至以交互方式操作數據和表示選項。 示例腳本的輸出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM