如何显示在matplotlib mplot3D或类似的三维arrays等值面的三维图?

我有一个三维numpy数组。 我想要显示(在matplotlib中)这个数组的等值面(或者更严格的说是通过在样本点之间进行插值定义的3D标量场的等值面)的一个很好的三维图。

matplotlib的mplot3D部分提供了很好的三维绘图支持,但是(据我所知),它的API没有任何东西,只需要一个标量值的三维数组并显示一个等值面。 但是,它支持显示多边形的集合,所以大概我可以实现进行立方体algorithm来生成这样的多边形。

这似乎很可能是一个友好的步操立方体已经在某处实施,我还没有find它,或者我错过了一个简单的方法来做到这一点。 另外,我会欢迎任何指向其他工具,可视化的3D数组数据可以从Python / numpy / scipy世界轻松使用。

只是为了详细说明我上面的评论,matplotlib的3D绘图实际上并不适用于复杂的等值面。 它的目的是为真正简单的三维绘图产生出色的,出版质量的vector输出。 它不能处理复杂的三维多边形,所以即使实施三维立方体来创build等值面,也不能正确渲染它。

但是,你可以做的是使用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() 

在这里输入图像描述

作为@DanHickstein的回答,您还可以使用trisurf来显示在行军立方体阶段获得的多边形。

 import numpy as np from numpy import sin, cos, pi from skimage import measure import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D def fun(x, y, z): return cos(x) + cos(y) + cos(z) x, y, z = pi*np.mgrid[-1:1:31j, -1:1:31j, -1:1:31j] vol = fun(x, y, z) verts, faces = measure.marching_cubes(vol, 0, spacing=(0.1, 0.1, 0.1)) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_trisurf(verts[:, 0], verts[:,1], faces, verts[:, 2], cmap='Spectral', lw=1) plt.show() 

在这里输入图像描述

如果你想保留matplotlib中的图(在我看来,要比mayavi更容易产生出版质量的图像),那么你可以使用在skimage中实现的marching_cubes函数 ,然后使用matplotlib绘制结果

 mpl_toolkits.mplot3d.art3d.Poly3DCollection 

如上面的链接所示。 Matplotlib在渲染等值面方面做得非常好。 这里是我用一些真实的层析数据制作的例子:

在这里输入图像描述