I am trying to animate contours in matplotlib 1.1.0
Based on: 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 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 im
you 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:
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
a mutable of some sort (like wrap it in a dictionary) so that your changes will propagate from frame to frame.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With