Python 3D绘图测量数据

时间:2013-12-18 21:30:33

标签: python 3d plot

我已经在球体上捕获了3D测量数据(这是一个天线辐射模式,因此测量天线从每个phi,θ方向捕获辐射强度,并将该值记录为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,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,我现在能够拥有一个phi,theta依赖“r”函数。 然而,注意到该示例现在确保phi和theta具有相同的长度(由于mgrid函数)。在我的测量中不是这种情况。当单独声明phi和theta并且具有不同尺寸时,它仍然不起作用。所以我现在将看一下测量插值。

1 个答案:

答案 0 :(得分:2)

这可能不是您正在寻找的确切答案,但如果您可以接受使用强度值作为颜色的映射,这应该有效。
实际上,你也可以在这里计算一个特定的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。所以你可以随意旋转,翻译,缩放。甚至交互式地操纵数据和表示选项。 Output of example script