16

Python 用のすばらしい Matplotlib パッケージを使用して、いくつかのオブジェクトを描画しようとしています。これらのオブジェクトは、 で実装されたポイントと で実装されたplt.scatter()パッチで構成されPoly3DCollectionます。パッチの後ろのポイントとエッジが見えるように、パッチを少し透明にしたいと思います。

ここに、私が既に生成したコードとプロットがあります。透明性の機能が欠けているだけで、ほとんどそこにいるようです。興味深いことに、最初に をプロットしてからポイントをプロットするPloy3DCollectionscatter、ポイントは表示されますが、エッジは表示されません。

私に提案がある人はいますか?

ここに画像の説明を入力

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = [0, 2, 1, 1]
y = [0, 0, 1, 0]
z = [0, 0, 0, 1]

vertices = [[0, 1, 2], [0, 1, 3], [0, 2, 3], [1, 2, 3]]

tupleList = list(zip(x, y, z))

poly3d = [[tupleList[vertices[ix][iy]] for iy in range(len(vertices[0]))] for ix in range(len(vertices))]
ax.scatter(x,y,z)
ax.add_collection3d(Poly3DCollection(poly3d, facecolors='w', linewidths=1, alpha=0.5))

plt.show()
4

5 に答える 5

12

私は良い回避策を見つけました.データをプロットした後、同じ色と明るい線のスタイルで上に別のプロットを行います. 代わりにPoly3DCollectionを使用するLine3DCollectionので、面はプロットされません。結果は予想通りに見えます。

以下の新しいプロットとそれを作成するスクリプトを参照してください。

ここに画像の説明を入力

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection, Line3DCollection

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = [0, 2, 1, 1]
y = [0, 0, 1, 0]
z = [0, 0, 0, 1]

vertices = [[0, 1, 2], [0, 1, 3], [0, 2, 3], [1, 2, 3]]

tupleList = list(zip(x, y, z))

poly3d = [[tupleList[vertices[ix][iy]] for iy in range(len(vertices[0]))] for ix in range(len(vertices))]
ax.scatter(x,y,z)
ax.add_collection3d(Poly3DCollection(poly3d, facecolors='w', linewidths=1, alpha=0.5))
ax.add_collection3d(Line3DCollection(poly3d, colors='k', linewidths=0.2, linestyles=':'))

plt.show()
于 2013-09-19T22:28:04.610 に答える
4

Chilichiller と Julian に感謝します。私はmatplotlibを使用した行列の3D表現に関する小さなプロジェクトに取り組んでおり、Poly3DCollectionがそのタスクに適しているように見えるため、あなたの例は現在私にとって非常に役に立ちます。

少し注意してください。将来の読者に役立つかもしれません。Python 3 で例を実行すると、 TypeError: 'zip' object is not subscriptable. が返されます。

最も簡単な解決策は、zip の戻り値を list() の呼び出しでラップすることです (「Dive Into Python 3」で示されているように: http://www.diveintopython3.net/porting-code-to-python-3-with -2to3.html )。

于 2014-05-14T15:30:05.847 に答える
2

このバグは、新しい matplotlib で修正されました。バージョン 1.5.1 を実行しています。

Python を実行してから次のようにすると、バージョンを確認できます。

import matplotlib
matplotlib.__version__

pip を使用して matplotlib を取得できます。Ubuntu を使用している場合は、ターミナルからこれを実行します。

sudo apt-get install python-pip
sudo pip install matplotlib
于 2016-03-11T01:42:52.767 に答える