Matplotlib Lasso-Demo

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 lernst du, wie du die Matplotlib-Bibliothek verwendest, um einen interaktiven Plot zu erstellen, der es Benutzern ermöglicht, eine Reihe von Punkten mit einem Lasso-Werkzeug auszuwählen. Du wirst auch lernen, wie du eine Callback-Funktion verwendest, um die Farbe der ausgewählten Punkte zu ändern.

Tipps für die virtuelle Maschine

Nachdem der Start der virtuellen Maschine abgeschlossen ist, klicke in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal musst du einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen von Jupyter Notebook nicht automatisiert werden.

Wenn du während des Lernens Probleme stellst, kannst du Labby gerne fragen. Gib nach der Sitzung Feedback, und wir werden das Problem für dich prompt beheben.

Bibliotheken importieren

Zunächst importieren wir die erforderlichen Bibliotheken für das Lab. Wir werden matplotlib verwenden, um den Plot zu erstellen, und numpy, um zufällige Daten zu generieren.

import matplotlib.pyplot as plt
import numpy as np

Erstellen der LassoManager-Klasse

Als nächstes erstellen wir die LassoManager-Klasse, die die Lasso-Funktionalität behandelt. Die __init__-Methode initialisiert das Plot- und das Collection-Objekt. Die callback-Methode ändert die Farbe der ausgewählten Punkte, und die on_press- und on_release-Methoden behandeln die Mausereignisse.

class LassoManager:
    def __init__(self, ax, data):
        ## Die Information darüber, ob ein Punkt ausgewählt wurde oder nicht, wird im
        ## Array der Collection gespeichert (0 = draußen, 1 = drinnen), das dann
        ## farbzugeordnet wird zu blau (draußen) und rot (drinnen).
        self.collection = RegularPolyCollection(
            6, sizes=(100,), offset_transform=ax.transData,
            offsets=data, array=np.zeros(len(data)),
            clim=(0, 1), cmap=mcolors.ListedColormap(["tab:blue", "tab:red"]))
        ax.add_collection(self.collection)
        canvas = ax.figure.canvas
        canvas.mpl_connect('button_press_event', self.on_press)
        canvas.mpl_connect('button_release_event', self.on_release)

    def callback(self, verts):
        data = self.collection.get_offsets()
        self.collection.set_array(path.Path(verts).contains_points(data))
        canvas = self.collection.figure.canvas
        canvas.draw_idle()
        del self.lasso

    def on_press(self, event):
        canvas = self.collection.figure.canvas
        if event.inaxes is not self.collection.axes or canvas.widgetlock.locked():
            return
        self.lasso = Lasso(event.inaxes, (event.xdata, event.ydata), self.callback)
        canvas.widgetlock(self.lasso)  ## erhalte ein Sperrrecht auf das Widget-Zeichnen

    def on_release(self, event):
        canvas = self.collection.figure.canvas
        if hasattr(self, 'lasso') and canvas.widgetlock.isowner(self.lasso):
            canvas.widgetlock.release(self.lasso)

Erstellen des Plots

Jetzt verwenden wir die LassoManager-Klasse, um einen interaktiven Plot zu erstellen. Die np.random.rand-Funktion generiert zufällige Datenpunkte, die geplottet werden.

if __name__ == '__main__':
    np.random.seed(19680801)
    ax = plt.figure().add_subplot(
        xlim=(0, 1), ylim=(0, 1), title='Lasso points using left mouse button')
    manager = LassoManager(ax, np.random.rand(100, 2))
    plt.show()

Zusammenfassung

In diesem Lab hast du gelernt, wie du Matplotlib verwendest, um einen interaktiven Plot zu erstellen, der es Benutzern ermöglicht, eine Reihe von Punkten mit einem Lasso-Werkzeug auszuwählen. Du hast auch gelernt, wie du eine Callback-Funktion verwendest, um die Farbe der ausgewählten Punkte zu ändern. Diese Funktionalität kann auf andere Projekte, die interaktive Datenselektion erfordern, erweitert werden.