I am trying to animate contours 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? Mention otherwise.
2) In the final output, contour lines from previous frame are still visible. How do I remove them? See except ValueError:
You have a scoping problem, the new
imyou create in your updater is not being passed back out, so the second time through the loop you are trying to remove the first layer of lines again, which it rightly complains it can’t because you already removed them.Tweaking your code a bit:
Another option is to make
ima mutable of some sort (like wrap it in a dictionary) so that your changes will propagate from frame to frame.