Cliquez sur les coordonnées de l'événement avec matplotlib

j'essaie d'implémenter un simple événement de clic de souris dans matplotlib. Je souhaite tracer une figure, puis utilisez la souris pour sélectionner les limites inférieure et supérieure pour l'intégration. Jusqu'à présent, je suis en mesure d'imprimer les coordonnées à l'écran, mais pas de les stocker pour une utilisation ultérieure dans le programme. Je voudrais également sortir de la connexion à la figure après le deuxième clic de la souris.

ci-dessous est le code qui trace actuellement et imprime les coordonnées.

Mon Question (s):

Comment puis-je stocker les coordonnées de la figure à la liste? c'est à dire sur = [xpos, ypos]

Est-il possible d'obtenir deux ensembles de coordonnées x, afin de faire une simple intégration sur la section de ligne?

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()
19
demandé sur smashbro 2014-08-27 11:19:42

2 réponses

mpl_connect doit être appelé une seule fois pour connecter l'événement au gestionnaire d'événements. Il commencera à écouter l'événement de clic jusqu'à ce que vous déconnectez. Et vous pouvez utiliser

fig.canvas.mpl_disconnect(cid)

pour déconnecter l'événement crochet.

Ce que vous voulez faire est quelque chose comme:

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)
20
répondu otterb 2014-08-27 10:46:16

merci à otterb de nous avoir fourni la réponse! J'ai ajouté une petite fonction prise ici... Trouver le plus proche de la valeur dans un tableau numpy

dans tout ce code va tracer, attendre la sélection des points x et ensuite retourner les indices du tableau x nécessaires pour toute intégration, sommations, etc.

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
répondu smashbro 2017-05-23 11:47:09