python matplotlib onclick mouseevent

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