[PYTHON] Auswahl des Boxbereichs per GUI auf dem Matplotlib-Plot

Einführung

Ich habe den Code geschrieben, um den Boxbereich mit der Maus auf dem Plot von matplotlib auszuwählen und das Ergebnis (Koordinaten) zu erhalten. Um dies zu erreichen, verwenden wir ein Modul namens "matplotlib.widgets". Natürlich ist [Beispielcode] [Beispielcode], der in matplotlib.org aufgeführt ist, in Ordnung, aber da Koordinaten nicht so gespeichert werden können, wie sie sind, ist es notwendig, sie wie in der folgenden Klasse zu implementieren. Ich denke, dort ist. Außerdem habe ich es so angeordnet, dass das farbige Feld nach der Bestätigung des Bereichs erhalten bleibt (in [Beispielcode] [Beispielcode] verschwindet das Feld nach Bestätigung).

rectselect.py Importieren und verwenden Sie die folgende rectselect.py als Modul. Die Funktion "Freigeben" ist an der Anordnung der farbigen Kästchen beteiligt. Wenn Sie das Kästchen nach der Bestätigung löschen möchten, können Sie die Zeile "Freigeben" auskommentieren.

rectselect.py


import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from matplotlib.widgets import RectangleSelector

class RectSelect(object):
    def __init__(self, ax=None):
        self.ax = ax or plt.gca()
        self.rect = Rectangle((0,0), 0, 0, color='orange', alpha=0.5)
        self.ax.add_patch(self.rect)
        self.blc = np.zeros(2)
        self.trc = np.zeros(2)

        def selector(event):
            if event.key in ['Q', 'q'] and selector.RS.active:
                print ('RectSelect deactivated.')
                selector.RS.set_active(False)
            if event.key in ['A', 'a'] and not selector.RS.active:
                print ('RectSelect activated.')
                selector.RS.set_active(True)

        selector.RS = RectangleSelector(self.ax, self.callback)
        self.ax.figure.canvas.mpl_connect('key_press_event', selector)
        self.ax.figure.canvas.mpl_connect('button_release_event', self.release)

    def callback(self, eclick, erelease):
        x0, x1 = eclick.xdata, erelease.xdata
        y0, y1 = eclick.ydata, erelease.ydata
        self.blc = min(x0, x1), min(y0, y1)
        self.trc = max(x0, x1), max(y0, y1)
        blc_print = '({:0.4},{:0.4})'.format(*self.blc)
        trc_print = '({:0.4},{:0.4})'.format(*self.trc)
        print('blc={}, trc={}'.format(blc_print, trc_print))

    def release(self, event):
        self.rect.set_width(self.trc[0] - self.blc[0])
        self.rect.set_height(self.trc[1] - self.blc[1])
        self.rect.set_xy(self.blc)
        self.ax.figure.canvas.draw()

Beispielcode

In der Praxis funktioniert es, wenn Sie eine RectSelect-Instanz direkt vor plt.show () einfügen. Sie können die Zielachsen auch explizit angeben. Unten ist der tatsächliche Betrieb.

python


import numpy as np
import matplotlib.pyplot as plt
from rectselect import RectSelect
#Etwas Verschwörung
x = np.random.random(20) * 10
y = np.random.random(20) * 10
plt.plot(x,y,'.')
#Boxauswahl
region = RectSelect()
plt.show()
#Unten links in der Box(blc)Und oben rechts(trc)Koordinaten von anzeigen
print(region.blc) # --> (2.338709677419355, 3.7239583333333335)
print(region.trc) # --> (8.4879032258064502, 8.671875)

Feld ausgewählt

Der ausgewählte Bereich wird von einer Linie umgeben angezeigt. select.png

Nach Bestätigung der Boxauswahl

Der ausgewählte Bereich wird ausgefüllt und angezeigt. release.png

Recommended Posts

Auswahl des Boxbereichs per GUI auf dem Matplotlib-Plot
Zeigen Sie Matplotlib-Diagramme auf Tensorboard an
Verarbeitung mehrerer Dateien mit Kivy + Matplotlib + Draw Graph auf der GUI