Es gibt Zeiten, in denen Sie Daten mit matplotlib auf Python oder Jupyter anzeigen und manuell mit einer Maus, einer Bereichsspezifikation, einer Werterfassung usw. analysieren möchten. Es tut mir auch leid für den entsprechenden Satz, aber es ist zu diesem Zeitpunkt ein Memo. Ich verwende es, um astronomische Daten und Code für Musik zu verarbeiten, aber es ist nützlich, wenn ich ein Datenanalysetool mit einer geeigneten GUI wie dieser erstellen möchte. Dies ist die Referenzseite. http://matplotlib.org/users/event_handling.html
Im Fall von Jupyter können Sie dies nicht tun, wenn Sie% matplotlib inline ausführen. Verwenden Sie es daher unverändert oder% matplotlib notebook.
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)
Lassen Sie uns die entsprechenden x, y-Array-Daten anzeigen
fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(x,y)
cid = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()
Klicken Sie mit der Maus auf die Figur
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
Es zeigt die Tastennummer und Position an, auf die Sie so geklickt haben. Wenn Sie mit der linken Maustaste klicken, ist event.button = 1, 2 in der Mitte und 3 rechts.
Da diese event.xdata der Wert von x ist, suchen wir den entsprechenden Index des Arrays und zeichnen ihn mit einem roten Punkt, sodass der Index im Titel angezeigt wird. Dazu können Sie np.searchsorted verwenden, wodurch Sie den Index rechts von diesem Wert erhalten.
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()
Gibt es einen angeklickten Index im Titel? Grundsätzlich können Sie Informationen auf diese Weise interaktiv abrufen. Es sieht aus wie Lego. Verwenden Sie jetzt Mac? Hat der Mac nicht nur einen Knopf und gibt der Mode zu viel Priorität? damit. Ich möchte verschiedene Operationen ausführen, z. B. die Vergrößerung durch Klicken mit der linken Maustaste (event.button = 1), und ich möchte die Operationen ausführen, die ich mit anderen Schaltflächen definiert habe. Sie können also eine billige Maus verwenden und diese dann mit 3 Tasten verbinden.
Als nächstes machen wir so etwas.
Alle wahren Masken
mask=np.ones(len(x),dtype=bool)
Definitionsteil der obigen Operation
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()
Klicken Sie zweimal mit der rechten Maustaste, um einen Bereich auszuwählen, und doppelklicken Sie nach links, um zu genehmigen. Drücken Sie die mittlere Taste, um von vorne zu beginnen. So was
Lassen Sie uns überprüfen, ob es maskiert war
fig=plt.figure()
ax=fig.add_subplot(111)
plt.xlim(200,205)
ax.plot(x[mask],y[mask])
plt.show()
Es wurde getan.
Sie können auch Tastatureingabewerte abrufen. Lassen Sie es uns diesmal mit Flush löschen.
import sys
Definitionsteil. Ich setze es auf Ende, wenn ich q drücke.
def onkey(event):
print('you pressed', event.key, event.xdata, event.ydata)
if event.key == 'q':
plt.close(event.canvas.figure)
sys.stdout.flush()
Zeigen Sie die Figur und versuchen Sie, die Tastatur auf der Figur zu verwenden.
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()
Es sieht aus wie das.
('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)
Bis bald.
Nachtrag:
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()
Wenn Sie dies in eine separate Datei schreiben und mit dem Modul aufrufen möchten, möchten Sie möglicherweise einen integrierten x- oder fig-Bereich mit integrierten Funktionen am Anrufziel erstellen (bitte sagen Sie mir, ob es einen besseren Weg gibt).