10

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

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

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

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

数据点不是均匀分布在 XYZ 空间中,也不是以任何特定顺序存储的。我认为该示例使用网格网格来生成数据点 - 我已经查过了,但完全不明白。任何帮助将非常感激?

H
(来源:sethanil.com

4

2 回答 2

13

诀窍是在绘制之前在网格上进行插值 - 我会使用scipy它。下面R是 XYZ 值的 (500,3) 数组,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 )

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

在此处输入图像描述

查看griddata的文档,注意您可以更改插值方法。如果您有更多点(在插值网格上和数据集上),则插值会越来越好地代表您要说明的基础功能。这是上面 10K 点和更精细网格的示例:

在此处输入图像描述

于 2012-02-24T01:18:14.587 回答
5

您可以使用 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()

在此处输入图像描述

于 2012-02-24T02:42:54.660 回答