Zeichnen von Formen mit Matplotlib-Widgets

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 wir lernen, wie man die RectangleSelector- und EllipseSelector-Widgets in Matplotlib verwendet, um ein Rechteck oder eine Ellipse von der Anfangsklickposition bis zur aktuellen Mausposition zu zeichnen.

VM-Tipps

Nachdem die VM gestartet 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 der 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

Wir beginnen mit dem Importieren der erforderlichen Bibliotheken: Matplotlib, Numpy und die RectangleSelector- und EllipseSelector-Widgets.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import EllipseSelector, RectangleSelector

Definieren der Auswahlrückruffunktion

Die Auswahlrückruffunktion wird jedes Mal aufgerufen, wenn der Benutzer ein Rechteck oder eine Ellipse auswählt. Die Funktion erhält die Klick- und Loslassereignisse als Argumente und druckt die Koordinaten des Rechtecks oder der Ellipse aus.

def select_callback(eclick, erelease):
    """
    Callback für die Linienauswahl.

    *eclick* und *erelease* sind die Drück- und Loslassereignisse.
    """
    x1, y1 = eclick.xdata, eclick.ydata
    x2, y2 = erelease.xdata, erelease.ydata
    print(f"({x1:3.2f}, {y1:3.2f}) --> ({x2:3.2f}, {y2:3.2f})")
    print(f"Die Buttons, die Sie verwendet haben, waren: {eclick.button} {erelease.button}")

Definieren der Schaltrückruffunktion

Die Schaltrückruffunktion wird jedes Mal aufgerufen, wenn der Benutzer die 't'-Taste drückt. Diese Funktion wechselt den Aktivstatus der RectangleSelector- und EllipseSelector-Widgets.

def toggle_selector(event):
    print('Taste gedrückt.')
    if event.key == 't':
        for selector in selectors:
            name = type(selector).__name__
            if selector.active:
                print(f'{name} deaktiviert.')
                selector.set_active(False)
            else:
                print(f'{name} aktiviert.')
                selector.set_active(True)

Erstellen der Figur und der Teilplots

Wir werden eine Figur mit zwei Teilplots erstellen, einen für den RectangleSelector und einen für den EllipseSelector.

fig = plt.figure(layout='constrained')
axs = fig.subplots(2)

Zeichnen von etwas in den Teilplots

Wir werden etwas in den Teilplots zeichnen, damit der Benutzer die Wirkung des RectangleSelector und des EllipseSelector sehen kann.

N = 100000  ## Wenn N groß ist, kann man die Verbesserung durch das Verwenden von Blitting sehen.
x = np.linspace(0, 10, N)

for ax in axs:
    ax.plot(x, np.sin(2*np.pi*x))  ## zeichnet etwas

Erstellen der RectangleSelector- und EllipseSelector-Widgets

Wir werden die RectangleSelector- und EllipseSelector-Widgets erstellen und sie zu den Teilplots hinzufügen.

selectors = []
for ax, selector_class in zip(axs, [RectangleSelector, EllipseSelector]):
    ax.set_title(f"Klicken und ziehen, um ein {selector_class.__name__} zu zeichnen.")
    selectors.append(selector_class(
        ax, select_callback,
        useblit=True,
        button=[1, 3],  ## deaktiviere mittlere Taste
        minspanx=5, minspany=5,
        spancoords='pixels',
        interactive=True))
    fig.canvas.mpl_connect('key_press_event', toggle_selector)
axs[0].set_title("Drücken Sie 't', um die Selektoren ein- und auszuschalten.\n"
                 + axs[0].get_title())

Zeige das Diagramm an

Schließlich werden wir das Diagramm dem Benutzer zeigen.

plt.show()

Zusammenfassung

In diesem Lab haben wir gelernt, wie man die RectangleSelector- und EllipseSelector-Widgets in Matplotlib verwendet, um ein Rechteck oder eine Ellipse von der anfänglichen Klickposition bis zur aktuellen Mausposition zu zeichnen. Wir haben auch gelernt, wie man eine Figur mit Teilplots erstellt, etwas in den Teilplots zeichnet und den aktiven Status der Widgets mithilfe eines Tastendruckereignisses umschaltet.