我在一个球体上捕获了三维测量数据(这是一个天线辐射方向,所以测量天线从每个phi,theta方向捕获辐射强度,并记录这个值作为phi,theta的函数)。
我很难把数据表示出来。我尝试过多种选择。这是我最后一次尝试:
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,θ的函数。
但是,一旦我将"r“函数更改为包含phi或theta参数的任何内容,我就会得到一个关于不能广播的操作数的错误。
如果有任何关于通过phi循环的工作,θ也会很好。
但是我现在被困住了,所以我很感激你的帮助:-)
顺便说一句,我之所以选择上述方法,是因为我无法理解如何定义x,y,z,以便被plot_surface函数接受。我从phi,theta,强度数据中计算出了实际位置(x,y,z),从而生成了一个散点图,但这只是一个由各个点表示的,并不能生成任何可见的天线辐射方向图。为此,我假设等高线图会更好,但我还是被"r“函数调用所困,或者理解如何格式化x、y、z(文档指的是x、y、z需要是2D数组,但这超出了我的理解范围,因为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,θ相关的"r“函数。但是,注意到该示例现在确保phi和theta具有相同的长度(由于mgrid函数)。在我的测量中,情况并非如此。当分别声明phi和θ时,它不再工作了。现在我来看一看测量插值。
发布于 2013-12-18 22:43:36
这可能不是您想要的确切答案,但如果您可以接受使用强度值作为颜色的映射,这应该是可行的。
实际上,你也可以在这里计算出一个特定的r。但我没试过。
使用mayavi,因为在我看来,它比matplotlib在3D上要好得多。
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。所以你可以随意旋转,平移,缩放。甚至可以交互地操作数据和表示选项。

https://stackoverflow.com/questions/20668818
复制相似问题