I am trying to plot multiple figures frame by frame using Basemap python module. What I want to do is to clear Basemap figure on every frame so that I can plot new data on to the existing Basemap object. But, I am getting "Can not put single artist in more than one figure" error.
import numpy as np
from datetime import datetime,timedelta
from netCDF4 import Dataset as ds
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
models = ["arpege","gem","geos","grist","gsam","icon","icon","ifs","mpas","ncp","scream","shield","um" ]
isress = ["2km" ,"5km","3km" ,"5km" ,"4km" ,"2km" ,"5km" ,"4km","3km" ,"4km","3km" ,"3km" ,"5km"]
thress = [252.89,260.88,251.21,256.72,245.28,253.76,234.41,245.36,215.96,259.03,234.96,238.74]
mrng = len(models)
trk_idir = "/glade/scratch/inj/tracking/sorted"
fld_idir = "/glade/scratch/inj/tracking/all/pco"
ireg = "pco"
osres = "qd"
itres = "3havg"
tvar = "tb"
lat = np.arange(30,-30-0.25,-0.25)
lon = np.arange(150,250+0.25,0.25)
fig = plt.figure()
x,y = np.meshgrid(lon,lat)
bmap_args = {
"projection":"cyl",
"llcrnrlat" : 30 ,
"urcrnrlat" :- 30 ,
"llcrnrlon" : 150 ,
"urcrnrlon" : 250 ,
"fix_aspect":"False",
}
bmap = Basemap(**bmap_args)
bmap.drawmapboundary(fill_color="#98f5ff")
bmap.fillcontinents(color="#ffa07a",lake_color="#98f5ff")
bmap.drawcoastlines()
for m in range(2,3):
model = models[m]
isres = isress[m]
thres = thress[m]
trk_ifn = "{0:s}.{1:s}.lnk.{2:s}.{3:3.2f}k.{4:s}.{5:s}.{6:s}.nc".format(model,isres,tvar,thres,ireg,osres,itres)
trk_ifp = "{0:s}/{1:s}".format(trk_idir,trk_ifn)
fld_ifn = "{0:s}.{1:s}.{2:s}.{3:s}.{4:s}.{5:s}.nc".format(model,isres,"all",ireg,osres,itres)
fld_ifp = "{0:s}/{1:s}".format(fld_idir,fld_ifn)
trk_id = ds("{0:s}".format(trk_ifp),"r",format="NETCDF4")
fld_id = ds("{0:s}".format(fld_ifp),"r",format="NETCDF4")
isyst = trk_id["trkdata"][:,0]
itimei = trk_id["trkdata"][:,2] # time index
ilat = trk_id["trkdata"][:,3] # latitude
ilati = trk_id["trkdata"][:,4] # latitude index
ilon = trk_id["trkdata"][:,5] # longitude
iloni = trk_id["trkdata"][:,6] # longitude index
ics = trk_id["trkdata"][:,7] # cell size
itb = fld_id["tb"] [: ]
syst_size = len(isyst)
for s in range(syst_size):
timesteps= 0
for t in range(100):
if (itimei[s,t] != np.nan):
timesteps += 1
print("system {0:5d} | timesteps : {1:4d}".format(s,timesteps))
print("===========================================================")
for ts in range(int(timesteps)):
timei_now = int(itimei[s,ts])
lat_cntr = int(ilat [s,ts])
lon_cntr = int(ilon [s,ts])
itb_now = itb[timei_now]
#trj_lon,trj_lat = bmap(lon_cntr,lat_cntr)
#cntf = bmap.contourf(x,y,itb_now,latlon=True,cmap="Spectral_r")
bmap.scatter(lon_cntr,lat_cntr,marker="x",color="k")
plt.show()
plt.clf() # This part is not working as intended
break
print("")
trk_id.close()
fld_id.close()
I expect the part plt.clf() clears the figures, and let's me able to reuse the Basemap object. Am I missing something?