def plot_variable(self,va,lv,**kwargs): self.fig = plt.figure() m, x, y = self.basemap_setup(nc,**kwargs) # Scales, colourmaps in here data = self.get(va,**kwargs) if not 'scale' in kwargs: m.contourf(x,y,data) else: m.contourf(x,y,data,N.arange(*kwargs['scale'])) if self.C.plot_titles: title = utils.string_from_time('title',self.t) plt.title(title) if self.C.colorbar: plt.colorbar(orientation='horizontal') # SAVE FIGURE datestr = utils.string_from_time('output',self.t) lv_na = utils.get_level_naming(lv,va) na = (va,lv_na,datestr) self.fname = self.create_fname(*na) # pdb.set_trace() self.save(self.fig,self.output_root,self.fname) plt.close()
def spaghetti(self, t, lv, va, contour, wrfouts, outpath, da=0, dom=0): """ wrfouts : list of wrfout files Only change dom if there are multiple domains. """ m, x, y = self.basemap_setup() time_idx = self.W.get_time_idx(t) colours = utils.generate_colours(M, len(wrfouts)) # import pdb; pdb.set_trace() if lv == 2000: lv_idx = None else: print("Only support surface right now") raise Exception lat_sl, lon_sl = self.get_limited_domain(da) slices = {'t': time_idx, 'lv': lv_idx, 'la': lat_sl, 'lo': lon_sl} # self.ax.set_color_cycle(colours) ctlist = [] for n, wrfout in enumerate(wrfouts): self.W = WRFOut(wrfout) data = self.W.get(va, slices)[0, ...] # m.contour(x,y,data,levels=[contour,]) ct = m.contour(x, y, data, colors=[ colours[n], ], levels=[ contour, ], label=wrfout.split('/')[-2]) print( ("Plotting contour level {0} for {1} from file \n {2}".format( contour, va, wrfout))) # ctlist.append(ct) # self.ax.legend() # labels = [w.split('/')[-2] for w in wrfouts] # print labels # self.fig.legend(handles=ctlist) # plt.legend(handles=ctlist,labels=labels) #labels,ncol=3, loc=3, # bbox_to_anchor=[0.5,1.5]) datestr = utils.string_from_time('output', t, tupleformat=0) lv_na = utils.get_level_naming(va, lv) naming = ['spaghetti', va, lv_na, datestr] if dom: naming.append(dom) fname = self.create_fname(*naming) self.save(outpath, fname)
def plot_streamlines(self, va, lv, **kwargs): fig = plt.figure() # Scales, colourmaps in here # Get data u_all = self.get('U10', **kwargs)[:] v_all = self.get('V10', **kwargs)[:] u = self.cut_2D_array(u_all) v = self.cut_2D_array(v_all) m, x, y = self.basemap_setup(**kwargs) """ # Density depends on which version # Wanting to match 3 km WRF (which had 2.5 density) # Should work out dx, dy in __init__ method! WRF_density = 2.5 WRF_res = 3.0 if self.version == 3: RUC_res = 13.0 density = WRF_density * RUC_res/WRF_res """ density = 2.5 #x = N.array(range(u.shape[0])) #y = N.array(range(v.shape[1])) #pdb.set_trace() #m.streamplot(x[self.x_dim/2,:],y[:,self.y_dim/2],u,v,density=density,linewidth=0.75,color='k') #m.streamplot(x[y.shape[1]/2,:],y[:,x.shape[0]/2],u,v,density=density,linewidth=0.75,color='k') #plt.streamplot(x[:,0],y[0,:],u,v)#,density=density,linewidth=0.75,color='k') m.streamplot(y[0, :], x[:, 0], u, v, density=density, linewidth=0.75, color='k') #m.quiver(x,y,u,v) if self.C.plot_titles: title = utils.string_from_time('title', self.t) plt.title(title) # SAVE FIGURE datestr = utils.string_from_time('output', self.t) lv_na = utils.get_level_naming(va, lv=lv) na = (va, lv_na, datestr) self.fname = self.create_fname(*na) # pdb.set_trace() self.save(fig, self.output_root, self.fname) plt.close()
def plot_streamlines(self,va,lv,**kwargs): fig = plt.figure() # Scales, colourmaps in here # Get data u_all = self.get('U10',**kwargs)[:] v_all = self.get('V10',**kwargs)[:] u = self.cut_2D_array(u_all) v = self.cut_2D_array(v_all) m, x, y = self.basemap_setup(**kwargs) """ # Density depends on which version # Wanting to match 3 km WRF (which had 2.5 density) # Should work out dx, dy in __init__ method! WRF_density = 2.5 WRF_res = 3.0 if self.version == 3: RUC_res = 13.0 density = WRF_density * RUC_res/WRF_res """ density = 2.5 #x = N.array(range(u.shape[0])) #y = N.array(range(v.shape[1])) #pdb.set_trace() #m.streamplot(x[self.x_dim/2,:],y[:,self.y_dim/2],u,v,density=density,linewidth=0.75,color='k') #m.streamplot(x[y.shape[1]/2,:],y[:,x.shape[0]/2],u,v,density=density,linewidth=0.75,color='k') #plt.streamplot(x[:,0],y[0,:],u,v)#,density=density,linewidth=0.75,color='k') m.streamplot(y[0,:],x[:,0],u,v,density=density,linewidth=0.75,color='k') #m.quiver(x,y,u,v) if self.C.plot_titles: title = utils.string_from_time('title',self.t) plt.title(title) # SAVE FIGURE datestr = utils.string_from_time('output',self.t) lv_na = utils.get_level_naming(va,lv=lv) na = (va,lv_na,datestr) self.fname = self.create_fname(*na) # pdb.set_trace() self.save(fig,self.output_root,self.fname) plt.close()
def spaghetti(self,t,lv,va,contour,wrfouts,outpath,da=0,dom=0): """ wrfouts : list of wrfout files Only change dom if there are multiple domains. """ m,x,y = self.basemap_setup() time_idx = self.W.get_time_idx(t) colours = utils.generate_colours(M,len(wrfouts)) # import pdb; pdb.set_trace() if lv==2000: lv_idx = None else: print("Only support surface right now") raise Exception lat_sl, lon_sl = self.get_limited_domain(da) slices = {'t': time_idx, 'lv': lv_idx, 'la': lat_sl, 'lo': lon_sl} # self.ax.set_color_cycle(colours) ctlist = [] for n,wrfout in enumerate(wrfouts): self.W = WRFOut(wrfout) data = self.W.get(va,slices)[0,...] # m.contour(x,y,data,levels=[contour,]) ct = m.contour(x,y,data,colors=[colours[n],],levels=[contour,],label=wrfout.split('/')[-2]) print("Plotting contour level {0} for {1} from file \n {2}".format( contour,va,wrfout)) # ctlist.append(ct) # self.ax.legend() # labels = [w.split('/')[-2] for w in wrfouts] # print labels # self.fig.legend(handles=ctlist) # plt.legend(handles=ctlist,labels=labels) #labels,ncol=3, loc=3, # bbox_to_anchor=[0.5,1.5]) datestr = utils.string_from_time('output',t,tupleformat=0) lv_na = utils.get_level_naming(va,lv) naming = ['spaghetti',va,lv_na,datestr] if dom: naming.append(dom) fname = self.create_fname(*naming) self.save(outpath,fname)
def plot_streamlines(self,lv,pt,outpath,da=0): m,x,y = self.basemap_setup() time_idx = self.W.get_time_idx(pt) if lv==2000: lv_idx = None else: print("Only support surface right now") raise Exception lat_sl, lon_sl = self.get_limited_domain(da) slices = {'t': time_idx, 'lv': lv_idx, 'la': lat_sl, 'lo': lon_sl} if lv == 2000: u = self.W.get('U10',slices)[0,:,:] v = self.W.get('V10',slices)[0,:,:] else: u = self.W.get('U',slices)[0,0,:,:] v = self.W.get('V',slices)[0,0,:,:] # pdb.set_trace() #div = N.sum(N.dstack((N.gradient(u)[0],N.gradient(v)[1])),axis=2)*10**4 #vort = (N.gradient(v)[0] - N.gradient(u)[1])*10**4 #pdb.set_trace() lv_na = utils.get_level_naming('wind',lv=2000) m.streamplot(x[self.W.x_dim/2,:],y[:,self.W.y_dim/2],u,v, density=2.5,linewidth=0.75,color='k') #div_Cs = N.arange(-30,31,1) #divp = m.contourf(x,y,vort,alpha=0.6) #divp = m.contour(x,y,vort) #plt.colorbar(divp,orientation='horizontal') if self.C.plot_titles: title = utils.string_from_time('title',pt) m.title(title) datestr = utils.string_from_time('output',pt) na = ('streamlines',lv_na,datestr) fname = self.create_fname(*na) self.save(outpath,fname)
def plot2D(self,vrbl,t,lv,dom,outpath,bounding=0,smooth=1, plottype='contourf',save=1,return_data=0): """ Inputs: vrbl : variable string t : date/time in (YYYY,MM,DD,HH,MM,SS) or datenum format If tuple of two dates, it's start time and end time, e.g. for finding max/average. lv : level dom : domain outpath : absolute path to output bounding : list of four floats (Nlim, Elim, Slim, Wlim): Nlim : northern limit Elim : eastern limit Slim : southern limit Wlim : western limit smooth : smoothing. 1 is off. integer greater than one is the degree of smoothing, to be specified. save : whether to save to file """ # INITIALISE self.fig.set_size_inches(8,8) self.bmap,self.x,self.y = self.basemap_setup(smooth=smooth) self.mplcommand = plottype # Make sure smooth=0 is corrected to 1 # They are both essentially 'off'. if smooth==0: smooth = 1 # Get indices for time, level, lats, lons if isinstance(t,collections.Sequence) and len(t)!=6: # List of two dates, start and end # pdb.set_trace() it_idx = self.W.get_time_idx(t[0]) ft_idx = self.W.get_time_idx(t[1]) assert ft_idx > it_idx tidx = slice(it_idx,ft_idx,None) title = "range" datestr = "range" else: tidx = self.W.get_time_idx(t) title = utils.string_from_time('title',t) datestr = utils.string_from_time('output',t) # Until pressure coordinates are fixed TODO lvidx = 0 latidx, lonidx = self.get_limited_domain(bounding,smooth=smooth) # if vc == 'surface': # lv_idx = 0 # elif lv == 'all': # lv_idx = 'all' # else: # print("Need to sort other levels") # raise Exception # FETCH DATA ncidx = {'t': tidx, 'lv': lvidx, 'la': latidx, 'lo': lonidx} self.data = self.W.get(vrbl,ncidx)#,**vardict) self.la_n = self.data.shape[-2] self.lo_n = self.data.shape[-1] # COLORBAR, CONTOURING plotargs, plotkwargs = self.get_contouring(vrbl,lv) # S = Scales(vrbl,lv) # multiplier = S.get_multiplier(vrbl,lv) # if S.cm: # plotargs = (self.x,self.y,data.reshape((la_n,lo_n)),S.clvs) # cmap = S.cm # elif isinstance(S.clvs,N.ndarray): # if plottype == 'contourf': # plotargs = (self.x,self.y,data.reshape((la_n,lo_n)),S.clvs) # cmap = plt.cm.jet # else: # plotargs = (self.x,self.y,data.reshape((la_n,lo_n)),S.clvs) # else: # plotargs = (self.x,self.y,data.reshape((la_n,lo_n))) # cmap = plt.cm.jet # pdb.set_trace() if self.mplcommand == 'contourf': # f1 = self.bmap.contourf(*plotargs,cmap=cmap) f1 = self.bmap.contourf(*plotargs,**plotkwargs) elif self.mplcommand == 'contour': plotkwargs['colors'] = 'k' f1 = self.bmap.contour(*plotargs,**kwargs) scaling_func = M.ticker.FuncFormatter(lambda x, pos:'{0:d}'.format(int(x*multiplier))) plt.clabel(f1, inline=1, fmt=scaling_func, fontsize=9, colors='k') # LABELS, TITLES etc if self.C.plot_titles: plt.title(title) if self.mplcommand == 'contourf' and self.C.colorbar: plt.colorbar(f1,orientation='horizontal') # SAVE FIGURE # pdb.set_trace() lv_na = utils.get_level_naming(vrbl,lv) naming = [vrbl,lv_na,datestr] if dom: naming.append(dom) self.fname = self.create_fname(*naming) if save: self.save(outpath,self.fname) plt.close() if isinstance(self.data,N.ndarray): return self.data.reshape((self.la_n,self.lo_n))