2012-11-27 34 views
8

Tôi đang cố gắng lập mô hình một tiểu hành tinh bằng cách sử dụng plot_surfaceplot_wireframe. Tôi có các giá trị x y và z cho các điểm trên bề mặt của tiểu hành tinh. Khung dây là chính xác với hình dạng của tiểu hành tinh nhưng cốt truyện bề mặt không phù hợp với khung dây. Làm thế nào tôi có thể nhận được cốt truyện bề mặt để phù hợp với wireframe hoặc làm thế nào tôi có thể sử dụng wireframe để có được một mô hình 3D rắn? Đây là mã của tôi cho các mô hình:Tạo mô hình tiểu hành tinh với Matplotlib bằng cách sử dụng bề mặt và khung dây

from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib import cm 
from matplotlib.mlab import griddata 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
data = np.genfromtxt('data.txt') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 

ax.plot_wireframe(x, y, z, rstride=1, cstride=1, alpha=1) 

xi = np.linspace(min(x), max(x)) 
yi = np.linspace(min(y), max(y)) 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(x, y, z, xi, yi) 


surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm, 
     linewidth=0, antialiased=False) 
ax.set_zlim(-1.01, 1.01) 

plt.show() 

Dữ liệu được định dạng này, mặc dù có rất nhiều nhiều dòng trong file gốc:

-1.7738946051191869E-002 4.3461451610545973E-002 1.3393057231408241  
-0.29733561550902488  0.32305812106837900  1.3393057231408241  
-0.29733561550902488  0.16510132228266330  1.3548631099230350  
-0.21872587865015569  2.4170900455101410E-002 1.3610011616437809  
1.4452975249810950E-002 -0.20900795344486520  1.3610011616437809  
1.5732454381265970E-002 -0.20900795344486520  1.3608751439485580  
-0.34501536374240321  0.51320241386595655  1.3158820995876130  
-0.40193014435941982  0.45628763324893978  1.3158820995876130  
-0.42505849480150409  0.28183419537116011  1.3307863198123011  
-0.18994178462386799  -0.19294290416565860  1.3424523041534830  
1.4452975249810939E-002 -0.39733766403933751  1.3424523041534830  
5.8021940902131752E-002 -0.57108837516584876  1.3210481842104100  
9.3746267961881152E-002 -0.61017602710257668  1.3136798474111200  
0.26609469681891229  -0.43782759824554562  1.3136798474111200  
    0.17938460413447810  0.39179924148155021  1.2357401964919650  
    8.9613011902522258E-002 0.42818009222325598  1.2584008460875080  
    0.33671539027096409  -0.47165177581327772  1.2965073126705291  
    0.53703772594296528  -0.47165177581327777  1.2357401964919561  
-0.19242375014122229  0.71021685426700043  1.2584008460875080  
-0.34501536374240321  0.66763766324752027  1.2904902860951690 

Hy vọng bạn có thể giúp

+1

tôi sẽ khuyên bạn nên nhìn vào http://code.enthought.com/projects/mayavi/ đó thúc đẩy 'vtk' và cung cấp 3D tốt hơn nhiều hỗ trợ hơn 'matplotlib'. – tacaswell

+0

Sự cố thú vị, bạn có thể đăng liên kết tới dữ liệu hoàn chỉnh không? –

+0

Tôi đồng ý với @tcaswell: 3D của matplotlib không thực sự đạt được điều này; xem http://stackoverflow.com/questions/6030098/how-to-display-a-3d-plot-of-a-3d-array-isosurface-in-matplotlib-mplot3d-or-simil để biết cách sử dụng mayavi hiển thị các mặt phẳng của dữ liệu khối lượng 3D (không hoàn toàn giống với vấn đề). – timday

Trả lời

2

Could bạn cung cấp một hình ảnh về những gì đang xảy ra? Tôi đoán rằng bạn đang nhận được một hình ảnh nơi bề mặt của tiểu hành tinh dường như nhảy khắp nơi. Đúng không? Nếu vậy nó có thể được gây ra bởi các plotter không biết thứ tự của các điểm.

Nếu chúng ta có một tập hợp các điểm, trong đó có tất cả các điểm của một vòng tròn đơn vị, thì chúng ta sẽ mong đợi một bản vẽ của các điểm đó để tạo ra một vòng tròn đơn vị. Tuy nhiên, nếu bạn quyết định kết nối từng điểm với hai điểm khác, thì nó sẽ không nhất thiết trông giống như một vòng tròn. Nếu (vì lý do nào đó) bạn kết nối một điểm với một điểm khác ở phía bên kia của vòng tròn và tiếp tục làm điều đó cho đến khi mỗi điểm được kết nối với hai điểm khác, nó có thể hoặc không giống như một vòng tròn vì mỗi điểm không nhất thiết phải kết nối với các điểm liền kề.

Điều này cũng đúng cho tiểu hành tinh của bạn. Bạn cần phải đi lên với một số chương trình để các plotter biết làm thế nào để kết nối các điểm, nếu không bạn sẽ tiếp tục có cùng một vấn đề.

Ví dụ sau đây của một vòng tròn nên minh họa quan điểm của tôi:

import math 
import matplotlib.pylab as plt 
import random 

thetaList = range(360) 
random.shuffle(thetaList) 
degToRad = lambda x: float(x) * math.pi/float(180) 
x = [math.cos(degToRad(theta)) for theta in thetaList] 
y = [math.sin(degToRad(theta)) for theta in thetaList]  

#plot the cirlce 
plt.plot(x,y) 
plt.show() 
Các vấn đề liên quan