Gráficos interactivos de matplotlib (dibujar manualmente líneas en un gráfico)

He trazado con éxito un conjunto de datos de secuencia de fecha (el eje X es la fecha) utilizando matplotlib. Sin embargo, quiero poder dibujar manualmente líneas de una (fecha1, y1) a otra (fecha2, y2) en el gráfico trazado.

Parece que no puedo encontrar ningún ejemplo que muestre cómo hacer esto, o incluso si es posible.

Para resumir, esto es lo que quiero hacer:

  1. Dibuja un conjunto de líneas en el gráfico trazado
  2. Guarde los datos de línea dibujados manualmente en el archivo
  3. Cargue los datos de línea dibujados manualmente desde el archivo (para recrear el gráfico)
  4. Idealmente, me gustaría almacenar “metadatos” sobre las líneas dibujadas (por ejemplo, color, ancho de línea, etc.)

¿Puede alguien publicar un fragmento de esqueleto (preferiblemente con enlaces para obtener más información), para mostrar cómo puedo comenzar a implementar esto (los requisitos principales son la capacidad de trazar líneas manualmente en un gráfico y luego guardar / cargar las líneas en un diagtwig) ).

Nota: Por ‘manualmente’, me refiero a poder dibujar las líneas haciendo clic en un punto y luego haciendo clic en otro punto en el gráfico trazado. para dibujar una línea entre los dos puntos (o simplemente haciendo clic en un punto y arrastrando y soltando el mouse en otro punto en el gráfico trazado)

[[Actualizar]]

Dawe, muchas gracias por el fragmento que proporcionaste. Esto me permite hacer lo que estoy tratando de hacer; sin embargo, tan pronto como la línea se dibuja en el canvas (después del segundo clic del mouse), la GUI se bloquea y aparece este mensaje de advertencia en la consola:

/usr/local/lib/python2.6/dist-packages/matplotlib/backend_bases.py:2192: DeprecationWarning: Using default event loop until function specific to this GUI is implemented warnings.warn(str,DeprecationWarning) 

¿Sabe qué está causando esta advertencia y la abrupta terminación del progtwig?

Además, ¿es posible dibujar más de una línea en el gráfico? (Supongo que esto implicará escribir algún tipo de controlador de eventos que ejemplificará una variable linedrawer). En este momento, tengo la oportunidad de dibujar solo una línea antes de que la ‘aplicación’ finalice abruptamente.

Yo escribiría algo como esto:

 import matplotlib.pyplot as plt class LineDrawer(object): lines = [] def draw_line(self): ax = plt.gca() xy = plt.ginput(2) x = [p[0] for p in xy] y = [p[1] for p in xy] line = plt.plot(x,y) ax.figure.canvas.draw() self.lines.append(line) 

Usando ginput() puedes evitar un manejo de eventos más complicado. La forma en que ‘funciona’ es que ttwig algo:

 plt.plot([1,2,3,4,5]) ld = LineDrawer() ld.draw_line() # here you click on the plot 

Para guardar / cargar los datos de línea en un archivo, puede implementar fácilmente un método utilizando pickle o shelve . También puede pasar los metadatos necesarios por el método draw_line()