使用Mayavi / Python从3D数据绘制轮廓图

时间:2012-02-23 19:02:23

标签: python numpy plot contour mayavi

我想使用Mayavi以与本页第三个图形完全相同的方式绘制三维等高线图(氢电子云模型):

http://www.sethanil.com/python-for-reseach/5

我有一组数据点,我使用自己的模型创建,我想使用它。数据点存储在多维的numpy数组中,如下所示:

XYZV = [[1, 2, 3, 4],
        [6, 7, 8, 9],
        ...
        [4, 5, 6, 7]]

数据点未在XYZ空间中均匀分布,并且不以任何特定顺序存储。我认为这个例子使用了一个meshgrid来生成数据点 - 我已经看了这个但完全不理解它。任何帮助将不胜感激?

H http://www.sethanil.com/_/rsrc/1267943775903/python-for-reseach/5/Article5-fig3.png

2 个答案:

答案 0 :(得分:11)

诀窍是在绘制之前在网格上插值 - 我为此使用scipyR下面是(500,3)XYZ值数组,V是"幅度"在每个XYZ点。

from scipy.interpolate import griddata
import numpy as np

# Create some test data, 3D gaussian, 200 points
dx, pts = 2, 100j

N = 500
R = np.random.random((N,3))*2*dx - dx
V = np.exp(-( (R**2).sum(axis=1)) )

# Create the grid to interpolate on
X,Y,Z = np.mgrid[-dx:dx:pts, -dx:dx:pts, -dx:dx:pts]

# Interpolate the data
F = griddata(R, V, (X,Y,Z))

从这里开始显示我们的数据:

from mayavi.mlab import *
contour3d(F,contours=8,opacity=.2 )

这给出了一个很好的(块状)高斯。

enter image description here

查看griddata的文档,请注意您可以更改插值方法。如果你有更多的点(插值网格和数据集上),插值会更好,更好地代表你试图说明的基础函数。以下是10K点和更精细网格的上述示例:

enter image description here

答案 1 :(得分:4)

您可以使用delaunay3d过滤器从点创建单元格。然后,您可以为delaunay3d的输出UnstructuredGrid创建一个iso_surface()。如果您想要ImageData,可以使用image_data_probe过滤器。

import numpy as np
from tvtk.api import tvtk
from mayavi import mlab

points = np.random.normal(0, 1, (1000, 3))
ug = tvtk.UnstructuredGrid(points=points)
ug.point_data.scalars = np.sqrt(np.sum(points**2, axis=1))
ug.point_data.scalars.name = "value"
ds = mlab.pipeline.add_dataset(ug)
delaunay = mlab.pipeline.delaunay3d(ds)
iso = mlab.pipeline.iso_surface(delaunay)
iso.actor.property.opacity = 0.1
iso.contour.number_of_contours = 10
mlab.show()

enter image description here