如何在matplotlib mplot3D或类似文件中显示3D阵列等值面的3D图?
问题内容:
我有一个3维的numpy数组。我想显示(在matplotlib中)此数组的等值面的漂亮3D图(或更严格地说,显示通过在采样点之间进行插值定义的3D标量字段的等值面)。
matplotlib的mplot3D部分提供了不错的3D绘图支持,但是(据我所知),其API没有任何东西可以简单地获取标量值的3D数组并显示等值面。但是,它确实支持显示多边形集合,因此大概可以实现行进立方体算法来生成此类多边形。
似乎很可能已经在某个地方实现了对scipy友好的行进多维数据集,但是我还没有找到它,或者我缺少执行此操作的一些简单方法。另外,我欢迎任何指向其他工具的指针,这些工具可以可视化从Python
/ numpy / scipy世界轻松使用的3D数组数据。
问题答案:
只是为了详细说明我在上面的评论,matplotlib的3D绘图实际上并不打算用于等值面之类的复杂对象。它的目的是为非常简单的3D图生成漂亮的,具有出版质量的矢量输出。它无法处理复杂的3D多边形,因此,即使您自己实施了行进立方体来创建等值面,也无法正确渲染该等值面。
但是,您可以做的是使用mayavi(它的mlab
API
比直接使用mayavi更加方便),它使用VTK处理和可视化多维数据。
作为一个快速示例(从mayavi gallery示例之一进行了修改):
import numpy as np
from enthought.mayavi import mlab
x, y, z = np.ogrid[-10:10:20j, -10:10:20j, -10:10:20j]
s = np.sin(x*y*z)/(x*y*z)
src = mlab.pipeline.scalar_field(s)
mlab.pipeline.iso_surface(src, contours=[s.min()+0.1*s.ptp(), ], opacity=0.3)
mlab.pipeline.iso_surface(src, contours=[s.max()-0.1*s.ptp(), ],)
mlab.show()