Cliquez sur le diagramme python / matplotlib pour obtenir des valeurs de coordonnées ou des valeurs d'entrée au clavier

Il y a des moments où vous souhaitez afficher des données avec matplotlib sur python ou jupyter et les analyser manuellement avec une souris, une spécification de plage, une acquisition de valeur, etc. De plus, je suis désolé pour la phrase appropriée, mais c'est une note à ce moment-là. Je l'utilise pour gérer des données astronomiques et du code pour la musique, mais c'est utile lorsque je veux créer un outil d'analyse de données avec une interface graphique appropriée comme celle-là. Ceci est la page de référence. http://matplotlib.org/users/event_handling.html

Dans le cas de jupyter, vous ne pouvez pas le faire si vous utilisez% matplotlib inline, veuillez donc l'utiliser tel quel ou le notebook% matplotlib.

Préparation

import numpy as np
import pylab
import matplotlib.pyplot as plt
  1. Clic de souris et acquisition de données

def onclick(event):
    print 'event.button=%d,  event.x=%d, event.y=%d, event.xdata=%f, \
    event.ydata=%f'%(event.button, event.x, event.y, event.xdata, event.ydata)

Affiche les données appropriées du tableau x, y

fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(x,y)
cid = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()

Cliquez sur la figure avec la souris

event.button=1,  event.x=234, event.y=229, event.xdata=496.774194, event.ydata=1.011211
event.button=1,  event.x=257, event.y=182, event.xdata=570.967742, event.ydata=1.005703
event.button=1,  event.x=193, event.y=135, event.xdata=364.516129, event.ydata=1.000195
event.button=3,  event.x=193, event.y=135, event.xdata=364.516129, event.ydata=1.000195

Il affichera le numéro du bouton et la position sur lesquels vous avez cliqué comme ceci. Si vous cliquez avec le bouton gauche, event.button = 1, 2 au milieu et 3 à droite.

Puisque cet event.xdata est la valeur de x, trouvons l'index correspondant du tableau et traçons-le avec un point rouge pour que l'index soit affiché dans le titre. Pour cela, vous pouvez utiliser np.searchsorted, qui vous donne l'index à droite de cette valeur.

def oncpaint(event):
    ind=np.searchsorted(x,event.xdata)
    plt.title("You clicked index="+str(ind))
    ax.plot([x[ind]],[y[ind]],".",color="red")
    fig.canvas.draw()

temp.png

Y a-t-il un index cliqué dans le titre? Fondamentalement, vous pouvez obtenir des informations de manière interactive comme celle-ci. Cela ressemble à du Lego. Maintenant, utilisez-vous mac maintenant? Mac n'a-t-il pas qu'un seul bouton et donne trop de priorité à la mode? alors. Je veux faire diverses opérations telles que l'agrandissement par clic gauche (event.button = 1), et je veux faire les opérations que j'ai définies avec d'autres boutons. Vous pouvez donc utiliser une souris bon marché, puis connecter celle avec 3 boutons.

Ensuite, faisons quelque chose comme ça.

  1. Préparez tous les vrais masques
  2. Cliquez avec le bouton droit de la souris et sélectionnez un point deux fois pour marquer entre les deux points
  3. Double-cliquez pour confirmer, annulez avec le bouton du milieu
  4. Le masque de la partie de marque déterminée devient faux

Tous les vrais masques

mask=np.ones(len(x),dtype=bool)

Définition d'une partie de l'opération ci-dessus

def oncmask(event):
    global stat
    global leftind, rightind
    ind=np.searchsorted(x,event.xdata)
    plt.title("You clicked index="+str(ind))
    if event.button==3 and stat==1:
        leftind=ind
        ax.plot([x[ind]],[y[ind]],".",color="red")
        stat=2
    elif event.button==3 and stat==2:
        rightind=ind
        ax.plot(x[leftind:rightind],y[leftind:rightind],color="red")
        stat=3
        print leftind, rightind
    elif event.button==1 and event.dblclick==1 and stat==3:
        plt.title("Approved")
        mask[leftind:rightind]=False
        stat=1
    elif event.button==2 and stat==3:  
        plt.title("Canceled")
        ax.plot(x[leftind:rightind],y[leftind:rightind],color="blue")
        ax.plot([x[leftind]],[y[leftind]],".",color="green")
        stat=1
    fig.canvas.draw()

Cliquez deux fois avec le bouton droit de la souris pour sélectionner une zone, puis double-cliquez à gauche pour approuver! Appuyez sur le bouton du milieu pour recommencer. Comme ça temp2.png

Vérifions s'il était masqué

fig=plt.figure()
ax=fig.add_subplot(111)
plt.xlim(200,205)
ax.plot(x[mask],y[mask])
plt.show()

aftermask.png

C'est fait.

  1. Obtenir la valeur du clavier

Vous pouvez également obtenir des valeurs d'entrée au clavier. Effaçons-le avec flush cette fois.

import sys

Partie définition. Je l'ai mis à la fin lorsque j'appuie sur q.

def onkey(event):
    print('you pressed', event.key, event.xdata, event.ydata)
    if event.key == 'q':
        plt.close(event.canvas.figure)
    sys.stdout.flush()

Montrez la figure et essayez d'utiliser le clavier sur la figure.

fig=plt.figure()
ax=fig.add_subplot(111)
plt.xlim(200,205)
plt.title("q:quit")
ax.plot(x,y)
cid = fig.canvas.mpl_connect('key_press_event', onkey)
plt.show()

Ça ressemble à ça.

('you pressed', u'a', 201.38104838709677, 1.0182421874999998)
('you pressed', u'b', 201.38104838709677, 1.0182421874999998)
('you pressed', u'c', 201.38104838709677, 1.0182421874999998)
('you pressed', u'shift', 201.33064516129031, 1.0173046875)
('you pressed', u'A', 201.33064516129031, 1.0173046875)
('you pressed', u'shift', 201.32056451612902, 1.0168359375)
('you pressed', u'R', 201.32056451612902, 1.0164843749999999)
('you pressed', u'q', 201.21975806451613, 1.0033593750000001)

À bientôt.

Post-scriptum:

func.py


def oncpaint(event):
    ind=np.searchsorted(x,event.xdata)
    ax.plot([x[ind]],[y[ind]],".",color="red")
    fig.canvas.draw()

main.py


import builtins

builtins.x=np.linspace(0,1,100)
builtins.y=np.cos(x)
builtins.fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(x,y)
cid = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()

Si vous voulez écrire ceci dans un fichier séparé et l'appeler avec un module, vous voudrez peut-être faire de x ou fig une portée intégrée avec des fonctions intégrées à la destination de l'appel (veuillez me dire s'il existe un meilleur moyen).

Recommended Posts

Cliquez sur le diagramme python / matplotlib pour obtenir des valeurs de coordonnées ou des valeurs d'entrée au clavier
[Python Kivy] Comment obtenir le chemin du fichier par glisser-déposer
Python> dictionnaire> values ()> Obtenir toutes les valeurs à l'aide de values ()
Ajouter un intervalle de confiance de 95% des deux côtés pour la figure avec Python / Matplotlib
Obtenez le dernier élément du tableau en fractionnant les chaînes en Python et PHP
[Python] matplotlib: Formatez le diagramme de votre mémoire
[CGI] Exécutez le programme Python du serveur avec Vue.js + axios et obtenez les données de sortie
Obtenez le SQL exécuté par l'ensemble de données (mappeur Python OR)
Obtenez des commentaires sur youtube Live avec [python] et [pytchat]!
Le VIF calculé par Python et le VIF calculé par Excel sont différents .. ??
Installez django sur python + anaconda et démarrez le serveur
Récupérez la chaîne correspondante dans l'expression régulière et réutilisez-la lors du remplacement sur Python3
entrée et sortie python
Obtenez uniquement la version Python (telle que 2.7.5) sur le shell CentOS 7
Obtenez le type MIME en Python et déterminez le format de fichier
Créons un diagramme PRML avec Python, Numpy et matplotlib.
Comment obtenir toutes les clés et valeurs du dictionnaire
Obtenez la date et l'heure actuelles en Python, en tenant compte du décalage horaire
Remarques sur la coloration par valeur dans le diagramme de dispersion matplotlib