How to clear Basemap figures in order to plot new data using the existing basemap object

27 Views Asked by At

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?

0

There are 0 best solutions below