Winkelannotationen zu Matplotlib-Pfeilen hinzufügen

PythonPythonBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden Sie lernen, wie Sie Winkelannotationen zu Klammerpfeilstilen hinzufügen, die mit FancyArrowPatch in Matplotlib erstellt werden. Winkelannotationen sind hilfreich, um die Richtung und Größe von Winkeln in einem Diagramm anzuzeigen. Am Ende dieses Labs werden Sie in der Lage sein, Klammerpfeilstile mit Winkelannotationen zu erstellen und sie an Ihre spezifischen Bedürfnisse anzupassen.

VM-Tipps

Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu öffnen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Importieren der erforderlichen Bibliotheken und Einrichten des Diagramms

Zunächst müssen wir die erforderlichen Bibliotheken importieren und das Diagramm einrichten. Wir werden matplotlib.pyplot und numpy verwenden. Wir werden auch ein Figure- und ein Axes-Objekt erstellen, um unsere Daten darauf zu plotten.

import matplotlib.pyplot as plt
import numpy as np

from matplotlib.patches import FancyArrowPatch

fig, ax = plt.subplots()
ax.set(xlim=(0, 6), ylim=(-1, 5))
ax.set_title("Orientation of the bracket arrows relative to angleA and angleB")

Definieren einer Funktion, um den Punkt einer gedrehten vertikalen Linie zu erhalten

Wir werden eine Funktion definieren, die die Ursprungskoordinaten, die Linienlänge und den Winkel in Grad als Eingaben nimmt und die xy-Koordinaten des Endpunkts der vertikalen Linie zurückgibt, die um den angegebenen Winkel gedreht ist.

def get_point_of_rotated_vertical(origin, line_length, degrees):
    """Return xy coordinates of the vertical line end rotated by degrees."""
    rad = np.deg2rad(-degrees)
    return [origin[0] + line_length * np.sin(rad),
            origin[1] + line_length * np.cos(rad)]

Erstellen von Klammerpfeilen mit Winkelannotationen

Wir werden mit FancyArrowPatch drei Klammerpfeilstile mit Winkelannotationen erstellen. Jeder Klammerpfeil wird einen anderen Winkelwert für angleA und angleB haben. Wir werden auch vertikale Linien hinzufügen, um die Position der Winkelannotationen anzuzeigen.

style = ']-['
for i, angle in enumerate([-40, 0, 60]):
    y = 2*i
    arrow_centers = ((1, y), (5, y))
    vlines = ((1, y + 0.5), (5, y + 0.5))
    anglesAB = (angle, -angle)
    bracketstyle = f"{style}, angleA={anglesAB[0]}, angleB={anglesAB[1]}"
    bracket = FancyArrowPatch(*arrow_centers, arrowstyle=bracketstyle,
                              mutation_scale=42)
    ax.add_patch(bracket)
    ax.text(3, y + 0.05, bracketstyle, ha="center", va="bottom", fontsize=14)
    ax.vlines([line[0] for line in vlines], [y, y], [line[1] for line in vlines],
              linestyles="--", color="C0")

Hinzufügen von Winkelannotationspfeilen und -texten

Wir werden Winkelannotationspfeile und -texte zu jedem Klammerpfeilstil hinzufügen. Zunächst werden wir die oberen Koordinaten für die gezeichneten Patches bei angleA und angleB ermitteln. Dann werden wir die Verbindungsrichtungen für die Annotationspfeile definieren. Schließlich werden wir Pfeile und Annotationstexte zum Diagramm hinzufügen.

    ## Get the top coordinates for the drawn patches at A and B
    patch_tops = [get_point_of_rotated_vertical(center, 0.5, angle)
                  for center, angle in zip(arrow_centers, anglesAB)]
    ## Define the connection directions for the annotation arrows
    connection_dirs = (1, -1) if angle > 0 else (-1, 1)
    ## Add arrows and annotation text
    arrowstyle = "Simple, tail_width=0.5, head_width=4, head_length=8"
    for vline, dir, patch_top, angle in zip(vlines, connection_dirs,
                                            patch_tops, anglesAB):
        kw = dict(connectionstyle=f"arc3,rad={dir * 0.5}",
                  arrowstyle=arrowstyle, color="C0")
        ax.add_patch(FancyArrowPatch(vline, patch_top, **kw))
        ax.text(vline[0] - dir * 0.15, y + 0.7, f'{angle}°', ha="center",
                va="center")

Zeige das Diagramm an

Wir werden das Diagramm mit plt.show() anzeigen.

plt.show()

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie Winkelannotationen zu Klammerpfeilstilen hinzufügen, die mit FancyArrowPatch in Matplotlib erstellt wurden. Sie haben auch gelernt, wie Sie die Klammerpfeilstile an Ihre spezifischen Bedürfnisse anpassen. Indem Sie den Schritt-für-Schritt-Anleitungen und dem bereitgestellten Beispielcode folgen, sollten Sie jetzt in der Lage sein, Klammerpfeilstile mit Winkelannotationen in Ihren eigenen Matplotlib-Diagrammen zu erstellen.