2013-09-13 12 views
10

Odczytuję dane z gniazda w jednym wątku i chcę wydrukować i zaktualizować wykres w miarę nadejścia nowych danych. I kodowane małą prototyp do symulacji rzeczy, ale to nie działa:Czy umieścisz dane na żywo w matplotlib?

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 :(
+0

http://stackoverflow.com/questions/14665636/time-sleep-required-to-keep-qthread-responsive – tacaswell

+0

http://stackoverflow.com/questions/8955869/why-is-plotting-with-matplotlib -so-slow/8956211 # 8956211 – tacaswell

+0

http://stackoverflow.com/questions/11874767/real-time-plotting-in-while-loop-w-matplotlib/15724978#15724978 – tacaswell

Odpowiedz

9
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() 

Jeśli chcesz jechać bardzo szybko, należy spojrzeć na blittingiem.

+0

Poszukuję również sposobu wyświetlania wykresu strumieniowego. Próbowałem tego fragmentu kodu i otrzymałem "AttributeError:" obiekt modułu "nie ma atrybutu" figure "". Potem próbowałem "zaimportować matplotlib.pylab jako PLT" zamiast pylab i otrzymałem "RuntimeError: xdata i ydata muszą być tej samej długości". Coś nie tak z moim środowiskiem? Używam Pythona 2.7 –

+0

@GregDan Zobacz zmiany. – tacaswell

+0

Dzięki. Ta jest lepsza ... po prostu dodaj ")" w ln.set_xdata (zakres (len (dane)) –

-1

f.show() nie blokuje, a można użyć draw zaktualizować figurę.

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

'show' nie blokuje tylko wtedy, gdy włączony jest tryb interaktywny – tacaswell

Powiązane problemy