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 einer PatchCollection, Es tauchen überhaupt keine Patches auf.
  • Das zs Parameter in der patch_collection_2d_to_3d() Anruf ist seltsam; Ich würde erwarten, entweder zu setzen zs=0 (eine Z-Koordinate für alle drei Patches) oder zs=[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 '

War es hilfreich?

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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top