使用Python绘制3D笛卡尔坐标系网格

4
我刚开始学习Python,在尝试绘制图形时遇到了问题。
我有一组大约42000个点,具有X-Y-Z坐标和几个相关变量(温度、含水量...)。我想在一个图中绘制所有这些东西,但是在我的Python知识水平下似乎不可能。所有这些点都位于笛卡尔正则网格上。因此,我想使用numpy生成一个meshgrid网格,但我卡住了。基本上,我想将1D向量(比如X、Y、Z和T)转换为带有插值数据的3D网格。这可能吗?
你能帮帮我吗?

你可以使用Mayavi。类似于这样的代码 from mayavi import mlab pts = mlab.points3d(x, y, z, s)。更多信息请参考这里:http://docs.enthought.com/mayavi/mayavi/mlab.html - chase
1
这听起来像是一个VTK问题。可以使用mayavi或ParaView解决。mayavi具有GUI和Python脚本前端以连接VTK,paraview仅提供GUI。如果你想成为真正的可视化专家,可以使用C ++中的VTK或OpenGL,并用Cython将其接口化到Python中。 - Sturla Molden
就像这张图片一样:https://dev59.com/FWvXa4cB1Zd3GeqPJnsG - user3473016
当然可以。但是我不记得应该使用哪个VTK过滤器了。 - Sturla Molden
http://docs.enthought.com/mayavi/mayavi/ - Sturla Molden
显示剩余2条评论
4个回答

10
这是一些复杂的数据,需要使用专为3D数据浏览设计的工具才能轻松查看,MayaVi 是一个非常好的选择。
以下是示例:

enter image description here

最重要的是它高度交互性,因此使用鼠标可以轻松地抓取和移动切片平面,甚至可以倾斜它们以探索数据体积数据(这非常有用,因为在这种情况下,我们可以看到它内部大部分是红色的,而仅从表面上我们无法猜测):

enter image description here

这是一段代码,只是 this 的稍微修改版本。
from mayavi import mlab
import numpy as np

x, y, z = np.ogrid[-2:2:20j, -2:2:20j, -2:2:20j]
s = np.sin(x*y*z + x + y*z)/(x*y*z + x + y*z)

mlab.pipeline.image_plane_widget(mlab.pipeline.scalar_field(s),
                            plane_orientation='x_axes',
                            slice_index=20,
                        )
mlab.pipeline.image_plane_widget(mlab.pipeline.scalar_field(s),
                            plane_orientation='y_axes',
                            slice_index=20,
                        )
mlab.pipeline.image_plane_widget(mlab.pipeline.scalar_field(s),
                            plane_orientation='z_axes',
                            slice_index=20,
                        )
mlab.outline()
mlab.show()

4

我不是很明白你想要什么。但如果你想做一个4D图,你需要第四个维度(你有想要的例子吗?)。我将颜色作为另一个维度,在这个例子中,我在R^3上绘制了一个以(0,0,0)为中心的高斯函数,每个点的颜色表示函数的值。

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

X, Y, Z = np.mgrid[-1:1:10j, -1:1:10j, -1:1:10j]

T = np.exp(-X**2 - Y**2 - Z**2)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
scat = ax.scatter(X, Y, Z, c=Z.flatten(), alpha=0.5)
fig.colorbar(scat, shrink=0.5, aspect=5)

对于插值部分,您可以使用 scipy.interpolate

在此输入图片描述


这就是我想要的:颜色表达了第四个维度。现在我只需要在这些点之间插值,从而得到表面而不是单个点.. 但这是否很容易呢? - user3473016
这是我想要获得的结果:https://dev59.com/FWvXa4cB1Zd3GeqPJnsG - user3473016
尝试使用Tom10建议的Mayavi。此外,使用等值面可能会很有用。在Mayavi中,您可以使用Contour3d来实现。 - nicoguaro

3

请查看 matplotlib,它是一个漂亮且良好说明的 Python 绘图模块,您应该能找到所需内容!

一个示例

三维示例


当然,我花了几个小时去查找答案,但仍然没有找到合适的答案。不过还是感谢你提供的第一手资料。 - user3473016
抱歉,但我在他们的库中找不到相关的示例。当他们谈论3D图时,他们指的是Z=f(X,Y)。实际上,我想绘制一个伪4D图:T=f(X,Y,Z),其中X、Y、Z位于常规笛卡尔网格上。 - user3473016
这似乎是你想要的? - Lee

1
"

Mayavi可能是另一个选择

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接