2016-01-30 14 views
11

Sto cercando di creare un istogramma animato dal mio codice qui sotto. Posso creare singoli istogrammi per ogni volta, tuttavia non riesco a ottenere i risultati animati con la funzione matplotlib.animation o emulando il codice nello matplotlib tutorial.Istogramma animato Matplotlib

import numpy as np 
import matplotlib.pyplot as plt 


betas = [] # some very long list 
entropy = [] # some very long list 

for time in [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0 , 3.5, 4.0, 4.5 5.0, 5.5, 6.0, 6.5 , 7.0, 7.5, 8.0 , 8,5 , 9.0, 9.5 , 10.0]: 

    plt.figure('entropy distribution at time %s ' % time)   
    indexbetas = {i for i, j in enumerate(betas) if j == time} 
    desiredentropies = [x for i, x in enumerate(entropy) if i in indexbetas] #the desiredentropies list depends on time 

    n, bins, patches = plt.hist(desiredentropies, 20, alpha=0.75 , label = 'desired entropies') 

plt.xlabel(r"$S_{(\time=%d)}$" % time, fontsize=20) 
plt.ylabel('Frequency of entropies') 


plt.legend() 
plt.grid(True) 
plt.show() 

sto lottando in particolare con l'alimentazione la mia lista desiredentropies che dipende dalla elemento della lista time per l'animazione.

+0

esempio da tutorial richiede qualche secondo di esso funziona per me - Python 2.7.11 e 3.4.3/Linux Mint 17. Viene visualizzato un messaggio di errore in console/terminale/cmd.exe? – furas

+0

@furas Ho aggiunto una modifica al mio OP. Il mio problema principale è quello di inserire l'elenco dei desideri desiderati che desidero creare un istogramma, con il passare del tempo. Nota: l'elenco delle stazioni desiderate cambia per ogni elemento nel tempo. –

+0

Dovrai usare 'animation.FuncAnimation' – furas

risposta

5

Prova questo. In pratica, basta sfruttare FuncAnimation per aggiornare l'istogramma. Controlla il animation documentation per saperne di più sui vari parametri di quella funzione per controllare la velocità di aggiornamento e cose del genere.

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

n = 100 
number_of_frames = 10 
data = np.random.rand(n, number_of_frames) 

def update_hist(num, data): 
    plt.cla() 
    plt.hist(data[num]) 

fig = plt.figure() 
hist = plt.hist(data[0]) 

animation = animation.FuncAnimation(fig, update_hist, number_of_frames, fargs=(data,)) 
plt.show() 

Quello che facciamo qui è chiamare una funzione, update_hist che gestisce l'aggiornamento del istogramma e visualizzare i nuovi dati ad ogni passo. Facciamo questo cancellando l'asse e poi indicizzando nei nostri dati con l'num fornito, che è il numero di frame corrente.

+0

Come aggiorno la mia nuova lista delle desiderate desiderate in quanto la lista dipende dal tempo, cioè l'elemento nella lista temporale? –

+0

Sto lottando per adattarmi a questo con il mio codice. –

+0

Normalizza i tuoi indici in numeri interi e inserisci il codice nel tuo ciclo 'for' in' update_hist' –