Foros del Web » Programando para Internet » Python »

Actualizar plot dinamicamente

Estas en el tema de Actualizar plot dinamicamente en el foro de Python en Foros del Web. Hola, es posible ir actualizando un plot, esto es, redibujandolo con cada nueva llegada de datos?? Solo destacar que lo que pretendo NO ES redibujar ...
  #1 (permalink)  
Antiguo 09/12/2013, 01:56
 
Fecha de Ingreso: octubre-2013
Mensajes: 59
Antigüedad: 11 años
Puntos: 0
Actualizar plot dinamicamente

Hola, es posible ir actualizando un plot, esto es, redibujandolo con cada nueva llegada de datos??

Solo destacar que lo que pretendo NO ES redibujar TODO el plot de nuevo cada vez, lo cual, en la iteracion 1000 seria muy pesado, lo que pretendo es IR ACTUALIZANDO cada vez el mismo plot con nuevos datos.

Yo, de momento, he hecho algo muy muy simple para intentar entender como va esto, de momento llegado hasta aqui:

Código Python:
Ver original
  1. import matplotlib.pyplot as plt
  2. import numpy
  3.  
  4.  
  5.  
  6.  
  7. def update_line(hl, new_data):
  8.     hl.set_xdata(numpy.append(hl.get_xdata(), new_data[0]))
  9.     hl.set_ydata(numpy.append(hl.get_ydata(), new_data[1]))
  10.     plt.draw()
  11.    
  12. if __name__ == "__main__":
  13.    
  14.     h1, = plt.plot([], [])
  15.     x = [0,1,2,3,4,5]
  16.     y = [1,2,1,3,1,2]
  17.     new_data = []
  18.    
  19.     for i in xrange(len(x)):
  20.        
  21.        
  22.         new_data = [x[i],y[i]]
  23.         update_line(h1,new_data)
  24.         new = raw_input('Update plot')

He itentado esperar una entrada de teclado despues de cada "actualizacion" del grafico para poder ir viendolo, pero de momento NO FUNCIONA.

Si alguien sabe algo mas sobre este tema, se lo agradeceria.
  #2 (permalink)  
Antiguo 09/12/2013, 13:38
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Actualizar plot dinamicamente

Pequeño ejemplo

Código Python:
Ver original
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3.  
  4. x = np.arange(-100, 100)
  5. y = ((.1 * x) ** 2)
  6.  
  7. plt.ion()
  8.  
  9. fig = plt.figure()
  10. ax = fig.add_subplot(111)
  11. line, = ax.plot(x, y)
  12. ax.set_xlim(-100, 100)
  13. ax.set_ylim(-10, 100)
  14. fig.canvas.draw()
  15.  
  16. for i in range(len(x)):
  17.     line.set_xdata(x[:i])
  18.     line.set_ydata(y[:i])
  19.     fig.canvas.draw()
  #3 (permalink)  
Antiguo 10/12/2013, 01:27
 
Fecha de Ingreso: octubre-2013
Mensajes: 59
Antigüedad: 11 años
Puntos: 0
Respuesta: Actualizar plot dinamicamente

Muchas gracias, he encontrado otra forma de hacerlo, de hecho he conseguido hacerla funcionar, y me llama la atencion que no se parece en nada, o muy poco a la que tu propones, que no la he probado pero voy a ello.

Esta ha sido mi solucion de momento:

Código Python:
Ver original
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from pylab import *
  4. import matplotlib.animation as animation
  5. import random
  6. import time
  7.  
  8.  
  9. fig = plt.figure(figsize=(8,6), dpi=150)
  10.  
  11.  
  12.  
  13. h=4
  14. a=1
  15. b=3
  16.  
  17.  
  18.  
  19. ylim(-2.5,10.5)
  20. xlim(-2.5,4.5)
  21. grid()
  22.  
  23. def data_gen():
  24.     i = 0
  25.     while i< 1:
  26.         R1 = random.random()
  27.         R2 = random.random()
  28.         x0 = (b - a)*R1 + a
  29.         y0 = h*R2
  30.         i = i + 1
  31.         yield x0, y0
  32.  
  33.  
  34. line, = plot([], [], linestyle='none', marker='o', color='r')
  35.  
  36.  
  37.  
  38. xdata, ydata = [], []
  39.  
  40. def run(data):
  41.     x0,y0 = data
  42.     xdata.append(x0)
  43.     ydata.append(y0)
  44.     line.set_data(xdata, ydata)
  45.     time.sleep(1)
  46.     return line,
  47.  
  48. ani = animation.FuncAnimation(fig, run, data_gen, blit=True, interval=0.5,repeat=False)
  49. plt.show()

Que te parece??

Si funciona bien, la tuya me parece mas sencilla y todo!!

Etiquetas: dinamicamente, gui
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:08.