python - Almacene las coordenadas del evento del clic del mouse con matplotlib
onclick mouseevent (2)
Se necesita llamar a mpl_connect solo una vez para conectar el evento al controlador de eventos. Comenzará a escuchar el evento de clic hasta que se desconecte. Y puedes usar
fig.canvas.mpl_disconnect(cid)
para desconectar el gancho del evento.
Lo que quieres hacer es algo como:
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)
Estoy tratando de implementar un simple evento de clic de mouse en matplotlib. Deseo trazar una figura y luego usar el mouse para seleccionar los límites inferior y superior para la integración. Hasta ahora, puedo imprimir las coordenadas en la pantalla pero no almacenarlas para usarlas luego en el programa. También me gustaría salir de la conexión a la figura después del segundo clic del mouse.
A continuación se muestra el código que actualmente traza y luego imprime las coordenadas.
Mis preguntas):
¿Cómo puedo guardar las coordenadas de la figura en la lista? es decir, haga clic = [xpos, ypos]
¿Es posible obtener dos conjuntos de coordenadas x para hacer una integración simple sobre esa sección de línea?
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()
¡Gracias a otterb por proporcionarnos la respuesta! He agregado una pequeña función tomada desde aquí ... Encuentre el valor más cercano en numpy array
En todo este código se trazará, esperará la selección de x puntos y luego devolverá los índices de la matriz x necesarios para cualquier integración, suma, etc.
Ejército de reserva,
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