Lasso Selector Demo Sgskip

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 mit dem Lasso-Werkzeug in Python Matplotlib interaktiv Datenpunkte auswählen kannst. Du zeichnest zunächst einen Streudiagramm und wählst dann einige Punkte aus, indem du einen Lasso-Schleife um die Punkte auf dem Graphen ziehst. Um zu zeichnen, klicke einfach auf den Graphen, halte die Maustaste gedrückt und ziehe sie um die Punkte, die du auswählen möchtest.

Tipps für die VM

Nachdem die VM gestartet ist, klicke in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu öffnen.

Manchmal musst du 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 du während des Lernens Probleme hast, kannst du Labby gerne fragen. Gib nach der Sitzung Feedback, und wir werden das Problem für dich prompt beheben.

Bibliotheken importieren

Importiere die erforderlichen Bibliotheken, einschließlich numpy, Path und LassoSelector.

import numpy as np
from matplotlib.path import Path
from matplotlib.widgets import LassoSelector

Erstellen der Auswahlklasse

Erstelle die Klasse SelectFromCollection, die Indizes aus einer Matplotlib-Sammlung mithilfe von LassoSelector auswählen wird.

class SelectFromCollection:
    """
    Wählt Indizes aus einer matplotlib-Sammlung mithilfe von `LassoSelector` aus.

    Die ausgewählten Indizes werden im Attribut `ind` gespeichert. Dieses Tool verblendet die Punkte aus, die nicht Teil der Auswahl sind (d.h., verringert ihre Alpha-Werte). Wenn Ihre Sammlung einen Alpha-Wert < 1 hat, wird dieses Tool die Alpha-Werte permanent ändern.

    Beachten Sie, dass dieses Tool Sammlungselemente anhand ihrer *Ursprünge* (d.h., `offsets`) auswählt.

    Parameter
    ----------
    ax : `~matplotlib.axes.Axes`
        Achse, mit der interagiert werden soll.
    collection : `matplotlib.collections.Collection` Unterklasse
        Sammlung, aus der Sie auswählen möchten.
    alpha_other : 0 <= float <= 1
        Um eine Auswahl hervorzuheben, setzt dieses Tool alle ausgewählten Punkte auf einen Alpha-Wert von 1 und nicht ausgewählte Punkte auf *alpha_other*.
    """

    def __init__(self, ax, collection, alpha_other=0.3):
        self.canvas = ax.figure.canvas
        self.collection = collection
        self.alpha_other = alpha_other

        self.xys = collection.get_offsets()
        self.Npts = len(self.xys)

        ## Stellen Sie sicher, dass wir separate Farben für jedes Objekt haben
        self.fc = collection.get_facecolors()
        wenn len(self.fc) == 0:
            erhöhe ValueError('Sammlung muss eine Flächeneigenschaft haben')
        elif len(self.fc) == 1:
            self.fc = np.tile(self.fc, (self.Npts, 1))

        self.lasso = LassoSelector(ax, onselect=self.onselect)
        self.ind = []

    def onselect(self, verts):
        path = Path(verts)
        self.ind = np.nonzero(path.contains_points(self.xys))[0]
        self.fc[:, -1] = self.alpha_other
        self.fc[self.ind, -1] = 1
        self.collection.set_facecolors(self.fc)
        self.canvas.draw_idle()

    def disconnect(self):
        self.lasso.disconnect_events()
        self.fc[:, -1] = 1
        self.collection.set_facecolors(self.fc)
        self.canvas.draw_idle()

Hinweis: Es gibt einige Fehler in der obigen Übersetzung. Hier ist die korrigierte Version:

Erstellen der Auswahlklasse

Erstelle die Klasse SelectFromCollection, die Indizes aus einer Matplotlib-Sammlung mithilfe von LassoSelector auswählen wird.

class SelectFromCollection:
    """
    Wählt Indizes aus einer matplotlib-Sammlung mithilfe von `LassoSelector` aus.

    Die ausgewählten Indizes werden im Attribut `ind` gespeichert. Dieses Tool verblendet die Punkte aus, die nicht Teil der Auswahl sind (d.h., verringert ihre Alpha-Werte). Wenn Ihre Sammlung einen Alpha-Wert < 1 hat, wird dieses Tool die Alpha-Werte permanent ändern.

    Beachten Sie, dass dieses Tool Sammlungselemente anhand ihrer *Ursprünge* (d.h., `offsets`) auswählt.

    Parameter
    ----------
    ax : `~matplotlib.axes.Axes`
        Achse, mit der interagiert werden soll.
    collection : `matplotlib.collections.Collection` Unterklasse
        Sammlung, aus der Sie auswählen möchten.
    alpha_other : 0 <= float <= 1
        Um eine Auswahl hervorzuheben, setzt dieses Tool alle ausgewählten Punkte auf einen Alpha-Wert von 1 und nicht ausgewählte Punkte auf *alpha_other*.
    """

    def __init__(self, ax, collection, alpha_other=0.3):
        self.canvas = ax.figure.canvas
        self.collection = collection
        self.alpha_other = alpha_other

        self.xys = collection.get_offsets()
        self.Npts = len(self.xys)

        ## Stellen Sie sicher, dass wir separate Farben für jedes Objekt haben
        self.fc = collection.get_facecolors()
        if len(self.fc) == 0:
            raise ValueError('Collection must have a facecolor')
        elif len(self.fc) == 1:
            self.fc = np.tile(self.fc, (self.Npts, 1))

        self.lasso = LassoSelector(ax, onselect=self.onselect)
        self.ind = []

    def onselect(self, verts):
        path = Path(verts)
        self.ind = np.nonzero(path.contains_points(self.xys))[0]
        self.fc[:, -1] = self.alpha_other
        self.fc[self.ind, -1] = 1
        self.collection.set_facecolors(self.fc)
        self.canvas.draw_idle()

    def disconnect(self):
        self.lasso.disconnect_events()
        self.fc[:, -1] = 1
        self.collection.set_facecolors(self.fc)
        self.canvas.draw_idle()

Erstellen des Streudiagramms

Erstelle ein Streudiagramm mit zufällig generierten Daten.

np.random.seed(19680801)
data = np.random.rand(100, 2)

subplot_kw = dict(xlim=(0, 1), ylim=(0, 1), autoscale_on=False)
fig, ax = plt.subplots(subplot_kw=subplot_kw)
pts = ax.scatter(data[:, 0], data[:, 1], s=80)
selector = SelectFromCollection(ax, pts)

Akzeptieren der ausgewählten Punkte

Akzeptiere die ausgewählten Punkte mit der Enter-Taste und drucke sie in der Konsole aus.

def accept(event):
    if event.key == "enter":
        print("Ausgewählte Punkte:")
        print(selector.xys[selector.ind])
        selector.disconnect()
        ax.set_title("")
        fig.canvas.draw()

fig.canvas.mpl_connect("key_press_event", accept)
ax.set_title("Drücken Sie Enter, um die ausgewählten Punkte zu akzeptieren.")

plt.show()

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie mit dem Lasso-Werkzeug interaktiv Datenpunkte mit Python Matplotlib auswählen. Sie haben ein Streudiagramm erstellt, einige Punkte ausgewählt, indem Sie eine Lasso-Schleife um die Punkte im Graphen gezeichnet haben, und dann die ausgewählten Punkte mit der Enter-Taste akzeptiert.