2015-08-17 20 views
7

Come indicato in this question, sto tentando di aggiornare un grafico dinamicamente in un blocco appunti iPython (in una cella). La differenza è che non voglio tracciare nuove righe, ma che i miei x_data e y_data crescono ad ogni iterazione di un ciclo.Aggiornare dinamicamente il grafico nel notebook iPython

Quello che mi piacerebbe fare è:

import numpy as np 
import time 
plt.axis([0, 10, 0, 100]) # supoose I know what the limits are going to be 
plt.ion() 
plt.show() 
x = [] 
y = [] 
for i in range(10): 
    x = np.append(x, i) 
    y = np.append(y, i**2) 
    # update the plot so that it shows y as a function of x 
    time.sleep(0.5) 

ma voglio la trama di avere una leggenda, e se lo faccio

from IPython import display 
import time 
import numpy as np 
plt.axis([0, 10, 0, 100]) # supoose I know what the limits are going to be 
plt.ion() 
plt.show() 
x = [] 
y = [] 
for i in range(10): 
    x = np.append(x, i) 
    y = np.append(y, i**2) 
    plt.plot(x, y, label="test") 
    display.clear_output(wait=True) 
    display.display(plt.gcf()) 
    time.sleep(0.3) 
plt.legend() 

io alla fine con una leggenda che contiene 10 elementi. Se inserisco lo plt.legend() all'interno del ciclo, la legenda aumenta ad ogni iterazione ... Qualsiasi soluzione?

risposta

6

Attualmente, si sta creando un nuovo oggetto Assi per ogni volta che si plt.plot nel ciclo.

Quindi, se si cancella l'asse corrente (plt.gca().cla()) prima di utilizzare plt.plot, e mettere la leggenda all'interno del ciclo, funziona senza la leggenda che cresce ogni volta:

import numpy as np 
import time 
from IPython import display 

x = [] 
y = [] 
for i in range(10): 
    x = np.append(x, i) 
    y = np.append(y, i**2) 
    plt.gca().cla() 
    plt.plot(x,y,label='test') 
    plt.legend() 
    display.clear_output(wait=True) 
    display.display(plt.gcf()) 
    time.sleep(0.5) 

EDIT: Come @tcaswell ha sottolineato nei commenti, utilizzando il comando magico %matplotlib notebook fornisce una figura dal vivo che può aggiornare e ridisegnare.

+0

Meglio, ma se lo faccio, la legenda non è visibile fino al termine del ciclo –

+0

? per me va bene. Dove hai messo la leggenda? Deve essere prima delle due righe 'display' – tom

+0

Ho inserito la legenda() all'interno del ciclo, ma nell'ultima riga del ciclo. Ora l'ho messo dopo la trama() e funziona bene –

Problemi correlati