2013-11-04 8 views
7

Voglio creare un grafico tracciato programma in tempo reale che prende in ingresso dalla porta seriale. Inizialmente, avevo provato un sacco di codice che ha postato su siti web, ma nessuno di loro ha lavorato. Così, ho deciso di scrivere il codice per conto mio, integrando parti di codice che ho visto sui siti web. Ma il problema è il grafico apparirà solo quando il programma termina, in altre parole, fuori dal giro. Mentre è nel ciclo, non mostra nulla, solo una tela bianca. Sono ancora abbastanza nuovo per Python. Ecco il mio codice.trama matplotlib in tempo reale non funziona, mentre ancora in un ciclo

import matplotlib.pyplot as plt 
import time 
import random 
from collections import deque 
import numpy as np 

# simulates input from serial port 
def random_gen(): 
    while True: 
     val = random.randint(1,10) 
     yield val 
     time.sleep(0.1) 


a1 = deque([0]*100) 
ax = plt.axes(xlim=(0, 20), ylim=(0, 10)) 
d = random_gen() 

line, = plt.plot(a1) 
plt.ion() 
plt.ylim([0,10]) 
plt.show() 

for i in range(0,20): 
    a1.appendleft(next(d)) 
    datatoplot = a1.pop() 
    line.set_ydata(a1) 
    plt.draw() 
    print a1[0] 
    i += 1 
    time.sleep(0.1) 

Inoltre, utilizzo la licenza accademica di Enthought Canopy versione 1.1.0.

+0

e http://stackoverflow.com/questions/14265513/matplotlib-real-time-linear-line/14266609# 14266609 – tacaswell

+0

e http://stackoverflow.com/questions/18791722/can-you-plot-live-data-in-matplotlib/18793416#18793416 – tacaswell

risposta

20

Ecco la soluzione aggiungere questo plt.pause(0.0001) nel vostro ciclo, come di seguito:

import matplotlib.pyplot as plt 
import time 
import random 
from collections import deque 
import numpy as np 

# simulates input from serial port 
def random_gen(): 
    while True: 
     val = random.randint(1,10) 
     yield val 
     time.sleep(0.1) 


a1 = deque([0]*100) 
ax = plt.axes(xlim=(0, 20), ylim=(0, 10)) 
d = random_gen() 

line, = plt.plot(a1) 
plt.ion() 
plt.ylim([0,10]) 
plt.show() 

for i in range(0,20): 
    a1.appendleft(next(d)) 
    datatoplot = a1.pop() 
    line.set_ydata(a1) 
    plt.draw() 
    print a1[0] 
    i += 1 
    time.sleep(0.1) 
    plt.pause(0.0001)      #add this it will be OK. 
+0

Grazie mille! Ho lavorato a questo più di una settimana. Funziona molto bene. Mi aiuti molto. Ho ancora una domanda. Questo rallenta anche l'input in streaming un po '. C'è un modo per ottenere i dati e tracciarli in modo indipendente? O devo scrivere diverse funzioni per il plottaggio e lo streaming o il buffering? O il tempo di attesa è così piccolo che posso trascurarlo? – Nabs

+2

Sì, questo funziona. Nessuna risposta ha funzionato veramente per me data [qui] (http://stackoverflow.com/questions/11874767/real-time-plotting-in-while-loop-with-matplotlib). –

+0

eccellente e molto veloce. Se lo vuoi ancora più veloce, basta prendere il tempo. Dormi! Grazie per il suggerimento qui, proprio quello di cui avevo bisogno. – bretcj7

Problemi correlati