2

円に正弦波をプロットしたいと思います。つまり、円はx、y平面にあり、正弦波はその平面に垂直に円を包み込みます(z軸を突き出します)。これはできますが、円と正弦波の間の領域を多角形で塗りつぶそうとすると (つまり、正弦波が存在する架空の円柱の表面にペイントします)、うまくいきません - matplotlib は、プロットのビューで重なっている領域を XOR しているように見えますが、前にある領域が後ろにある領域を遮るビューを表示するのではありません。これが私のコードの関連ビットです:

fig = plt.figure()
ax = fig.gca(projection='3d')
ax._axis3don = False
theta = np.linspace(0., 2 * np.pi, 1000)
r = 1.
x = r * np.sin(theta)
y = r * np.cos(theta)
sinez = N * np.sin(theta * m)
ax.plot(x, y, sinez, color='r')
xv = np.append(x, x[::-1])
yv = np.append(y, y[::-1])
zv = np.append(sinez, np.zeros(n))
verts = [zip(xv,yv,zrev),]
poly = Poly3DCollection(verts, facecolors = [cc('r'), cc('b')],
                        edgecolor='None')
poly.set_alpha(0.7)
ax.add_collection3d(poly)

外観は次のとおりです。 ここに画像の説明を入力

4

2 に答える 2

2

matplotlibが存在する主な理由は 2D プロットです。3D のものは単なる巧妙な変換であり、バグやハッキーになる可能性があります。固有の制限の 1 つは、matplotlibレイヤーで描画することです。そのため、「前」または「後ろ」の概念はなく、キャンバスにカーブを描画する順序のみを認識します (混乱を招くように z オーダーと呼ばれます)。

3D コードを書き直さずにこれを正しく表示したい場合は、正弦波を分割し、z オーダーを手動で正しく設定してください (より単純なバージョンについては、交差する平面を描画する方法を参照してください)。 this)、ただし、画像を回転することはできません。

実際の 3D が必要な場合は、OpenGL ベースmayavi の考えから調べることをお勧めします。

于 2013-05-31T17:56:26.257 に答える