Hinweis
Zum Ende springen, um den vollständigen Beispielcode herunterzuladen.
Pfeilhilfe#
Hinzufügen von Pfeil-Patches zu Plots.
Pfeile werden oft zur Annotation von Plots verwendet. Dieses Tutorial zeigt, wie man Pfeile zeichnet, die sich unterschiedlich verhalten, wenn die Datenlimits eines Plots geändert werden. Im Allgemeinen können Punkte in einem Plot entweder im "Datenraum" oder im "Anzeigeraum" fixiert werden. Etwas, das im Datenraum gezeichnet wird, bewegt sich, wenn die Datenlimits geändert werden - ein Beispiel wären die Punkte in einem Scatter-Plot. Etwas, das im Anzeigeraum gezeichnet wird, bleibt statisch, wenn die Datenlimits geändert werden - ein Beispiel wäre ein Figurentitel oder die Achsenbeschriftungen.
Pfeile bestehen aus einer Spitze (und möglicherweise einem Schwanz) und einem Schaft, der zwischen einem Startpunkt und einem Endpunkt gezeichnet wird, die im Folgenden als 'Ankerpunkte' bezeichnet werden. Hier zeigen wir drei Anwendungsfälle für das Zeichnen von Pfeilen, je nachdem, ob die Spitze oder die Ankerpunkte im Daten- oder Anzeigeraum fixiert werden müssen
Spitzenform im Anzeigeraum fixiert, Ankerpunkte im Datenraum fixiert
Spitzenform und Ankerpunkte im Anzeigeraum fixiert
Patch komplett im Datenraum fixiert
Unter jedem Anwendungsfall wird dieser nacheinander dargestellt.
Spitzenform im Anzeigeraum fixiert und Ankerpunkte im Datenraum fixiert#
Dies ist nützlich, wenn Sie einen Plot annotieren und nicht möchten, dass sich die Pfeilform oder -position ändert, wenn Sie den Plot verschieben oder skalieren.
In diesem Fall verwenden wir patches.FancyArrowPatch.
Beachten Sie, dass sich beim Ändern der Achsenlimits die Pfeilform nicht ändert, aber die Ankerpunkte sich bewegen.

Spitzenform und Ankerpunkte im Anzeigeraum fixiert#
Dies ist nützlich, wenn Sie einen Plot annotieren und nicht möchten, dass sich die Pfeilform oder -position ändert, wenn Sie den Plot verschieben oder skalieren.
In diesem Fall verwenden wir patches.FancyArrowPatch und übergeben das Schlüsselwortargument transform=ax.transAxes, wobei ax die Achsen sind, zu denen wir den Patch hinzufügen.
Beachten Sie, dass sich beim Ändern der Achsenlimits die Pfeilform und -position nicht ändern.
fig, axs = plt.subplots(nrows=2)
arrow = mpatches.FancyArrowPatch((x_tail, y_tail), (x_head, y_head),
mutation_scale=100,
transform=axs[0].transAxes)
axs[0].add_patch(arrow)
arrow = mpatches.FancyArrowPatch((x_tail, y_tail), (x_head, y_head),
mutation_scale=100,
transform=axs[1].transAxes)
axs[1].add_patch(arrow)
axs[1].set(xlim=(0, 2), ylim=(0, 2))

Spitzenform und Ankerpunkte im Datenraum fixiert#
In diesem Fall verwenden wir patches.Arrow oder patches.FancyArrow (letzteres ist orange).
Beachten Sie, dass sich beim Ändern der Achsenlimits die Pfeilform und -position ändern.
FancyArrow's API ist relativ umständlich und erfordert insbesondere die Übergabe von length_includes_head=True, damit die Pfeilspitze (dx, dy) vom Pfeilanfang entfernt ist. Sie ist nur in dieser Referenz enthalten, da sie die von Axes.arrow (in grün) zurückgegebene Pfeilklasse ist.
fig, axs = plt.subplots(nrows=2)
arrow = mpatches.Arrow(x_tail, y_tail, dx, dy)
axs[0].add_patch(arrow)
arrow = mpatches.FancyArrow(x_tail, y_tail - .4, dx, dy,
width=.1, length_includes_head=True, color="C1")
axs[0].add_patch(arrow)
axs[0].arrow(x_tail + 1, y_tail - .4, dx, dy,
width=.1, length_includes_head=True, color="C2")
arrow = mpatches.Arrow(x_tail, y_tail, dx, dy)
axs[1].add_patch(arrow)
arrow = mpatches.FancyArrow(x_tail, y_tail - .4, dx, dy,
width=.1, length_includes_head=True, color="C1")
axs[1].add_patch(arrow)
axs[1].arrow(x_tail + 1, y_tail - .4, dx, dy,
width=.1, length_includes_head=True, color="C2")
axs[1].set(xlim=(0, 2), ylim=(0, 2))

plt.show()
Gesamtlaufzeit des Skripts: (0 Minuten 1,748 Sekunden)