Трехмерный контурный контур из данных с использованием Mayavi / Python - PullRequest
9 голосов
/ 23 февраля 2012

Я хотел бы сделать трехмерный контурный график, используя Mayavi точно так же, как третий рисунок на этой странице (модель облака водородных электронов):

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

У меня есть набор точек данных, которые я создал, используя свою собственную модель, которую я хотел бы использовать. Точки данных хранятся в многомерном массиве пустышек, например:

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

Точки данных неравномерно распределены в пространстве XYZ и не хранятся в каком-либо определенном порядке. Я думаю, что в примере используется сетка сетки для генерации точек данных - я посмотрел это вверх, но совершенно не понимаю этого. Любая помощь будет высоко ценится?

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

Ответы [ 2 ]

11 голосов
/ 24 февраля 2012

Хитрость заключается в том, чтобы интерполировать по сетке перед построением графика - я бы использовал для этого 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 )

Это дает хороший (кусковой) гауссиан.

enter image description here

Посмотрите документы для griddata , обратите внимание, что вы можетеизменить метод интерполяции.Если у вас больше точек (как на интерполированной сетке, так и на наборе данных), интерполяция становится все лучше и лучше представляет основную функцию, которую вы пытаетесь проиллюстрировать.Вот приведенный выше пример с 10K-точками и более точной сеткой:

enter image description here

4 голосов
/ 24 февраля 2012

Вы можете использовать фильтр delaunay3d для создания ячеек из точек.Затем вы можете создать iso_surface () для вывода UnstructuredGrid из delaunay3d.Если вы хотите 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

...