2012-02-03 29 views
9

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

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

En resumen, esto es lo que quiero hacer:

  1. Dibuje un conjunto de líneas en el gráfico representado
  2. Guardar los datos de la línea extraídas manualmente para presentar
  3. cargar los datos de línea trazada manualmente de archivo (para volver a crear el gráfico)
  4. Idealmente, me gustaría almacenar 'de datos meta' sobre las líneas dibujadas (por ejemplo, color, línea anchura etc)

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

Nota: Con 'manualmente', quiero ser capaz de dibujar las líneas haciendo clic en un punto y luego haciendo clic en otro punto del gráfico trazado. para dibujar una línea entre los dos puntos (o simplemente haciendo clic en un punto y arrastrando y soltando el ratón en otro punto en el gráfico representado)

[[Update]]

dawe, gracias mucho por el fragmento que proporcionó Esto me permite hacer lo que intento hacer, sin embargo, tan pronto como se dibuja la línea en el lienzo (después del segundo clic del mouse), la GUI falla 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) 

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

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 creará una instancia de una variable de alineador). Por el momento, tengo la oportunidad de dibujar solo una línea antes de que la 'aplicación' termine bruscamente.

+0

"Manualmente" es ambiguo (y ponerlo en negrita no resuelve la ambigüedad). ¿Quiere decir manualmente haciendo clic en un punto y luego en otro, o quiere decir manualmente escribiendo algo? ¿O sería suficiente? – DSM

+0

@DSM: aclaró el significado de 'manual' como se usa en la pregunta.HTH –

+0

http://matplotlib.sourceforge.net/api/widgets_api.html puede ser el lugar para comenzar. –

Respuesta

9

me gustaría escribir 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() puede evitar el manejo de eventos más complicado. La forma en que 'funciona' que es algo parcela:

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

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

+2

+1 por código que me lleva allí (casi). ¡Esto es ** EXACTAMENTE ** lo que estoy tratando de hacer !. ¡Muchas gracias!. Hay un pequeño problema con el fragmento actual (aparte del pequeño problema del espacio de nombres). Cuando ejecuto el script, me permite dibujar en el lienzo haciendo clic (como quería); sin embargo, al hacer clic en el segundo mouse, cuando se dibuja la línea, la GUI se bloquea inmediatamente y aparece un kessage de advertencia en la consola. (Consulte mi pregunta actualizada) –

+0

Asegúrese de ejecutar este código en el modo pylab de IPython: 'ipython -pylab'. Esto configura el bucle de eventos para el back-end que está utilizando correctamente, haciendo que esta interactividad rápida y sucia funcione. – dawe

Cuestiones relacionadas