2012-02-23 15 views
8

Tôi muốn làm một âm mưu đường viền 3D sử dụng Mayavi trong cách chính xác giống như các nhân vật thứ ba trên trang này (một hydro điện tử mô hình điện toán đám mây):3D đường viền cốt truyện từ dữ liệu sử dụng Mayavi/Python

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

Tôi có một tập hợp các điểm dữ liệu mà tôi đã tạo bằng mô hình của riêng mình mà tôi muốn sử dụng. Các điểm dữ liệu được lưu trữ trong một mảng đa chiều như vậy:

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

Các điểm dữ liệu không được trải đều trong không gian XYZ và không được lưu trữ theo bất kỳ thứ tự cụ thể nào. Tôi nghĩ rằng ví dụ này sử dụng một meshgrid để tạo ra các điểm dữ liệu - tôi đã nhìn này lên nhưng hoàn toàn không hiểu nó. Bất kì sự trợ giúp nào đều được đánh giá cao?

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

+0

Cho chúng tôi, những gì bạn đã cố gắng cho đến nay. Chúng tôi sẽ giúp từ đó trở đi. –

+0

Chỉ để tham khảo trong tương lai, các câu hỏi như thế này phù hợp với [scicomp.SE]. –

Trả lời

9

Bí quyết là để suy qua một mạng lưới trước khi bạn cốt truyện - Tôi muốn sử dụng scipy cho việc này. Bên dưới R là dãy giá trị XYZ (500,3) và V là "độ lớn" tại mỗi điểm 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)) 

Từ đây đó là một snap để hiển thị dữ liệu của chúng tôi:

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

Điều này cho phép một tốt đẹp (sần) Gaussian.

enter image description here

Hãy nhìn vào các tài liệu cho griddata, lưu ý rằng bạn có thể thay đổi phương pháp nội suy. Nếu bạn có nhiều điểm hơn (cả trên lưới nội suy, và trên tập dữ liệu), nội suy sẽ trở nên tốt hơn và tốt hơn đại diện cho hàm cơ bản mà bạn đang cố gắng minh họa. Dưới đây là ví dụ trên tại 10K điểm và một mạng lưới tốt hơn:

enter image description here

+0

Cảm ơn rất nhiều. Nó hoạt động như một say mê! Chỉ một câu hỏi: nếu tôi muốn tăng gấp đôi số điểm trên lưới phù hợp, tôi sẽ thay đổi gì trong dòng 'dx, pts = 2, 100j'? – joshlk

+0

@Josh bạn sẽ thay đổi thành 'dx, pts = 2, 200j', tuy nhiên điều này sẽ tăng gấp đôi số điểm trong _each dimension_ vì vậy bạn sẽ có 2^3 = 8 lần số điểm để nội suy hơn. 'dx' kiểm soát mức độ của lưới ô. Để kiểm soát tốt hơn chỉ 'mgrid' cho mỗi thứ nguyên tuyến tính. – Hooked

+0

Tôi thấy chức năng griddata có thể mất nhiều thời gian để tính toán. Bạn có biết bất kỳ mẹo nào để tăng tốc quá trình không? – joshlk

4

Bạn có thể sử dụng bộ lọc delaunay3d để tạo ra các tế bào từ điểm. Sau đó, bạn có thể tạo một iso_surface() cho đầu ra UnstructuredGrid của delaunay3d. Nếu bạn muốn ImageData, bạn có thể sử dụng bộ lọc 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

+0

Xin chào khi tôi sử dụng phương pháp này với dữ liệu của riêng tôi, tôi tiếp tục tải nhiều lỗi xuất hiện trong cửa sổ mới với câu cuối cùng: "Cảnh báo: Trong C: \ pisi \ tmp \ VTK-5.6.0-2 \ work \ VTK \ Graphics \ vtkDelaunay3D.cxx, dòng 488 vtkDelaunay3D (03AD2250): 27 hình tam giác thoái hóa gặp phải, chất lượng lưới nghi ngờ ". Bạn có biết chuyện gì đang xảy ra không? – joshlk