我有一个三维的numpy数组。我想显示(在matplotlib中)这个阵列的等值面的一个漂亮的3D图(或者更严格地说,显示通过在采样点之间插值定义的3D标量场的等值面)。
matplotlib的mplot 3D部分提供了很好的3D绘图支持,但是(就我所知)它的API没有任何东西可以简单地获取标量值的3D数组并显示等值面。但是,它确实支持显示多边形集合,因此我可以实现marching cubes算法来生成这样的多边形。
看起来很有可能一个scipy友好的marching cubes已经在某个地方实现了,而我还没有找到它,或者我错过了一些简单的方法。另外,我欢迎任何指向其他工具的指针,这些工具可以在Python/numpy/scipy世界中轻松使用,以可视化3D数组数据。
3条答案
按热度按时间jyztefdp1#
只是详细说明我上面的评论,matplotlib的3D绘图真的不是为了像等值面这样复杂的东西。它的目的是为非常简单的3D绘图生成漂亮的、出版质量的矢量输出。它不能处理复杂的3D多边形,所以即使你自己实现移动立方体来创建等值面,它也不能正确地渲染它。
但是,您可以使用mayavi(它的mlab API比直接使用mayavi更方便),它使用VTK来处理和可视化多维数据。
作为一个快速的例子(修改自mayavi gallery示例之一):
gt0wga4j2#
为了补充@DanHickstein的答案,您还可以使用
trisurf
来可视化在行进立方体阶段获得的多边形。更新:2018年5月11日
正如@DrBwts所提到的,现在marching_cubes返回4个值。下面的代码可以工作。
更新:2020年2月2日
除了我前面的回答之外,我还应该提到,从那时起,PyVista已经发布了,它使这类任务变得有些轻松。
跟以前一样的例子。
结果如下
更新:二〇二〇年二月二十四日
正如@HenriMenke所提到的,
marching_cubes
已被重命名为marching_cubes_lewiner
。“新”片段如下。flvlnr443#
如果您想将绘图保留在matplotlib中(在我看来,生成出版质量的图像比mayavi要容易得多),那么您可以使用skimage中实现的marking_cubes函数,然后在matplotlib中使用
如上面的链接所示。Matplotlib在渲染等值面方面做得很好。下面是我用一些真实的断层扫描数据制作的示例: