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.
import numpy as np
import pylab
import matplotlib.pyplot as plt
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()
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.
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
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()
C'est fait.
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