Matplotlib outline animation

I am trying to animate outlines in matplotlib 1.1.0

Based on: http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg17614.html , http://matplotlib.1069221.n5.nabble.com/Matplotlib-1-1-0 -animation-vs-contour-plots-td18703.html and 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) Is this the best way to do this? Otherwise.

2) In the final output, the contour lines from the previous frame are still visible. How to remove them? See ValueError Section:

+8
python numpy matplotlib
source share
1 answer

You have a problem with the scope, the new im that you create in your update is not passed back, so the second time through the loop you try to delete the first layer of lines again, that it cannot complain properly because you already deleted them .

Fine-tuning the code:

 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, 

Another option is to make im changed in some way (for example, wrap it in a dictionary) so that your changes propagate from frame to frame.

+1
source share

All Articles