2012-11-27 43 views
8

我想用plot_surfaceplot_wireframe來模擬小行星。對於小行星表面上的點,我有x和z值。線框精確到小行星的形狀,但表面圖不適合線框。我如何獲得曲面圖以適應線框或我如何使用線框來獲得三維實體模型?這裏是我的型號代碼:使用曲面和線框爲Matplotlib建模小行星

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() 

的數據是這種格式,雖然有在原來的文件多了很多臺詞:

-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 

希望你能幫助

+1

我會建議尋找到http://code.enthought.com/projects/mayavi/它利用'vtk',並提供更好的3D支持比'matplotlib'。 – tacaswell

+0

有趣的問題,你可以發佈一個鏈接到完整的數據? –

+0

我同意@tcaswell:matplotlib的3D並不是真的取決於此;請參閱http://stackoverflow.com/questions/6030098/how-to-display-a-3d-plot-of-a-3d-array-isosurface-in-matplotlib-mplot3d-or-simil瞭解mayavi如何用於渲染三維體積數據的等值面(不完全相同的問題)。 – timday

回答

2

莫非你提供了一個正在發生的事情的圖像?我猜測你正在得到一張小行星表面似乎在各處跳躍的圖像。那是對的嗎?如果是這樣的話,可能是由於繪圖員不知道點的順序而引起的。

如果我們有一組點包含一個單位圓的所有點,那麼我們希望繪製這些點來創建一個單位圓。但是,如果您決定將每個點連接到另外兩個點,則它不一定看起來像一個圓圈。如果(出於某種原因)你將一個點連接到另一個圓的另一個點上,並繼續這樣做直到每個點連接到另外兩個點,它可能看起來不像一個圓,因爲每個點都不是圓必須連接到相鄰的點。

對於你的小行星也是如此。您需要提出一些方案,以便繪圖儀知道如何連接點,否則您將繼續存在相同的問題。

圓下面的例子應該說明我的觀點:

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()