8

plot_surfaceと を使用して小惑星をモデル化しようとしていplot_wireframeます。小惑星の表面上のポイントの xy 値と z 値があります。ワイヤーフレームは小惑星の形状に正確ですが、表面プロットはワイヤーフレームに適合しません。サーフェス プロットをワイヤフレームに合わせる方法、またはワイヤフレームを使用して 3D ソリッド モデルを取得する方法を教えてください。モデルのコードは次のとおりです。

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 

あなたが助けてくれることを願っています

4

1 に答える 1

2

何が起こっているかのイメージを提供できますか?小惑星の表面が飛び跳ねているような画像が得られていると思います。あれは正しいですか?その場合、プロッターが点の順序を認識していないことが原因である可能性があります。

単位円のすべての点を含む一連の点がある場合、それらの点を描画すると単位円が作成されることが期待されます。ただし、各ポイントを他の 2 つのポイントに接続することにした場合、必ずしも円のように見えるとは限りません。(何らかの理由で) ある点を円の反対側にある別の点に接続し、各点が他の 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()
于 2012-11-30T19:01:19.170 に答える