[PYTHON] Sélection de zone de boîte par GUI sur le tracé Matplotlib

introduction

J'ai écrit le code pour sélectionner la zone de la boîte avec la souris sur le tracé de matplotlib et obtenir le résultat (coordonnées). Pour y parvenir, nous utilisons un module appelé matplotlib.widgets. Bien sûr, [exemple de code] [exemple de code] répertorié dans matplotlib.org convient, mais comme les coordonnées ne peuvent pas être stockées telles quelles, il est nécessaire de l'implémenter comme dans la classe suivante. Je pense que oui. De plus, je l'ai arrangé pour que la boîte colorée reste après la confirmation de la zone (dans [Exemple de code] [exemple de code], la boîte disparaît après confirmation).

rectselect.py Importez et utilisez le rectselect.py suivant comme module. Puisque la fonction release est impliquée dans l'organisation des boîtes colorées, si vous souhaitez supprimer la boîte après confirmation, vous pouvez commenter la ligne liée à release.

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()

Exemple de code

En utilisation réelle, cela fonctionne si vous mettez une instance RectSelect juste avant plt.show (). Vous pouvez également spécifier explicitement les «axes» cibles. Vous trouverez ci-dessous l'opération réelle.

python


import numpy as np
import matplotlib.pyplot as plt
from rectselect import RectSelect
#Quelque chose d'intrigue
x = np.random.random(20) * 10
y = np.random.random(20) * 10
plt.plot(x,y,'.')
#Sélection de boîte
region = RectSelect()
plt.show()
#En bas à gauche de la boîte(blc)Et en haut à droite(trc)Afficher les coordonnées de
print(region.blc) # --> (2.338709677419355, 3.7239583333333335)
print(region.trc) # --> (8.4879032258064502, 8.671875)

Boîte sélectionnée

La zone sélectionnée est affichée entourée d'une ligne. select.png

Après avoir confirmé la sélection de la boîte

La zone sélectionnée est remplie et affichée. release.png

Recommended Posts

Sélection de zone de boîte par GUI sur le tracé Matplotlib
Afficher les tracés matplotlib sur Tensorboard
Traitement de fichiers multiples avec Kivy + Matplotlib + Draw Graph sur GUI