使用Mayavi绘制3D图形,带Matplotlib风格坐标轴

9 投票
1 回答
2217 浏览
提问于 2025-04-18 02:26

我最近在玩Mayavi这个工具,用来画3D图形。我能画出我想要的散点图,但就是觉得坐标轴看起来不太对劲。我找到一个之前的问题,里面提到了一些我想要的内容,但没有详细讲解。我想要的3D散点图像#1,但是坐标轴要像#2那样好看(我想嵌入图片,但我没有足够的声望)。普通的Mayavi坐标轴不太够用。有没有什么建议,可以让我得到像Matplotlib那样的坐标平面?

1 个回答

2

其实这件事一旦掌握了“窍门”,就非常简单了,我已经做过很多次了。

这个“窍门”就是先生成mayavi的图,然后把它转移到matplotlib的窗口里,这样你就可以使用所有熟悉的matplotlib工具,比如添加数字、日期、箭头,或者其他matplotlib提供的功能。在这个代码示例中,我会把mayavi的“铜球”示例放到matplotlib的坐标轴里:

import numpy, pylab, mayavi, mayavi.mlab
import matplotlib.pyplot as plt

t = numpy.linspace(0, 4 * numpy.pi, 20)
cos,sin = numpy.cos, numpy.sin

x = sin(2 * t)
y = cos(t)
z = cos(2 * t)
s = 2 + sin(t)
mayavi.mlab.points3d(x, y, z, s, colormap="copper", scale_factor=.25)

arr = mayavi.mlab.screenshot()
fig = plt.figure(figsize=(5, 5))
pylab.imshow(arr)

plt.show()

结果就是在matplotlib的坐标轴中显示mayavi的图像: Mayavi graphics in matplotlib axes

唯一有点棘手的是,你需要对mayavi和matplotlib的比例和维度有一定的了解,这样才能让它们的比例协调一致,特别是如果你想制作多个手动构建的图形。这并不简单,但对于Mayavi和Matplotlib都有相当不错的文档说明,听起来你对这两者都很了解,所以我就不再多说了。(现在图形已经在Matplotlib里了,你可以把它们也放进生成的PDF里,或者用python-docx导入到Microsoft Word中)

撰写回答