Transparenz für Poly3DCollection Grundstück in matplotlib
Ich versuche zu zeichnen, einige Objekte mit der fabelhaften Matplotlib Paket für Python. Diese Objekte bestehen aus Punkten, umgesetzt mit plt.scatter()
und patches implementiert werden, mit Poly3DCollection
. Ich hätte gerne die patches mit einer leichten Transparenz, so dass die Punkte und Kanten hinter den patches gesehen werden kann.
Hier der code und die Handlung, die ich bereits generiert. Scheint, ich bin fast da, nur fehlt das Merkmal der Transparenz. Interessanterweise, wenn ich den ersten plot die Ploy3DCollection
und danach die scatter
Punkte, die Punkte gesehen werden können, aber nicht die Kanten.
Jeder, der einen Vorschlag für mich?
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 = 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()
Du musst angemeldet sein, um einen Kommentar abzugeben.
Machte ich eine leichte Modifikation der OP-code und bekam die Transparenz der Arbeit. Es scheint, dass die facecolors argument Poly3DCollection überschreibt die Transparenz-argument, so dass die Lösung war, um die Farbe in einem separaten Aufruf entweder
Poly3DCollection.set_color
oderPoly3DCollection.set_facecolor
:Interessant, wenn Sie explizit gesetzt, wird die Kante Farbe mit
collection.set_edgecolor('k')
die Kanten Ehren auch die Transparenz einstellen.Fand ich ein nettes workaround: Nach dem Plotten der Daten haben, können Sie ein weiteres Grundstück auf der Oberseite mit der gleichen Farbe und Feuerzeug-Linie Stil. Statt
Poly3DCollection
ich benutzeLine3DCollection
, also keine Gesichter aufgetragen. Das Ergebnis sieht sehr viel wie erwartet.Siehe unten den neuen plot und das Drehbuch zu erstellen.
Line3DCollection
geschlossen werden müssen (anders als für diePoly3DCollection
). In diesem Beispiel ist es egal, aber generell sollten wir am Ende mit einer Wiederholung des ersten vertex, nämlichvertices = [[0, 1, 2], [0, 1, 3], [0, 2, 3], [1, 2, 3], [0, 1, 2]]
.x
,y
, undz
sind Indizesvertices
. Es ist ein wenig verwirrend, weil Sie beide zufällig kleine positive Ganzzahlen. Das argumentPoly3DCollection
ist[[v1, v2, v3], [v2, v3, v4], [v3, v4, v5]]
wov1
ist ein Tupel von x -, y -, z-Werte der position.Vielen Dank Chilichiller und Julian. Ihre Beispiele sind sehr nützlich für mich derzeit, denn ich arbeite an einem kleinen Projekt über die 3D-Darstellung der-Matrizen mit matplotlib und Poly3DCollection scheint geeignet für die Aufgabe.
Eine kleine Anmerkung, die vielleicht nützlich sein können, um zukünftigen Lesern.
Laufen deine Beispiele in Python 3 gibt TypeError: 'zip' - Objekt ist nicht subscriptable.
Die einfachste Lösung ist, wickeln Sie den return-Wert der zip-in einem Aufruf von list() (angezeigt durch "Dive Into Python 3": http://www.diveintopython3.net/porting-code-to-python-3-with-2to3.html).
Dieser bug wurde in der neuen matplotlib. Ich bin mit der version 1.5.1.
Können Sie Ihre version von python läuft, dann tut:
Erhalten Sie matplotlib mit pip. Wenn Sie auf Ubuntu, führen Sie diese in einem terminal aus: