Matplotlib / python puntos seleccionables

Tengo un montón de datos de series de tiempo con puntos cada 5 segundos. Por lo tanto, puedo crear un gráfico de líneas e incluso suavizar los datos para tener un gráfico más suave. La pregunta es, ¿hay alguna forma en matplotlib o algo en python que me permita hacer clic en un punto válido para hacer algo? Entonces, por ejemplo, podría hacer clic en (10, 75) si ese dato existe en mis datos originales y luego podría hacer algo en Python.

¿Alguna idea? Gracias.

Para ampliar lo que dijo @tcaswell, consulte la documentación aquí: http://matplotlib.org/users/event_handling.html

Sin embargo, es posible que encuentre útil una demostración rápida de los eventos de selección:

import matplotlib.pyplot as plt def on_pick(event): artist = event.artist xmouse, ymouse = event.mouseevent.xdata, event.mouseevent.ydata x, y = artist.get_xdata(), artist.get_ydata() ind = event.ind print 'Artist picked:', event.artist print '{} vertices picked'.format(len(ind)) print 'Pick between vertices {} and {}'.format(min(ind), max(ind)+1) print 'x, y of mouse: {:.2f},{:.2f}'.format(xmouse, ymouse) print 'Data point:', x[ind[0]], y[ind[0]] print fig, ax = plt.subplots() tolerance = 10 # points ax.plot(range(10), 'ro-', picker=tolerance) fig.canvas.callbacks.connect('pick_event', on_pick) plt.show() 

Exactamente cómo abordará esto dependerá de qué artista esté usando (en otras palabras, ¿usó ax.plot vs. ax.scatter vs. ax.imshow ?).

Los eventos de selección tendrán diferentes atributos dependiendo del artista seleccionado. Siempre habrá event.artist y event.mouseevent . La mayoría de los artistas que tienen elementos individuales (por ejemplo, Line2D s, Collections , etc.) tendrán una lista del índice de los elementos seleccionados como event.ind .

Si desea dibujar un polígono y seleccionar puntos dentro, consulte: http://matplotlib.org/examples/event_handling/lasso_demo.html#event-handling-example-code-lasso-demo-py

Si en el caso de que desee vincular propiedades adicionales a su objeto de artista, por ejemplo, está trazando calificaciones de IMDB de varias películas y desea ver haciendo clic en un punto al que corresponde la película, puede hacerlo agregando un objeto personalizado. hasta el punto que graficaste, así:

 import matplotlib.pyplot as plt class custom_objects_to_plot: def __init__(self, x, y, name): self.x = x self.y = y self.name = name a = custom_objects_to_plot(10, 20, "a") b = custom_objects_to_plot(30, 5, "b") c = custom_objects_to_plot(40, 30, "c") d = custom_objects_to_plot(120, 10, "d") def on_pick(event): print(event.artist.obj.name) fig, ax = plt.subplots() for obj in [a, b, c, d]: artist = ax.plot(obj.x, obj.y, 'ro', picker=5)[0] artist.obj = obj fig.canvas.callbacks.connect('pick_event', on_pick) plt.show() 

Ahora, al hacer clic en uno de los puntos de la gráfica, se imprimirá la propiedad del nombre del objeto correspondiente.