I am trying to generate a four-panel animation of temperature change with time. Each of the four panels in the subplot should be an animated map; the difference between each panel being the data used. I have managed to generate the animation using one set of data (without subplots) with the following code:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from mpl_toolkits.basemap import Basemap
#dummy temperature data with 10 time-steps
y=np.random.randn(10, 60, 100)
fig = plt.figure()
m = Basemap(projection='kav7',lon_0=0)
lats=np.linspace(90,-90,y.shape[1])
lons=np.linspace(-180,180,y.shape[2])
lons, lats = np.meshgrid(lons,lats)
m.drawparallels(np.arange(-90.,99.,30.), labels=[1,0,0,0])
m.drawmeridians(np.arange(-180.,180.,60.), labels=[0,0,0,1])
m.drawcoastlines(linewidth=0.25)
m.pcolormesh(lons,lats,y[0],cmap=plt.cm.bwr, shading='flat',latlon=True)
def init():
m
def animate(i):
m.pcolormesh(lons,lats,y[i],cmap=plt.cm.bwr, shading='flat',latlon=True)
return m
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=10, interval=100) #interval = number of milliseconds between frames
anim.save('movie.mp4')
I have looked at numerous examples (1, 2, 3) of subplot animations, but still have no idea how to go about doing it with Basemap.
Your animation function needs to update four different maps in four separate axes within the figure.
Create your four panels:
The axes are indexed. The way I suggested placing them in a 2x2 layout, they are indexed as a 2-d array, so reference the axes as
ax[0][0]
,ax[0][1]
,ax[1][0]
, andax[1][1]
when you create the maps.When you create your four instances of Basemap, assign each map to a different axes using the
ax
parameter (docs).In your
animate
function, change the coloring of each axes. Assigning colors based on data to mapm_i
is withm_i.pcolormesh
(docs) as shown in your question.