it-swarm.com.de

Speichern Sie Mausklick-Ereigniskoordinaten mit matplotlib

Ich versuche ein einfaches Mausklick-Ereignis in Matplotlib zu implementieren. Ich möchte eine Figur plotten und dann mit der Maus die unteren und oberen Grenzen für die Integration auswählen ..__ Bislang kann ich die Koordinaten auf dem Bildschirm ausdrucken, aber nicht für die spätere Verwendung im Programm speichern. Ich möchte auch nach dem zweiten Mausklick die Verbindung zur Figur beenden.

Unten ist der Code, der aktuell die Koordinaten zeichnet und dann druckt.

Meine Fragen):

Wie kann ich Koordinaten aus der Liste in der Liste speichern? d. h. klick = [xpos, ypos]

Ist es möglich, zwei Sätze von x-Koordinaten zu erhalten, um eine einfache Integration über diesen Linienabschnitt durchzuführen?

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10,10)
y = x**2

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)

def onclick(event):
    global ix, iy
    ix, iy = event.xdata, event.ydata
    print 'x = %d, y = %d'%(
        ix, iy)

    global coords
    coords = [ix, iy]

    return coords


for i in xrange(0,1):

    cid = fig.canvas.mpl_connect('button_press_event', onclick)


plt.show()
20
smashbro

mpl_connect muss nur einmal aufgerufen werden, um das Ereignis mit dem Ereignishandler zu verbinden. Das Klickereignis wird so lange angehört, bis Sie die Verbindung trennen. Und du kannst verwenden 

fig.canvas.mpl_disconnect(cid)

um den Ereignishaken zu trennen.

Was Sie wollen, ist so etwas wie:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10,10)
y = x**2

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)

coords = []

def onclick(event):
    global ix, iy
    ix, iy = event.xdata, event.ydata
    print 'x = %d, y = %d'%(
        ix, iy)

    global coords
    coords.append((ix, iy))

    if len(coords) == 2:
        fig.canvas.mpl_disconnect(cid)

    return coords
cid = fig.canvas.mpl_connect('button_press_event', onclick)
21
otterb

Danke an otterb für die Antwort! Ich habe eine kleine Funktion hinzugefügt, die hier übernommen wurde ... Finde den nächstgelegenen Wert in numpy array

In all diesem Code wird geplottet, warten Sie auf die Auswahl von x Punkten und geben dann die Indizes des x-Arrays zurück, die für die Integration, Summierungen usw. erforderlich sind.

Ta,

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import trapz

def find_nearest(array,value):
    idx = (np.abs(array-value)).argmin()
    return array[idx]

# Simple mouse click function to store coordinates
def onclick(event):
    global ix, iy
    ix, iy = event.xdata, event.ydata

    # print 'x = %d, y = %d'%(
    #     ix, iy)

    # assign global variable to access outside of function
    global coords
    coords.append((ix, iy))

    # Disconnect after 2 clicks
    if len(coords) == 2:
        fig.canvas.mpl_disconnect(cid)
        plt.close(1)
    return


x = np.arange(-10,10)
y = x**2

fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x,y)

coords = []

# Call click func
cid = fig.canvas.mpl_connect('button_press_event', onclick)

plt.show(1)


# limits for integration
ch1 = np.where(x == (find_nearest(x, coords[0][0])))
ch2 = np.where(x == (find_nearest(x, coords[1][0])))

# Calculate integral
y_int = trapz(y[ch1[0][0]:ch2[0][0]], x = x[ch1[0][0]:ch2[0][0]])

print ''
print 'Integral between '+str(coords[0][0])+ ' & ' +str(coords[1][0])
print y_int
6
smashbro

Ich habe ein ähnliches Bedürfnis, aber dieser Code funktioniert nicht für mich. Ich habe es direkt kopiert/eingefügt (Anaconda 2.7), aber es scheint, dass fig.canvas.mpl_connect ('button_press_event', onclick) niemals auf Eingaben wartet, was Fehler in den darauf folgenden coords [n] [m] -Aufrufen auslöst. Vorschläge?

> Traceback (most recent call last):
> 
>   File "<ipython-input-5-d074e6221b24>", line 1, in <module>
>     runfile('C:/Users/xxx/Documents/Python/test/untitled0.py', wdir='C:/Users/xxx/Documents/Python/test')
> 
>   File
> "C:\Anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py",
> line 705, in runfile
>     execfile(filename, namespace)
> 
>   File
> "C:\Anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py",
> line 87, in execfile
>     exec(compile(scripttext, filename, 'exec'), glob, loc)
> 
>   File "C:/Users/xxx/Documents/Python/test/untitled0.py", line
> 45, in <module>
>     ch1 = np.where(x == (find_nearest(x, coords[0][0])))
> 
> IndexError: list index out of range
0
GroovyGeek