如何显示在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在渲染等值面方面做得非常好。 这里是我用一些真实的层析数据制作的例子: