¿Puedes trazar datos en vivo en matplotlib?

Estoy leyendo datos de un socket en un hilo y me gustaría trazar y actualizar la ttwig a medida que llegan nuevos datos. Codifiqué un pequeño prototipo para simular cosas pero no funciona:

import pylab import time import threading import random data = [] # This just simulates reading from a socket. def data_listener(): while True: time.sleep(1) data.append(random.random()) if __name__ == '__main__': thread = threading.Thread(target=data_listener) thread.daemon = True thread.start() pylab.figure() while True: time.sleep(1) pylab.plot(data) pylab.show() # This blocks :( 

 import matplotlib.pyplot as plt import time import threading import random data = [] # This just simulates reading from a socket. def data_listener(): while True: time.sleep(1) data.append(random.random()) if __name__ == '__main__': thread = threading.Thread(target=data_listener) thread.daemon = True thread.start() # # initialize figure plt.figure() ln, = plt.plot([]) plt.ion() plt.show() while True: plt.pause(1) ln.set_xdata(range(len(data))) ln.set_ydata(data) plt.draw() 

Si quieres ir muy rápido, deberías considerar el blit.

f.show() no bloquea, y puede usar draw para actualizar la figura.

 f = pylab.figure() f.show() while True: time.sleep(1) pylab.plot(data) pylab.draw()