Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
测量数据的Python三维绘图_Python_3d_Plot - Fatal编程技术网

测量数据的Python三维绘图

测量数据的Python三维绘图,python,3d,plot,Python,3d,Plot,我在一个球体上捕获了3D测量数据(这是一个天线辐射方向图,因此测量天线捕获了每个φθ方向的辐射强度,并将该值记录为φθ的函数) 我很难得到表示的数据。 我尝试了多种选择。这是我现在尝试的最后一个: import numpy as np from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt nElevationPoints = 16 nAzimuthPoints = 40 stepSizeRad = 0.0

我在一个球体上捕获了3D测量数据(这是一个天线辐射方向图,因此测量天线捕获了每个φθ方向的辐射强度,并将该值记录为φθ的函数)

我很难得到表示的数据。 我尝试了多种选择。这是我现在尝试的最后一个:

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”,而是与测量的辐射强度相对应。所以它需要是φθ的函数

但是,只要我将“r”函数更改为任何包含phi或θ参数的函数,就会得到一个关于无法广播的操作数的错误

如果有任何工作围绕着通过φ,θ循环,那也很好

但我现在陷入困境,所以我非常感谢任何帮助:-)

顺便说一句,我之所以采用上述方法,是因为我无法理解如何定义x,y,z,以使plot_曲面函数能够接受。 我确实通过计算φ、θ、强度数据的实际位置(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,我现在可以有一个φ,θ依赖的“r”函数。
但是,请注意,该示例现在确保φ和θ具有相同的长度(由于mgrid函数)。我的测量结果并非如此。当分别声明φ和θ以及不同维度时,它仍然不起作用。因此,我现在将研究测量插值。

这可能不是您想要的确切答案,但如果您可以接受使用强度值作为颜色的映射,这应该是可行的。
实际上,你也可以计算一个特定的r。但我没有对此进行测试。
使用mayavi,因为在我看来,它远远优于matplotlib for 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中。所以你可以随意旋转,平移,缩放。甚至可以交互操作数据和表示选项。

您可以看看numpy.fromfunc,它可以将一个函数转换为支持广播的函数。谢谢您的建议(我不知道这个函数),但它似乎没有帮助。只有当nElevationPoints等于nAzimuthPOints(在我的测量中并非如此)时,它才似乎有效。谢谢@M4rtini!但是,我找不到用于安装windows python 2.6的Mayavi库。我确实看到了一个巨大的200MB+可执行文件,包括Python2.7的和。您是否受到使用Python2.6的项目限制的限制?是的,实际上是这样(有些libs在2.6之后不可用)。然而,由于您的建议和我不断的碰壁,我选择了Canopy软件包(我自己无法在2.6版本下安装它…),现在有了Mayavi和Python2.7,稍后将看到我如何解决2.6库依赖关系;-)顺便说一句,我刚刚取得了一些好的进展,现在能够有一个“适当的”辐射图。我只需要在打印时查看“标量”选项即可影响打印中的颜色,因为现在它只依赖于z轴,而不应该依赖于z轴。谢谢你迄今为止的帮助!如果r表示测量值,则可以将标量设置为r。下面是一长串scipy必须提供的插值函数。interp2d或scipy.ndimage.map_坐标看起来是不错的选择。谢谢,这非常有效!没有你的帮助我可能做不到,非常感谢。我现在把一切都做得很顺心:-)