我想使用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
答案 0 :(得分:11)
诀窍是在绘制之前在网格上插值 - 我为此使用scipy
。 R
下面是(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 )
这给出了一个很好的(块状)高斯。
查看griddata的文档,请注意您可以更改插值方法。如果你有更多的点(插值网格和数据集上),插值会更好,更好地代表你试图说明的基础函数。以下是10K点和更精细网格的上述示例:
答案 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()