¿Cómo puedo hacer una animación con contourf ()?

Estoy tratando de animar la función de Wigner de las coordenadas espaciales de algunos datos dependientes del tiempo. La función wigner es bidimensional, así que estoy usando contourf () para trazarla. Tengo los datos almacenados en un archivo HDF5 y puedo hacer distribuciones de Wigner sobre la marcha, pero no sé cómo animarlas. Todos los tutoriales y ejemplos de animación que he podido encontrar (por ejemplo, este y este ) son estrictamente para trazados de líneas. Específicamente, su función animate(i) usa line.set_data() , y parece que no puedo encontrar un equivalente para contourf() .

¿Cómo puedo animar imágenes hechas con contourf() ?

¿Cuál es el equivalente set_data() de set_data() ?

Hay una forma sencilla de hacerlo con FuncAnimation : debe tener una función que borre el eje y trazar un nuevo contorno basado en el número de cuadro. No te olvides de configurar blit como False .

 import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation DATA = np.random.randn(800).reshape(10,10,8) fig,ax = plt.subplots() def animate(i): ax.clear() ax.contourf(DATA[:,:,i]) ax.set_title('%03d'%(i)) interval = 2#in seconds ani = animation.FuncAnimation(fig,animate,5,interval=interval*1e+3,blit=False) plt.show() 

Aquí está lo que uso para animar gráficos de contorno 2d, se adaptó de http://matplotlib.org/examples/animation/dynamic_image2.html

 import pylab as pl import numpy as np import matplotlib.animation as animation import types fig = pl.figure() # Some 2D arrays to plot (time,x,y) data = np.random.random_sample((20,10,10)) # ims is a list of lists, each row is a list of artists to draw in the # current frame; here we are just animating one artist, the image, in # each frame ims = [] for i in range(len(data[:,0,0])): t_step = int(i) im = pl.contourf(data[i,:,:]) ################################################################# ## Bug fix for Quad Contour set not having attribute 'set_visible' def setvisible(self,vis): for c in self.collections: c.set_visible(vis) im.set_visible = types.MethodType(setvisible,im) im.axes = pl.gca() im.figure=fig #################################################################### ims.append([im]) ani = animation.ArtistAnimation(fig, ims, interval=70, blit=False,repeat_delay=1000) pl.show() 

Estoy trazando datos geográficos y por lo tanto necesito un mapa base. Basado en la respuesta de captain_M y un informe de discusión / error en https://github.com/matplotlib/matplotlib/issues/6139 Publico una respuesta inspirada en tacaswell que le permite usar contourf en una animación de datos bidimensionales y guardar como mp4 si tienes ffmpeg:

 from matplotlib import animation from matplotlib import pyplot as plt import numpy as np from mpl_toolkits.basemap import Basemap fig, ax = plt.subplots() # set up map projection m = Basemap(projection='nsper',lon_0=-0,lat_0=90) m.drawcoastlines() m.drawparallels(np.arange(0.,180.,30.)) m.drawmeridians(np.arange(0.,360.,60.)) # some 2D geo arrays to plot (time,lat,lon) data = np.random.random_sample((20,90,360)) lat = np.arange(len(data[0,:,0])) lon = np.arange(len(data[0,0,:])) lons,lats = np.meshgrid(lon,lat) # ims is a list of lists, each row is a list of artists to draw in the # current frame; here we are animating three artists, the contour and 2 # annotatons (title), in each frame ims = [] for i in range(len(data[:,0,0])): im = m.contourf(lons,lats,data[i,:,:],latlon=True) add_arts = im.collections text = 'title={0!r}'.format(i) te = ax.text(90, 90, text) an = ax.annotate(text, xy=(0.45, 1.05), xycoords='axes fraction') ims.append(add_arts + [te,an]) ani = animation.ArtistAnimation(fig, ims) ## If you have ffmpeg you can save the animation by uncommenting ## the following 2 lines # FFwriter = animation.FFMpegWriter() # ani.save('basic_animation.mp4', writer = FFwriter) plt.show() 

Si eres como yo y matplotlib.animation no funciona. Aquí hay algo más que puedes probar. Si desea actualizar continuamente la barra de colores y todo lo demás en la figura, use plt.ion () al principio para habilitar el trazado interactivo y use un combo de plt.draw () y plt.clf () para actualizar continuamente el trazado. . Aquí está el código de ejemplo:

 import matplotlib.pyplot as plt import numpy as np plt.ion(); plt.figure(1); for k in range(10): plt.clf(); plt.subplot(121); plt.contourf(np.random.randn(10,10)); plt.colorbar(); plt.subplot(122,polar=True) plt.contourf(np.random.randn(10,10)); plt.colorbar(); plt.draw(); 

Tenga en cuenta que esto funciona con figuras que contienen diferentes subplots y varios tipos de plots (es decir, polares o cartesianas)