首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测量数据的Python3D绘图

测量数据的Python3D绘图
EN

Stack Overflow用户
提问于 2013-12-18 21:30:32
回答 1查看 3.6K关注 0票数 1

我在一个球体上捕获了三维测量数据(这是一个天线辐射方向,所以测量天线从每个phi,theta方向捕获辐射强度,并记录这个值作为phi,theta的函数)。

我很难把数据表示出来。我尝试过多种选择。这是我最后一次尝试:

代码语言:javascript
复制
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建议的更改,我得出如下结论:

代码语言:javascript
复制
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和θ时,它不再工作了。现在我来看一看测量插值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-18 22:43:36

这可能不是您想要的确切答案,但如果您可以接受使用强度值作为颜色的映射,这应该是可行的。

实际上,你也可以在这里计算出一个特定的r。但我没试过。

使用mayavi,因为在我看来,它比matplotlib在3D上要好得多。

代码语言:javascript
复制
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。所以你可以随意旋转,平移,缩放。甚至可以交互地操作数据和表示选项。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20668818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档