2013-01-02 33 views
8

Sto cercando di animare contorni in matplotlib 1.1.0Animazione con contorni matplotlib

Sulla base: http://www.mail-archive.com/[email protected]/msg17614.html, http://matplotlib.1069221.n5.nabble.com/Matplotlib-1-1-0-animation-vs-contour-plots-td18703.html e http://www.scipy.org/Cookbook/Matplotlib/Gridding_irregularly_spaced_data

from numpy import linspace,exp,vstack 
from scipy.interpolate import griddata 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from numpy.random import uniform, seed 

def main(): 
    seed(1234) 
    x = uniform(-2,2,100) 
    y = uniform(-2,2,100) 
    data = vstack((x*exp(-x**2-y**2),0.5*x*exp(-x**2-y**2),0.2*x*exp(-x**2-y**2))) 
    xi = linspace(min(x), max(x)) 
    yi = linspace(min(y), max(y)) 
    zi = [] 
    numframes = data.shape[0] 
    for ii in range(numframes): 
     zi.append(griddata((x, y), data[ii], (xi[None,:], yi[:,None]), method='cubic')) 

    fig = plt.figure() 
    im = plt.contour(xi, yi, zi[0], 15, linewidths=0.5, colors='k') 
    ani = animation.FuncAnimation(fig, update_contour_plot, frames=xrange(numframes), fargs=(zi, im, fig, xi, yi), interval=100) 
    plt.colorbar() 
    plt.show() 

def update_contour_plot(i, data, im, fig, xi, yi): 
    for coll in im.collections: 
     try: 
      plt.gca().collections.remove(coll) 
     except ValueError: #Everything is not removed for some reason!                      
      pass 
    im = plt.contour(xi, yi, data[i], 15, linewidths=0.5, colors='k') 
    plt.title(str(i)) 
    return im, 

main() 

1) È questo il modo migliore per farlo ? Menzione in altro modo.

2) Nell'output finale sono ancora visibili le curve di livello del fotogramma precedente. Come li rimuovo? Vedere ad eccezione di ValueError:

+0

il 'ValueError' porta con sé un messaggio? – tacaswell

+0

Senza prova: ad eccezione: la lettura è plt.gca() collections.remove (coll) ValueError:. List.remove (x): non x nella lista – chaitu

+0

+1 per una buona codice di esempio – tacaswell

risposta

1

Si ha un problema di scoping, il nuovo im che si crea nel proprio programma di aggiornamento non viene passato di nuovo, quindi la seconda volta attraverso il ciclo si sta tentando di rimuovere nuovamente il primo livello di linee, che giustamente si lamenta che non può perché li hai già rimossi.

ottimizzare il codice un po ':

def main(): 
    seed(1234) 
    x = uniform(-2,2,100) 
    y = uniform(-2,2,100) 
    data = vstack((x*exp(-x**2-y**2),0.5*x*exp(-x**2-y**2),0.2*x*exp(-x**2-y**2))) 
    xi = linspace(min(x), max(x)) 
    yi = linspace(min(y), max(y)) 
    zi = [] 
    numframes = data.shape[0] 
    for ii in range(numframes): 
     zi.append(griddata((x, y), data[ii], (xi[None,:], yi[:,None]), method='cubic')) 

    fig = plt.figure() 
    im = plt.contour(xi, yi, zi[0], 15, linewidths=0.5, colors='k') 
    ax = fig.gca() 
    ani = animation.FuncAnimation(fig, update_contour_plot, frames=xrange(numframes), fargs=(zi, ax, fig, xi, yi), interval=100) 
    plt.colorbar(im) 
    plt.show() 
    return ani 


def update_contour_plot(i, data, ax, fig, xi, yi): 
    ax.cla() 
    im = ax.contour(xi, yi, data[i], 15, linewidths=0.5, colors='k') 
    plt.title(str(i)) 
    return im, 

Un'altra opzione è quella di fare un im mutabile di qualche tipo (come avvolgerlo in un dizionario) in modo che le modifiche si propagheranno da un fotogramma all'altro.

+0

ValueError: lista .remove (x): x non nell'elenco – chaitu

+0

@chaitu vedi modifica. – tacaswell

+0

Funziona ora. Grazie! – chaitu