jos*_*hlk 9 python plot numpy 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]]
Run Code Online (Sandbox Code Playgroud)
数据点不是在XYZ空间中均匀分布,也不是以任何特定顺序存储.我认为这个例子使用了一个meshgrid来生成数据点 - 我已经看了这个但完全不理解它.任何帮助将非常感激?
H http://www.sethanil.com/_/rsrc/1267943775903/python-for-reseach/5/Article5-fig3.png
Hoo*_*ked 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))
Run Code Online (Sandbox Code Playgroud)
从这里可以轻松显示我们的数据:
from mayavi.mlab import *
contour3d(F,contours=8,opacity=.2 )
Run Code Online (Sandbox Code Playgroud)
这给出了一个很好的(块状)高斯.
看一下griddata的文档,注意你可以改变插值方法.如果你有更多的点(在插值网格和数据集上),插值会变得更好,更好地代表你想要说明的基础函数.以下是10K点和更精细网格的上述示例:
您可以使用 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()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12590 次 |
最近记录: |