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

4 投票
3 回答
12957 浏览
提问于 2025-04-18 00:20

我刚开始学习Python,遇到了一个问题,想要画一个图。

我有一大堆点(大约42000个),每个点都有X、Y、Z坐标,还有一些相关的变量(比如温度、水分含量等)。我想把这些东西都画在一个图上,但以我现在的Python水平,感觉这几乎不可能。所有这些点都在一个规则的笛卡尔坐标网格上。所以我想用numpy来生成一个网格,但我卡住了……基本上,我想把一维的向量(比如X、Y、Z和温度T)转换成一个三维的网格,并且希望能有插值的数据。这可能吗?

你能帮我吗?

3 个回答

3

看看matplotlib吧,它是一个很好用的Python绘图模块,里面有很多图示,你应该能找到你需要的东西!

看看这些链接:

10

这段数据看起来有点复杂,所以我觉得你需要一个专门用来查看3D数据的工具,而MayaVi就是一个很不错的选择。

这里有个例子:

在这里输入图片描述

最重要的是,它非常互动,所以我可以用鼠标轻松地抓住并移动切片平面,甚至可以倾斜它们来探索数据的体积信息(这非常有用,因为在这个例子中,我们可以看到内部大部分是红色的,而仅仅从表面是无法猜测到的):

在这里输入图片描述

下面是代码,这只是这个的稍微修改版:

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

我不太明白你想要什么。不过如果你想做一个四维图,那你就需要一个第四个维度(你有没有想要的例子呢?)。在这个例子中,我用颜色作为另一个维度,我在三维空间(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来处理插值的部分。

撰写回答