Klicken Sie auf das Python / Matplotlib-Diagramm, um Koordinatenwerte oder Tastatureingabewerte abzurufen

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.

Vorbereitung

import numpy as np
import pylab
import matplotlib.pyplot as plt
  1. Mausklick und Datenerfassung

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

temp.png

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.

  1. Bereiten Sie alle echten Masken vor
  2. Klicken Sie mit der rechten Maustaste und wählen Sie zweimal einen Punkt aus, um ihn zwischen den beiden Punkten zu markieren
  3. Doppelklicken Sie zur Bestätigung und brechen Sie mit der mittleren Taste ab
  4. Die Maske des bestimmten Markierungsteils wird falsch

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 temp2.png

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

aftermask.png

Es wurde getan.

  1. Tastaturwert abrufen

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

Recommended Posts

Klicken Sie auf das Python / Matplotlib-Diagramm, um Koordinatenwerte oder Tastatureingabewerte abzurufen
[Python Kivy] So erhalten Sie den Dateipfad durch Ziehen und Ablegen
Python> Wörterbuch> Werte ()> Alle Werte mithilfe von Werten abrufen ()
Fügen Sie auf beiden Seiten ein Konfidenzintervall von 95% hinzu, um mit Python / Matplotlib zu rechnen
Holen Sie sich das letzte Element des Arrays, indem Sie Zeichenfolgen in Python und PHP aufteilen
[Python] matplotlib: Formatieren Sie das Diagramm für Ihre Dissertation
[CGI] Führen Sie das Server-Python-Programm mit Vue.js + axios aus und rufen Sie die Ausgabedaten ab
Lassen Sie die SQL vom Dataset ausführen (Python OR Mapper)
Erhalten Sie Kommentare auf Youtube Live mit [Python] und [Pytchat]!
Das von Python berechnete VIF und das von Excel berechnete VIF sind unterschiedlich.
Installieren Sie django auf Python + Anaconda und starten Sie den Server
Holen Sie sich die passende Zeichenfolge in den regulären Ausdruck und verwenden Sie sie beim Ersetzen unter Python3 erneut
Python-Eingabe und Ausgabe
Holen Sie sich nur die Python-Version (z. B. 2.7.5) in die CentOS 7-Shell
Holen Sie sich den MIME-Typ in Python und bestimmen Sie das Dateiformat
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
So erhalten Sie alle Schlüssel und Werte im Wörterbuch
Holen Sie sich das aktuelle Datum und die aktuelle Uhrzeit in Python unter Berücksichtigung des Zeitunterschieds
Hinweise zur Farbfärbung im Matplotlib-Streudiagramm