Wie zeichne ich eine 3D -Patch -Sammlung in Matplotlib auf?
-
25-10-2019 - |
Frage
Ich versuche, in Matplotlib ein 3D -Diagramm mit drei Kreisen zu erstellen, die jeweils am Ursprung und mit einem Radius von 1 zentriert sind, was in unterschiedliche Richtungen zeigt - um zum Beispiel eine Kugel mit Radius 1 zu veranschaulichen.
In 2D würde ich eine Kreis -Patch -Sammlung erstellen und es zu den Achsen hinzufügen. In 3D habe ich Probleme, die Patches überhaupt aufzutauchen, geschweige denn sie in verschiedene Richtungen zu orientieren.
import matplotlib
import matplotlib.pyplot as P
import mpl_toolkits.mplot3d as M3
fig = P.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
circles = matplotlib.collections.PatchCollection(
[matplotlib.patches.Circle((0, 0), 1) for count in range(3)],
offsets=(0, 0))
M3.art3d.patch_collection_2d_to_3d(circles, zs=[0], zdir='z')
ax.add_collection(circles)
P.show()
Durch das Ausführen dieses Programms füllt das gesamte Handlungsfenster mit Blau, dh die Gesichtsfarbe der Flecken, egal wie ich das Diagramm rotiere. Wenn ich setze facecolor='none'
in dem PatchCollection()
Rufen Sie an, dann eine leere Axes3D
auftaucht.
Dinge, die ich ausprobiert habe:
- Wenn ich a benutze
CircleCollection
anstelle einerPatchCollection
, Es tauchen überhaupt keine Patches auf. Das
zs
Parameter in derpatch_collection_2d_to_3d()
Anruf ist seltsam; Ich würde erwarten, entweder zu setzenzs=0
(eine Z-Koordinate für alle drei Patches) oderzs=[0,0,0]
(Ein separater Z-Koordinat für jeden Patch), aber beide werfen einen Fehler auf:ValueError: Einstellen eines Array -Elements mit einer Sequenz.
Um die Patches anders zu orientieren, würde ich erwarten, etwas wie
zdir=['x', 'y', 'z']
Aber die Ergebnisse sind nicht anders, ob ich das bestehe oder'z'
oder['z']
.- Ich hätte auch erwartet, dass ich es tun kann
ax.add_collection3d(circles, zs=[0, 0, 0], zdir=['x', 'y', 'z'])
Anstatt die Patch -Sammlung von 2D auf 3D zu konvertieren, wirft dies jedoch auch einen Fehler aus:AttributeError: 'patch3dCollection' Objekt hat kein Attribut 'set_sort_zpos' 'kein Attribut' set_sort_zpos '
Lösung
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, PathPatch
from mpl_toolkits.mplot3d import Axes3D
import mpl_toolkits.mplot3d.art3d as art3d
fig = plt.figure()
ax=fig.gca(projection='3d')
for i in ["x","y","z"]:
circle = Circle((0, 0), 1)
ax.add_patch(circle)
art3d.pathpatch_2d_to_3d(circle, z=0, zdir=i)
ax.set_xlim3d(-2, 2)
ax.set_ylim3d(-2, 2)
ax.set_zlim3d(-2, 2)
plt.show()