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.