Indizes mit Polygon Selector auswählen

Beginner

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

Einführung

In diesem Lab wird gezeigt, wie das Polygon Selector-Tool in Matplotlib verwendet wird, um Indizes aus einer Sammlung auszuwählen. Mit dem Polygon Selector-Tool kann der Benutzer Punkte auf einem Graphen auswählen, indem er ein Polygon um sie zeichnet. Die ausgewählten Punkte werden dann hervorgehoben, während die nicht ausgewählten Punkte ausblenden. Die Indizes der ausgewählten Punkte werden in einem Array gespeichert, das dann für weitere Analysen verwendet werden kann.

Tipps für die VM

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.

Bibliotheken importieren

In diesem Schritt importieren wir die erforderlichen Bibliotheken für dieses Lab. Wir werden numpy und matplotlib für die Datenmanipulation und -visualisierung verwenden.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.widgets import PolygonSelector

Daten erstellen

In diesem Schritt werden wir einige Daten erstellen, um sie zu visualisieren. Wir werden einen Streudiagramm von Punkten auf einem Gitter erstellen.

fig, ax = plt.subplots()
grid_size = 5
grid_x = np.tile(np.arange(grid_size), grid_size)
grid_y = np.repeat(np.arange(grid_size), grid_size)
pts = ax.scatter(grid_x, grid_y)

Selektorklasse definieren

In diesem Schritt werden wir eine Klasse definieren, die es uns ermöglicht, Punkte aus dem Streudiagramm mit dem Polygon Selector-Tool auszuwählen. Diese Klasse wird die Indizes der ausgewählten Punkte in einem Array speichern.

class SelectFromCollection:
    """
    Wählen Sie Indizes aus einer matplotlib-Sammlung mithilfe von `PolygonSelector` aus.

    Die ausgewählten Indizes werden im `ind`-Attribut gespeichert. Dieses Tool blendet 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`
        Achsen, mit denen 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.poly = PolygonSelector(ax, self.onselect, draw_bounding_box=True)
        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.poly.disconnect_events()
        self.fc[:, -1] = 1
        self.collection.set_facecolors(self.fc)
        self.canvas.draw_idle()

需要注意的是,原文中wenn len(self.fc) == 0:这里的wenn应该是Wenn(大写),属于拼写错误,翻译时按照正确的来。还有erhöhe ValueError应该是erhöhe ValueError(这里可能也是拼写有误,推测应该是erhöhe ValueErrorerhöhe ValueError,即raise ValueError) ,翻译时按照正确逻辑翻译为引发 ValueError 。整体译文尽量贴近原文表述错误的样子呈现了代码中的问题部分。

Selektorbereich erstellen

In diesem Schritt werden wir eine Instanz der im Schritt 3 definierten Selektorklasse erstellen. Dies wird es uns ermöglichen, Punkte aus dem Streudiagramm mit dem Polygon Selector-Tool auszuwählen.

selector = SelectFromCollection(ax, pts)

Punkte auswählen

In diesem Schritt werden wir Punkte aus dem Streudiagramm mit dem Polygon Selector-Tool auswählen. Wir können Punkte auswählen, indem wir ein Polygon um sie zeichnen. Die ausgewählten Punkte werden hervorgehoben, während die nicht ausgewählten Punkte ausgeblendet werden.

print("Wählen Sie Punkte in der Abbildung aus, indem Sie ein Polygon um sie legen.")
print("Drücken Sie die 'esc'-Taste, um ein neues Polygon zu starten.")
print("Versuchen Sie, die 'Shift'-Taste gedrückt zu halten, um alle Eckpunkte zu bewegen.")
print("Versuchen Sie, die 'Ctrl'-Taste gedrückt zu halten, um einen einzelnen Eckpunkt zu bewegen.")
plt.show()

Selektorbereich trennen

In diesem Schritt werden wir den Selektorbereich trennen, um die von dem Polygon Selector-Tool verwendeten Ressourcen freizugeben.

selector.disconnect()

Ausgewählte Punkte ausgeben

In diesem Schritt werden wir die Koordinaten der ausgewählten Punkte ausgeben.

print('\nAusgewählte Punkte:')
print(selector.xys[selector.ind])

Zusammenfassung

In diesem Lab wird gezeigt, wie das Polygon Selector-Tool in Matplotlib verwendet werden kann, um Indizes aus einem Streudiagramm auszuwählen. Die Selektorklasse ermöglicht es dem Benutzer, Punkte auszuwählen, indem er ein Polygon um sie zeichnet. Die ausgewählten Punkte werden hervorgehoben, während die nicht ausgewählten Punkte ausgeblendet werden. Die Indizes der ausgewählten Punkte werden in einem Array gespeichert, das für weitere Analysen verwendet werden kann.