如何在matplotlib mplot3D或类似物中显示3D阵列等值面的3D图?

问题描述 投票:44回答:4

我有一个3维的numpy数组。我想显示(在matplotlib中)此数组的等值面的漂亮3D图(或更严格地说,显示通过在采样点之间进行插值定义的3D标量字段的等值面)。

matplotlib的mplot3D部分提供了很好的3D绘图支持,但是(据我所知),其API没有任何东西可以简单地获取标量值的3D数组并显示等值面。但是,它确实支持显示多边形的集合,因此大概可以实现行进立方体算法来生成此类多边形。

[似乎很有可能已经在某个地方实现了对科学友好的行进多维数据集,但是我还没有找到它,或者我缺少一些简单的方法来做到这一点。另外,我欢迎任何指向其他工具的指针,这些工具可以可视化从Python / numpy / scipy世界轻松使用的3D数组数据。

python matplotlib scipy visualization volume
4个回答
42
投票

仅在上面详述我的评论,matplotlib的3D绘图实际上并不打算用于等值曲面之类的复杂对象。它的目的是为非常简单的3D图产生漂亮的,具有出版质量的矢量输出。它无法处理复杂的3D多边形,因此,即使您自己实施了行进立方体来创建等值面,也无法正确渲染该等值面。

但是,您可以改用mayavi(它的mlab API比直接使用mayavi更为方便),它使用VTK处理和可视化多维数据。

作为一个简单的例子(从mayavi画廊的例子之一改编而成:]:>

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()

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9nQUh3dS5wbmcifQ==” alt =“在此处输入图像描述”>


24
投票

补充@DanHickstein的答案,您还可以使用trisurf可视化在行进立方体阶段中获得的多边形。


13
投票

如果您想将图表保留在matplotlib中(我认为比mayavi更容易生成具有出版质量的图像,那么您可以使用marching_cubes function implemented in skimage,然后使用以下命令在matplotlib中绘制结果


0
投票

除了我以前的回答,我应该提到,自那时以来PyVista已发布,这使得这类任务有些轻松。

© www.soinside.com 2019 - 2024. All rights reserved.