#! /usr/bin/python #This code loads default plotting maps in cartopy for convenience. 20210205-0224. MJE. import numpy as np import cartopy.crs as ccrs # import projections import cartopy.feature as cf # import features import matplotlib as mpl mpl.use('Agg') #So plots can be saved in cron import matplotlib.pyplot as plt from scipy import interpolate from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER #Simple definition to load all of the basic map properites. Inputs can be a #grid of latitude/longitude coordinates (2-D) or lon/lat minimum and maximum. #MJE. 20210205-0309. # #####################INPUT FILES FOR plot_map################################ # lat = latitude data (2-D grid or [min,max]) # lon = longitude data (2-D grid or [min,max]) #####################OUTPUT FILES FOR plot_map################################ # fig = figure properties # ax = axes properties ################################################################################## def plot_map(lat,lon): lat = np.array(lat) lon = np.array(lon) fig = plt.figure(figsize=(12,6)) #Create Figure ax = plt.axes(projection=ccrs.Mercator()) #Create geoaxes to the projection #Draw coastlines, state and country boundaries, edge of map. ax.coastlines(edgecolor='grey',linewidth=0.5) ax.add_feature(cf.STATES,edgecolor='grey',linewidth=0.3) ax.add_feature(cf.BORDERS,edgecolor='grey',linewidth=0.3) #Determine resolution of gridlines if len(lon.shape) == 2: gridsize = np.ceil((np.ceil(np.nanmax(lon))-np.floor(np.nanmin(lon)))) else: gridsize = np.ceil((np.ceil(lon[1])-np.floor(lon[0]))) if gridsize >= 250: gridline_res = 40 elif gridsize < 250 and gridsize >= 200: gridline_res = 30 elif gridsize < 200 and gridsize >= 150: gridline_res = 20 elif gridsize < 150 and gridsize >= 100: gridline_res = 10 elif gridsize < 100: gridline_res = 5 if len(lon.shape) == 2: xticks = np.arange(np.nanmin(lon)-np.nanmin(lon)%gridline_res,np.nanmax(lon)+np.nanmax(lon)%gridline_res+gridline_res,gridline_res) yticks = np.arange(np.nanmin(lat)-np.nanmin(lat)%gridline_res,np.nanmax(lat)+np.nanmax(lat)%gridline_res+gridline_res,gridline_res) else: xticks = np.arange(lon[0]-lon[0]%gridline_res,lon[1]+lon[1]%gridline_res+gridline_res,gridline_res) yticks = np.arange(lat[0]-lat[0]%gridline_res,lat[1]+lat[1]%gridline_res+gridline_res,gridline_res) gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, linewidth=0.5, color='black', alpha=0.5, linestyle='--',xlocs=xticks,ylocs=yticks) gl.top_labels = False gl.right_labels = False gl.bottom_labels = True gl.xformatter = LONGITUDE_FORMATTER gl.yformatter = LATITUDE_FORMATTER gl.xlabel_style = {'size': 12} gl.ylabel_style = {'size': 12} if len(lon.shape) == 2: ax.set_extent([np.nanmin(lon), np.nanmax(lon), np.nanmin(lat), np.nanmax(lat)], crs=ccrs.PlateCarree()) else: ax.set_extent([lon[0], lon[1], lat[0], lat[1]], crs=ccrs.PlateCarree()) return(fig,ax)