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