def main(gliders, save_dir, bathymetry, landcolor, glider_t0, glider_t1, current_glider_location): # initialize keyword arguments for glider functions gargs = dict() gargs['time_start'] = glider_t0 gargs['time_end'] = glider_t1 # initialize keyword arguments for map plot kwargs = dict() kwargs['landcolor'] = landcolor kwargs['current_glider_loc'] = current_glider_location if bathymetry: bath = xr.open_dataset(bathymetry) else: bath = False for glider in gliders: sdir_glider = os.path.join(save_dir, glider) os.makedirs(sdir_glider, exist_ok=True) kwargs['save_dir'] = sdir_glider glider_ds = gld.glider_dataset(glider, **gargs) glider_region = gld.glider_region( glider_ds) # define the glider region # Loop through regions for region in glider_region.items(): if region[0] == 'zoomed': extent = region[1]['lonlat'] if bath: kwargs['bathy'] = bath.sel( lon=slice(extent[0] - .1, extent[1] + .1), lat=slice(extent[2] - .1, extent[3] + .1)) glider_track(glider_ds, region, **kwargs)
def main(gliders, save_dir, profile_t0, ylims, x_lims, gwh): gofsurl = 'https://tds.hycom.org/thredds/dodsC/GLBy0.08/expt_93.0' rtofsurl = '/Users/garzio/Documents/rucool/hurricane_glider_project/RTOFS/RTOFS_6hourly_North_Atlantic/' # rtofsurl = '/home/hurricaneadm/data/rtofs' # on server xlabels = {'temperature': 'Temperature ($^oC$)', 'salinity': 'Salinity'} for pt0 in profile_t0: print('\nPlotting profile at {}'.format(pt0)) pt0_str = pt0.strftime('%Y-%m-%dT%H:%M') pt0_str_save = pt0.strftime('%Y%m%dT%H%M') # initialize keyword arguments for glider functions. gargs = dict() gargs['time_start'] = pt0 - dt.timedelta(hours=gwh) gargs['time_end'] = pt0 + dt.timedelta(hours=gwh) gargs['filetype'] = 'dataframe' for glider in gliders: glider_name = glider.split('-')[0] sdir_glider = os.path.join(save_dir, glider, 'profiles') os.makedirs(sdir_glider, exist_ok=True) glider_ds = gld.glider_dataset(glider, **gargs) gl_t0 = pd.to_datetime(np.nanmin( glider_ds['time'])).strftime('%Y-%m-%dT%H:%M') gl_t1 = pd.to_datetime(np.nanmax( glider_ds['time'])).strftime('%Y-%m-%dT%H:%M') # average glider profile location gl_pl = [ np.round(np.nanmean(glider_ds.longitude.values), 2), np.round(np.nanmean(glider_ds.latitude.values), 2) ] # separate glider profiles profiletimes, idx = np.unique(glider_ds.time.values, return_index=True) targetlon = np.unique(glider_ds.longitude.values) targetlat = np.unique(glider_ds.latitude.values) targetlon_GOFS = storms.convert_target_gofs_lon(targetlon) # get GOFS data with xr.open_dataset(gofsurl, drop_variables='tau') as gofs: gofs = gofs.rename({ 'surf_el': 'sea_surface_height', 'water_temp': 'temperature', 'water_u': 'u', 'water_v': 'v' }) gofs_ds = gofs.sel(time=pt0, depth=slice(0, 1000)) oklonGOFS = np.unique( np.round( np.interp(targetlon_GOFS, gofs_ds.lon, np.arange(0, len(gofs_ds.lon)))).astype(int)) oklatGOFS = np.unique( np.round( np.interp(targetlat, gofs_ds.lat, np.arange(0, len(gofs_ds.lat)))).astype(int)) # check that the glider doesn't cross more than one GOFS grid point if np.logical_or(len(oklonGOFS) > 1, len(oklatGOFS) > 1): raise ValueError( 'Glider crosses >1 GOFS grid point. Choose different time range.' ) # get RTOFS data if pt0.hour == 0: hr = '{:03d}'.format(24) rtofst0 = pt0 - dt.timedelta(days=1) else: hr = '{:03d}'.format(pt0.hour) rtofst0 = pt0 rfile = f"{rtofsurl}{rtofst0.strftime('rtofs.%Y%m%d')}/rtofs_glo_3dz_f{hr}_6hrly_hvr_US_east.nc" rtofs_ds = xr.open_dataset(rfile) rtofs_ds = rtofs_ds.rename({ 'Longitude': 'lon', 'Latitude': 'lat', 'MT': 'time', 'Depth': 'depth' }) rtofs_ds = rtofs_ds.sel(depth=slice(0, 1000)) oklonRTOFS = np.unique( np.round( np.interp(targetlon, rtofs_ds.lon[0, :], np.arange(0, len( rtofs_ds.lon[0, :])))).astype(int)) oklatRTOFS = np.unique( np.round( np.interp(targetlat, rtofs_ds.lat[:, 0], np.arange(0, len( rtofs_ds.lat[:, 0])))).astype(int)) # check that the glider doesn't cross more than one RTOFS grid point if np.logical_or(len(oklonRTOFS) > 1, len(oklatRTOFS) > 1): raise ValueError( 'Glider crosses >1 RTOFS grid point. Choose different time range: {}' .format(pt0)) lon_RTOFS = rtofs_ds.lon.values[0, oklonRTOFS] lat_RTOFS = rtofs_ds.lat.values[oklatRTOFS, 0] RTOFS_pl = [ np.round(lon_RTOFS[0], 2), np.round(lat_RTOFS[0], 2) ] for pv, xl in x_lims.items(): fig, ax = plt.subplots(figsize=(8, 9)) plt.subplots_adjust(right=0.88, left=0.15) plt.grid() # plot glider profiles for pt in profiletimes: # pt_idx = np.squeeze(np.argwhere(glider_ds.time.values == pt)) pt_gl = glider_ds[glider_ds['time'] == pt] # pt_gl = pt_gl[pt_gl.pressure != 0.00] # get rid of zeros x = pt_gl[pv] y = pt_gl['depth'] xmask = ~np.isnan( x) # get rid of nans so the lines are continuous # ax.plot(x[xmask], y[xmask], lw=3, c='k', label=glider_name) ax.plot(x[xmask], y[xmask], lw=3, c='blue', label=glider_name) # plot GOFS GOFS_targetvar = np.squeeze(gofs_ds[pv][:, oklatGOFS, oklonGOFS]) GOFS_lon = storms.convert_gofs_target_lon( GOFS_targetvar.lon.values.tolist()) GOFS_pl = [ np.round(GOFS_lon[0], 2), np.round(GOFS_targetvar.lat.values, 2) ] #ax.plot(GOFS_targetvar.values, GOFS_targetvar.depth.values, lw=3, c='tab:blue', label='GOFS') ax.plot(GOFS_targetvar.values, GOFS_targetvar.depth.values, lw=3, c='red', label='GOFS') # plot RTOFS RTOFS_targetvar = np.squeeze(rtofs_ds[pv][0, :, oklatRTOFS, oklonRTOFS]) #ax.plot(RTOFS_targetvar.values, RTOFS_targetvar.depth.values, lw=3, c='tab:orange', label='RTOFS') ax.plot(RTOFS_targetvar.values, RTOFS_targetvar.depth.values, lw=3, c='green', label='RTOFS') if ylims: ax.set_ylim(ylims) else: # set y limits to glider max depth rounded_depth = np.ceil( np.nanmax(glider_ds['depth']) / 10) * 10 ax.set_ylim([0, rounded_depth]) if xl: ax.set_xticks(xl) ax.set_xlabel(xlabels[pv]) ax.set_ylabel('Depth (m)') ax.invert_yaxis() # get legend handles and only show one set handles, labels = plt.gca().get_legend_handles_labels() by_label = dict(zip(labels, handles)) # fig.legend(by_label.values(), by_label.keys(), framealpha=0.5, ncol=3, bbox_to_anchor=(0.89, 0.84), fontsize=12) ax.legend(by_label.values(), by_label.keys(), fontsize=12) ttl = f"GOFS: {pt0_str}, {GOFS_pl}\nRTOFS: {pt0_str}, {RTOFS_pl}\n" \ f"Glider: {gl_t0} to {gl_t1}, {gl_pl}" ax.set_title(ttl) savefile = os.path.join( sdir_glider, f'{glider_name}_models_profiles_{pv}-{pt0_str_save}.png' ) plt.savefig(savefile, dpi=300) plt.close()
def main(gliders, save_dir, bathymetry, m_t0, m_t1, g_t0, g_t1, lt, cgl): url = '/Users/garzio/Documents/rucool/hurricane_glider_project/RTOFS/RTOFS_6hourly_North_Atlantic/' # url = '/home/hurricaneadm/data/rtofs' # on server # initialize keyword arguments for glider functions gargs = dict() gargs['time_start'] = g_t0 gargs['time_end'] = g_t1 # initialize keyword arguments for map plot kwargs = dict() kwargs['model'] = 'rtofs' kwargs['transform'] = ccrs.PlateCarree() kwargs['current_glider_loc'] = cgl if bathymetry: bath = xr.open_dataset(bathymetry) else: bath = False for glider in gliders: sdir_glider = os.path.join(save_dir, glider) os.makedirs(sdir_glider, exist_ok=True) kwargs['save_dir'] = sdir_glider glider_ds = gld.glider_dataset(glider, **gargs) kwargs['gliders'] = glider_ds glider_region = gld.glider_region( glider_ds) # define the glider region gl_t0 = pd.to_datetime(np.nanmin(glider_ds.time.values)) gl_t1 = pd.to_datetime(np.nanmax(glider_ds.time.values)) if len(glider_region) < 1: raise ValueError('No region found for glider: {}'.format(glider)) if lt: lt = gld.custom_gliderline_transects() kwargs['custom_transect'] = dict( lon=[lt[glider]['extent'][0], lt[glider]['extent'][2]], lat=[lt[glider]['extent'][1], lt[glider]['extent'][3]]) # get RTOFS files if m_t0: mt0 = m_t0 else: mt0 = gl_t0 - dt.timedelta(hours=6) if m_t1: mt1 = m_t1 else: mt1 = gl_t1 + dt.timedelta(days=1) model_dates = [ x.strftime('rtofs.%Y%m%d') for x in pd.date_range(mt0, mt1) ] rtofs_files = [ glob.glob(os.path.join(url, x, '*.nc')) for x in model_dates ] rtofs_files = sorted( [inner for outer in rtofs_files for inner in outer]) # Loop through regions for region in glider_region.items(): extent = region[1]['lonlat'] if bath: kwargs['bathy'] = bath.sel(lon=slice(extent[0] - .1, extent[1] + .1), lat=slice(extent[2] - .1, extent[3] + .1)) for f in rtofs_files: print(f) try: with xr.open_dataset(f) as ds: ds = ds.rename({ 'Longitude': 'lon', 'Latitude': 'lat', 'MT': 'time', 'Depth': 'depth' }) lat = ds.lat.data lon = ds.lon.data # subset the RTOFS grid lonidx = [extent[0] - 1, extent[1] + 1] latidx = [extent[2] - 1, extent[3] + 1] lonIndex = np.round( np.interp(lonidx, lon[0, :], np.arange(0, len(lon[0, :])))).astype(int) latIndex = np.round( np.interp(latidx, lat[:, 0], np.arange(0, len(lat[:, 0])))).astype(int) sub = ds.sel(X=slice(lonIndex[0], lonIndex[1]), Y=slice(latIndex[0], latIndex[1])) surface_map_glider_track(sub, region, **kwargs) except OSError: continue
def main(gliders, save_dir, g_t0, g_t1): url = '/Users/mikesmith/Documents/github/rucool/hurricanes/data/rtofs/' # initialize keyword arguments for glider functions gargs = dict() gargs['time_start'] = g_t0 gargs['time_end'] = g_t1 gargs['filetype'] = 'dataframe' for glider in gliders: sdir_glider = os.path.join(save_dir, glider, 'transects', 'transect-ribbons') os.makedirs(sdir_glider, exist_ok=True) glider_df = gld.glider_dataset(glider, **gargs) # Profile plotting # grouped = list(glider_df.groupby([pd.Grouper(freq='1D', key='time')])) grouped = list( glider_df.groupby([pd.Grouper(freq='24H', key='time', base=3)])) fig, ax = plt.subplots(1, len(grouped), figsize=(16, 9), constrained_layout=True) # plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.Blues(np.linspace(0, 1, 24)))) for i in range(len(grouped)): newgroup = list(grouped[i][1].groupby('time')) ax[i].set_prop_cycle( plt.cycler('color', plt.cm.Reds(np.linspace(0, 1, len(newgroup))))) for group in newgroup: # temperature profile... y axis - depth, x axis. - temperature. color- time h = ax[i].scatter(group[1]['temperature'], group[1]['depth'], label=group[0].strftime('%H:%M:%S'), edgecolor='black') ax[i].legend() ax[i].set_title(grouped[i][0].strftime('%Y-%m-%d'), fontsize=18, fontweight='bold') for axs in ax.flat: axs.set_ylim([60, 1]) axs.set_xlim([21, 30.5]) axs.grid(True, linestyle='--', linewidth=0.5) axs.tick_params(axis='x', labelsize=14) axs.tick_params(axis='y', labelsize=14) axs.set_xlabel('Temperature (°C)', fontsize=16, fontweight='bold') axs.set_ylabel('Depth (m)', fontsize=16, fontweight='bold') plt.suptitle( 'Temperature Profile for Glider: ng645-20210613T0000\nStart: 2021-08-27, End: 2021-08-31', fontsize=20, fontweight='bold') plt.savefig( '/Users/mikesmith/Documents/ng645-daily_temperature-profile-ida', bbox_inches='tight', pad_inches=0.1, dpi=150) plt.close() fig, ax = plt.subplots(1, len(grouped), figsize=(16, 9), constrained_layout=True) # plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.Blues(np.linspace(0, 1, 24)))) for i in range(len(grouped)): newgroup = list(grouped[i][1].groupby('time')) ax[i].set_prop_cycle( plt.cycler('color', plt.cm.Greens(np.linspace(0, 1, len(newgroup))))) for group in newgroup: # temperature profile... y axis - depth, x axis. - temperature. color- time h = ax[i].scatter( group[1]['salinity'], group[1]['depth'], label=group[0].strftime('%H:%M:%S'), edgecolor='black', ) ax[i].legend() ax[i].set_title(grouped[i][0].strftime('%Y-%m-%d'), fontsize=18, fontweight='bold') for axs in ax.flat: axs.set_ylim([60, 1]) axs.set_xlim([34.5, 37]) axs.grid(True, linestyle='--', linewidth=0.5) axs.tick_params(axis='x', labelsize=14) axs.tick_params(axis='y', labelsize=14) axs.set_xlabel('Salinity (1)', fontsize=16, fontweight='bold') axs.set_ylabel('Depth (m)', fontsize=16, fontweight='bold') plt.suptitle( 'Salinity Profile for Glider: ng645-20210613T0000\nStart: 2021-08-27, End: 2021-08-31', fontsize=20, fontweight='bold') plt.savefig( '/Users/mikesmith/Documents/ng645-daily_salinity-profile-ida', bbox_inches='tight', pad_inches=0.1, dpi=150) plt.close() fig, ax = plt.subplots(1, len(grouped), figsize=(16, 9), constrained_layout=True) # plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.Blues(np.linspace(0, 1, 24)))) for i in range(len(grouped)): newgroup = list(grouped[i][1].groupby('time')) # cmap = mpl.cm.Blues(np.linspace(0, 1, len(newgroup))) # cmap = mpl.colors.ListedColormap(cmap[0:10]) cmap = plt.cm.Blues(np.linspace(0, 1, len(newgroup))) ax[i].set_prop_cycle(plt.cycler('color', cmap)) for group in newgroup: # temperature profile... y axis - depth, x axis. - temperature. color- time h = ax[i].scatter(group[1]['density'], group[1]['depth'], label=group[0].strftime('%H:%M:%S'), edgecolor='black') ax[i].legend() ax[i].set_title(grouped[i][0].strftime('%Y-%m-%d'), fontsize=18, fontweight='bold') for axs in ax.flat: axs.set_ylim([60, 1]) axs.set_xlim([1021, 1026]) axs.grid(True, linestyle='--', linewidth=0.5) axs.tick_params(axis='x', labelsize=14) axs.tick_params(axis='y', labelsize=14) axs.set_xlabel('density (kg m-3)', fontsize=16, fontweight='bold') axs.set_ylabel('Depth (m)', fontsize=16, fontweight='bold') plt.suptitle( 'Density Profile for Glider: ng645-20210613T0000\nStart: 2021-08-27, End: 2021-08-31', fontsize=20, fontweight='bold') plt.savefig( '/Users/mikesmith/Documents/ng645-daily_density-profile-ida', bbox_inches='tight', pad_inches=0.1, dpi=150) plt.close()
def main(gliders, save_dir, m_t0, m_t1, g_t0, g_t1, lt, ylims, color_lims): url = 'https://tds.hycom.org/thredds/dodsC/GLBy0.08/expt_93.0' # initialize keyword arguments for glider functions gargs = dict() gargs['time_start'] = g_t0 gargs['time_end'] = g_t1 gargs['filetype'] = 'dataframe' for glider in gliders: sdir_glider = os.path.join(save_dir, glider, 'transects', 'gofs') os.makedirs(sdir_glider, exist_ok=True) glider_df = gld.glider_dataset(glider, **gargs) gl_t0 = pd.to_datetime(np.nanmin(glider_df['time'])) gl_t1 = pd.to_datetime(np.nanmax(glider_df['time'])) if lt: # get the straight line transect lt = gld.custom_gliderline_transects() x1 = lt[glider]['extent'][0] y1 = lt[glider]['extent'][1] x2 = lt[glider]['extent'][2] y2 = lt[glider]['extent'][3] # calculate longitude and latitude of transect lines targetlon, targetlat, _ = calculate_transect(x1, y1, x2, y2) else: # get the temperature transect along the glider track print('Getting GOFS custom temperature transect') targetlon = np.array(glider_df['longitude']) targetlat = np.array(glider_df['latitude']) targetlon_GOFS = storms.convert_target_gofs_lon(targetlon) with xr.open_dataset(url, drop_variables='tau') as gofs: gofs = gofs.rename({ 'surf_el': 'sea_surface_height', 'water_temp': 'temperature', 'water_u': 'u', 'water_v': 'v' }) # Subset time range if m_t0: mt0 = m_t0 else: mt0 = gl_t0 - dt.timedelta(hours=6) if m_t1: mt1 = m_t1 else: mt1 = gl_t1 + dt.timedelta(days=1) ds = gofs.sel(time=slice(mt0, mt1), depth=slice(0, 500)) for t in ds.time: tds = ds.sel(time=t) date_str = pd.to_datetime( t.values).strftime('%Y-%m-%d %H:%M:%S') date_save = pd.to_datetime( t.values).strftime('%Y-%m-%dT%H%M%SZ') # get the temperature transect from the model and glider mtemp, mdepth, lon_sub, lat_sub = storms.custom_transect( tds, 'temperature', targetlon_GOFS, targetlat, 'gofs') gl_tm, gl_lon, gl_lat, gl_depth, gl_temp = gld.grid_glider_data( glider_df, 'temperature', 0.5) # plot temperature by longitude - model only targs = {} targs['cmap'] = cmocean.cm.thermal targs['clab'] = 'Temperature ($^oC$)' targs[ 'title'] = f'GOFS Temperature at {date_str} UTC\n{glider} glider track' targs['save_file'] = os.path.join( sdir_glider, f'{glider.split("-")[0]}_gofs_transect_temp-{date_save}.png' ) targs['levels'] = color_lims['temp'] targs['ylims'] = ylims print('plotting temperature by longitude') plot_transect(lon_sub, -mdepth, mtemp, **targs) # plot temperature by longitude - model and glider del targs['title'] targs['title0'] = f'{glider.split("-")[0]} transect {gl_t0.strftime("%Y-%m-%dT%H:%M")} to '\ f'{gl_t1.strftime("%Y-%m-%dT%H:%M")}' targs['title1'] = f'GOFS Temperature at {date_str} UTC' targs['save_file'] = os.path.join( sdir_glider, f'{glider.split("-")[0]}_gofs_glider_transect_temp-{date_save}.png' ) plot_transects(gl_lon, -gl_depth, gl_temp, lon_sub, -mdepth, mtemp, **targs) # get the salinity transect from the model and glider print('Getting GOFS custom salinity transect') msalt, mdepth, lon_sub, lat_sub = storms.custom_transect( tds, 'salinity', targetlon_GOFS, targetlat, 'gofs') gl_tm, gl_lon, gl_lat, gl_depth, gl_salt = gld.grid_glider_data( glider_df, 'salinity', 0.5) # plot salinity by longitude sargs = {} sargs['cmap'] = cmocean.cm.haline sargs['clab'] = 'Salinity' sargs[ 'title'] = f'GOFS Salinity at {date_str} UTC\n{glider} glider track' sargs['save_file'] = os.path.join( sdir_glider, f'{glider.split("-")[0]}_gofs_transect_salt-{date_save}.png' ) sargs['levels'] = color_lims['salt'] sargs['ylims'] = ylims print('plotting salinity by longitude') plot_transect(lon_sub, -mdepth, msalt, **sargs) # plot salinity by longitude - model and glider del sargs['title'] sargs['title0'] = f'{glider.split("-")[0]} transect {gl_t0.strftime("%Y-%m-%dT%H:%M")} to ' \ f'{gl_t1.strftime("%Y-%m-%dT%H:%M")}' sargs['title1'] = f'GOFS Salinity at {date_str} UTC' sargs['save_file'] = os.path.join( sdir_glider, f'{glider.split("-")[0]}_gofs_glider_transect_salt-{date_save}.png' ) plot_transects(gl_lon, -gl_depth, gl_salt, lon_sub, -mdepth, msalt, **sargs)
def main(gliders, save_dir, g_t0, g_t1, xlims, ylims): # initialize keyword arguments for glider functions gargs = dict() gargs['time_start'] = g_t0 gargs['time_end'] = g_t1 gargs['filetype'] = 'dataframe' t0 = g_t0.strftime('%Y-%m-%d') t1 = g_t1.strftime('%Y-%m-%d') t = np.arange(xlims['temperature'][0], xlims['temperature'][1], xlims['temperature'][2]) t = np.append(t, xlims['temperature'][1]) s = np.arange(xlims['salinity'][0], xlims['salinity'][1], xlims['salinity'][2]) s = np.append(s, xlims['salinity'][1]) d = np.arange(xlims['density'][0], xlims['density'][1], xlims['density'][2]) d = np.append(d, xlims['density'][1]) for glider in gliders: sdir_glider = os.path.join(save_dir, glider, 'transects', 'transect-ribbons') os.makedirs(sdir_glider, exist_ok=True) glider_df = gld.glider_dataset(glider, **gargs) # cm = plt.get_cmap('RdYlBu', 10) # cmap = cmocean.tools.cmap(cmocean.cm.thermal, N=10) cmdict = cmocean.tools.get_dict(cmocean.cm.thermal, N=t.shape[0]-1) thermal = LinearSegmentedColormap(cmocean.cm.thermal, segmentdata=cmdict, N=t.shape[0]-1) cmdict = cmocean.tools.get_dict(cmocean.cm.haline, N=s.shape[0]-1) haline = LinearSegmentedColormap(cmocean.cm.haline, segmentdata=cmdict, N=s.shape[0]-1) cmdict = cmocean.tools.get_dict(cmocean.cm.dense, N=d.shape[0]-1) dense = LinearSegmentedColormap(cmocean.cm.dense, segmentdata=cmdict, N=d.shape[0]-1) # temperature section... time on x axis.. depth on y axis... color- temperature fig, ax = plt.subplots(figsize=(16, 8)) plt.scatter(glider_df['time'], glider_df['depth'], 20, glider_df['temperature'], cmap=thermal.reversed(thermal), vmin=t[0], vmax=t[-1] ) plt.ylim(ylims) cb = plt.colorbar() cb.ax.tick_params(labelsize=14) cb.set_label('Temperature (°C)', fontsize=16) # Add the grid plt.grid() plt.xticks(rotation=45, fontsize=16) plt.yticks(fontsize=16) xfmt = mdates.DateFormatter('%d-%b-%Y\n%H:%M:%S') ax.xaxis.set_major_formatter(xfmt) plt.title(f'Temperature Section for Glider: {glider}\nStart: {t0}, End: {t1}', fontsize=20, fontweight='bold') plt.xlabel('Time (GMT)', fontsize=18, fontweight='bold') plt.ylabel('Depth (m)', fontsize=18, fontweight='bold') plt.savefig(f'/Users/mikesmith/Documents/{glider}-temperature-{t0}-{t1}', bbox_inches='tight', pad_inches=0.1, dpi=300) plt.close() fig, ax = plt.subplots(figsize=(16, 8)) plt.scatter(glider_df['time'], glider_df['depth'], 20, glider_df['salinity'], cmap=haline.reversed(haline), vmin=s[0], vmax=s[-1] ) plt.ylim(ylims) cb = plt.colorbar() cb.ax.tick_params(labelsize=14) cb.set_label('Salinity (1)', fontsize=16) plt.grid() plt.xticks(rotation=45, fontsize=16) plt.yticks(fontsize=16) xfmt = mdates.DateFormatter('%d-%b-%Y\n%H:%M:%S') ax.xaxis.set_major_formatter(xfmt) plt.title(f'Salinity Section for Glider: {glider}\nStart: {t0}, End: {t1}', fontsize=20, fontweight='bold') plt.xlabel('Time (GMT)', fontsize=18, fontweight='bold') plt.ylabel('Depth (m)', fontsize=18, fontweight='bold') plt.savefig(f'/Users/mikesmith/Documents/{glider}-salinity-{t0}-{t1}', bbox_inches='tight', pad_inches=0.1, dpi=300) plt.close() # Density profile cross section fig, ax = plt.subplots(figsize=(16, 8)) plt.scatter(glider_df['time'], glider_df['depth'], 20, glider_df['density'], cmap=dense.reversed(dense), vmin=d[0], vmax=d[-1] ) plt.ylim(ylims) cb = plt.colorbar() cb.ax.tick_params(labelsize=14) cb.set_label('Density (kg m-3)', fontsize=16) plt.grid() plt.xticks(rotation=45, fontsize=16) plt.yticks(fontsize=16) xfmt = mdates.DateFormatter('%d-%b-%Y\n%H:%M:%S') ax.xaxis.set_major_formatter(xfmt) plt.title(f'Density Section for Glider: {glider}\nStart: {t0}, End: {t1}', fontsize=20, fontweight='bold') plt.xlabel('Time (GMT)', fontsize=18, fontweight='bold') plt.ylabel('Depth (m)', fontsize=18, fontweight='bold') plt.savefig(f'/Users/mikesmith/Documents/{glider}-density-{t0}-{t1}', bbox_inches='tight', pad_inches=0.1, dpi=300) plt.close() # Profile plotting grouped = glider_df.groupby([pd.Grouper(freq='1D', key='time')]) cmap = get_cmap(len(grouped)) fig, ax = plt.subplots(figsize=(10, 12)) grouped = list(grouped) for i in range(len(grouped)): # temperature profile... y axis - depth, x axis. - temperature. color- time plt.scatter(grouped[i][1]['temperature'], grouped[i][1]['depth'], 12, cmap=cmap(i), label=grouped[i][0].strftime('%Y-%m-%d')) plt.ylim(ylims) # plt.xlim([t[0], t[-1]]) plt.xlim([11, 23]) plt.legend(fontsize=14) # Add the grid plt.grid() plt.xticks(fontsize=16) plt.yticks(fontsize=16) plt.title(f'Temperature Profile for Glider: {glider}\nStart: {t0}, End: {t1}', fontsize=20, fontweight='bold') plt.xlabel('Temperature (°C)', fontsize=18, fontweight='bold') plt.ylabel('Depth (m)', fontsize=18, fontweight='bold') plt.savefig(f'/Users/mikesmith/Documents/{glider}-temperature-profile-{t0}-{t1}', bbox_inches='tight', pad_inches=0.1, dpi=300) plt.close() fig, ax = plt.subplots(figsize=(10, 12)) for i in range(len(grouped)): plt.scatter(grouped[i][1]['salinity'], grouped[i][1]['depth'], 12, cmap=i, label=grouped[i][0].strftime('%Y-%m-%d')) plt.ylim(ylims) # plt.xlim([s[0], s[-1]]) plt.xlim([31, 35]) plt.legend(fontsize=14) # Add the grid plt.grid() plt.xticks(fontsize=16) plt.yticks(fontsize=16) plt.title(f'Salinity Profile for Glider: {glider}\nStart: {t0}, End: {t1}', fontsize=20, fontweight='bold') plt.xlabel('Salinity (1)', fontsize=18, fontweight='bold') plt.ylabel('Depth (m)', fontsize=18, fontweight='bold') # plt.show() plt.savefig(f'/Users/mikesmith/Documents/{glider}-salinity-profile-{t0}-{t1}', bbox_inches='tight', pad_inches=0.1, dpi=300) plt.close() fig, ax = plt.subplots(figsize=(10, 12)) for i in range(len(grouped)): plt.scatter(grouped[i][1]['density'], grouped[i][1]['depth'], 12, cmap=i, label=grouped[i][0].strftime('%Y-%m-%d')) plt.ylim(ylims) plt.xlim([d[0], d[-1]]) plt.legend(fontsize=14) # Add the grid plt.grid() plt.xticks(fontsize=16) plt.yticks(fontsize=16) plt.title(f'Density Profile for Glider: {glider}\nStart: {t0}, End: {t1}', fontsize=20, fontweight='bold') plt.xlabel('Density (kg m-3)', fontsize=18, fontweight='bold') plt.ylabel('Depth (m)', fontsize=18, fontweight='bold') # plt.show() plt.savefig(f'/Users/mikesmith/Documents/{glider}-density-profile-{t0}-{t1}', bbox_inches='tight', pad_inches=0.1, dpi=300) plt.close()
# initialize keyword arguments for glider functions gargs = dict() gargs['time_start'] = dt.datetime(2021, 8, 28, 0, 0) # False gargs['time_end'] = dt.datetime(2021, 8, 30, 0, 0) # gargs['time_start'] = dt.datetime(2021, 6, 17, 3, 0) # False # gargs['time_end'] = dt.datetime(2021, 6, 24, 9, 0) gargs['filetype'] = 'dataframe' y_limits = [-20, 0] # None c_limits = dict(temp=dict(shallow=np.arange(25, 30, .25)), salt=dict(shallow=np.arange(34, 37, .25))) sdir_glider = os.path.join(save_dir, glider, 'transects', 'transect-ribbons') os.makedirs(sdir_glider, exist_ok=True) glider_df = gld.glider_dataset(glider, **gargs) glider_df = glider_df[glider_df.depth < 150] tdf = glider_df.sort_values('temperature', ascending=True) grouped = tdf.groupby('time') for group in grouped: mint = np.min(group[1]['temperature']) maxt = np.max(group[1]['temperature']) mins = np.min(group[1]['salinity']) maxs = np.max(group[1]['salinity']) tempL = np.linspace(mint-1, maxt+1, 156) salL = np.linspace(mins-1, maxs+1, 156) Tg, Sg = np.meshgrid(tempL, salL)
def main(gliders, save_dir, m_t0, m_t1, g_t0, g_t1, lt, ylims, color_lims): url = '/Users/garzio/Documents/rucool/hurricane_glider_project/RTOFS/RTOFS_6hourly_North_Atlantic/' # url = '/home/hurricaneadm/data/rtofs' # on server # initialize keyword arguments for glider functions gargs = dict() gargs['time_start'] = g_t0 gargs['time_end'] = g_t1 gargs['filetype'] = 'dataframe' for glider in gliders: sdir_glider = os.path.join(save_dir, glider, 'transects', 'rtofs') os.makedirs(sdir_glider, exist_ok=True) glider_df = gld.glider_dataset(glider, **gargs) gl_t0 = pd.to_datetime(np.nanmin(glider_df['time'])) gl_t1 = pd.to_datetime(np.nanmax(glider_df['time'])) if lt: # get the straight line transect lt = gld.custom_gliderline_transects() x1 = lt[glider]['extent'][0] y1 = lt[glider]['extent'][1] x2 = lt[glider]['extent'][2] y2 = lt[glider]['extent'][3] # calculate longitude and latitude of transect lines targetlon, targetlat, _ = calculate_transect(x1, y1, x2, y2) else: # get the temperature transect along the glider track print('Getting RTOFS custom temperature transect') targetlon = np.array(glider_df['longitude']) targetlat = np.array(glider_df['latitude']) # Subset time range if m_t0: mt0 = m_t0 else: mt0 = gl_t0 - dt.timedelta(hours=6) if m_t1: mt1 = m_t1 else: mt1 = gl_t1 + dt.timedelta(days=1) model_dates = [ x.strftime('rtofs.%Y%m%d') for x in pd.date_range(mt0, mt1) ] rtofs_files = [ glob.glob(os.path.join(url, x, '*.nc')) for x in model_dates ] rtofs_files = sorted( [inner for outer in rtofs_files for inner in outer]) for f in rtofs_files: print(f) try: with xr.open_dataset(f) as ds: ds = ds.rename({ 'Longitude': 'lon', 'Latitude': 'lat', 'MT': 'time', 'Depth': 'depth' }) ds = ds.sel(depth=slice(0, 500)) date_str = pd.to_datetime( ds.time.values[0]).strftime('%Y-%m-%d %H:%M:%S') date_save = pd.to_datetime( ds.time.values[0]).strftime('%Y-%m-%dT%H%M%SZ') mtemp, mdepth, lon_sub, lat_sub = storms.custom_transect( ds, 'temperature', targetlon, targetlat, 'rtofs') gl_tm, gl_lon, gl_lat, gl_depth, gl_temp = gld.grid_glider_data( glider_df, 'temperature', 0.5) # plot temperature by longitude - model only targs = {} targs['cmap'] = cmocean.cm.thermal targs['clab'] = 'Temperature ($^oC$)' targs[ 'title'] = f'RTOFS Temperature at {date_str} UTC\n{glider} glider track' targs['save_file'] = os.path.join( sdir_glider, f'{glider.split("-")[0]}_rtofs_transect_temp-{date_save}.png' ) targs['levels'] = color_lims['temp'] targs['ylims'] = ylims print('plotting temperature by longitude') plot_transect(lon_sub, -mdepth, mtemp, **targs) # plot temperature by longitude - model and glider del targs['title'] targs['title0'] = f'{glider.split("-")[0]} transect {gl_t0.strftime("%Y-%m-%dT%H:%M")} to ' \ f'{gl_t1.strftime("%Y-%m-%dT%H:%M")}' targs['title1'] = f'RTOFS Temperature at {date_str} UTC' targs['save_file'] = os.path.join( sdir_glider, f'{glider.split("-")[0]}_rtofs_glider_transect_temp-{date_save}.png' ) plot_transects(gl_lon, -gl_depth, gl_temp, lon_sub, -mdepth, mtemp, **targs) # get the salinity transect print('Getting GOFS custom salinity transect') msalt, mdepth, lon_sub, lat_sub = storms.custom_transect( ds, 'salinity', targetlon, targetlat, 'rtofs') gl_tm, gl_lon, gl_lat, gl_depth, gl_salt = gld.grid_glider_data( glider_df, 'salinity', 0.5) # plot salinity by longitude sargs = {} sargs['cmap'] = cmocean.cm.haline sargs['clab'] = 'Salinity' sargs[ 'title'] = f'RTOFS Salinity at {date_str} UTC\n{glider} glider track' sargs['save_file'] = os.path.join( sdir_glider, f'{glider.split("-")[0]}_rtofs_transect_salt-{date_save}.png' ) sargs['levels'] = color_lims['salt'] sargs['ylims'] = ylims print('plotting salinity by longitude') plot_transect(lon_sub, -mdepth, msalt, **sargs) # plot salinity by longitude - model and glider del sargs['title'] sargs['title0'] = f'{glider.split("-")[0]} transect {gl_t0.strftime("%Y-%m-%dT%H:%M")} to ' \ f'{gl_t1.strftime("%Y-%m-%dT%H:%M")}' sargs['title1'] = f'RTOFS Salinity at {date_str} UTC' sargs['save_file'] = os.path.join( sdir_glider, f'{glider.split("-")[0]}_rtofs_glider_transect_salt-{date_save}.png' ) plot_transects(gl_lon, -gl_depth, gl_salt, lon_sub, -mdepth, msalt, **sargs) except OSError: continue
def main(gliders, save_dir, g_t0, g_t1, ylims, color_lims): # url = '/Users/garzio/Documents/rucool/hurricane_glider_project/RTOFS/RTOFS_6hourly_North_Atlantic/' # url = '/home/hurricaneadm/data/rtofs' # on server url = '/Users/mikesmith/Documents/github/rucool/hurricanes/data/rtofs/' # initialize keyword arguments for glider functions gargs = dict() gargs['time_start'] = g_t0 gargs['time_end'] = g_t1 gargs['filetype'] = 'dataframe' for glider in gliders: sdir_glider = os.path.join(save_dir, glider, 'transects', 'transect-ribbons') os.makedirs(sdir_glider, exist_ok=True) glider_df = gld.glider_dataset(glider, **gargs) gl_t0 = pd.to_datetime(np.nanmin(glider_df['time'])) gl_t1 = pd.to_datetime(np.nanmax(glider_df['time'])) gl_t0str = gl_t0.strftime('%Y-%m-%dT%H:%M') gl_t1str = gl_t1.strftime('%Y-%m-%dT%H:%M') gl_t0save = gl_t0.strftime('%Y%m%dT%H%M') glider_name = glider.split('-')[0] # Subset time range (add a little extra to the glider time range) mt0 = gl_t0 - dt.timedelta(hours=2) mt1 = gl_t1 + dt.timedelta(hours=12) model_dates = [ x.strftime('rtofs.%Y%m%d') for x in pd.date_range(mt0, mt1) ] rtofs_files = [ glob.glob(os.path.join(url, x, '*.nc')) for x in model_dates ] rtofs_files = sorted( [inner for outer in rtofs_files for inner in outer]) # make sure the file times are within the specified times model_time = np.array([], dtype='datetime64[ns]') rfiles = [] for rf in rtofs_files: splitter = rf.split('/') ymd = splitter[-2].split('.')[-1] hr = splitter[-1].split('_')[3][-2:] if hr == '24': hr = '00' td = 1 else: td = 0 mt = dt.datetime.strptime('T'.join( (ymd, hr)), '%Y%m%dT%H') + dt.timedelta(days=td) if np.logical_and(mt >= mt0, mt <= gl_t1 + dt.timedelta(hours=1)): rfiles.append(rf) model_time = np.append(model_time, pd.to_datetime(mt)) model_t0str = pd.to_datetime( np.nanmin(model_time)).strftime('%Y-%m-%dT%H:%M') model_t1str = pd.to_datetime( np.nanmax(model_time)).strftime('%Y-%m-%dT%H:%M') # open the first file to get some of the model information ds = xr.open_dataset(rfiles[0]) ds = ds.rename({ 'Longitude': 'lon', 'Latitude': 'lat', 'MT': 'time', 'Depth': 'depth' }) ds = ds.sel(depth=slice(0, 1000)) mlon = ds.lon.values mlat = ds.lat.values # interpolate glider lat/lon to lat/lon on model time sublonm = np.interp(pd.to_datetime(model_time), pd.to_datetime(glider_df.time), glider_df.longitude) sublatm = np.interp(pd.to_datetime(model_time), pd.to_datetime(glider_df.time), glider_df.latitude) # interpolating transect X and Y to lat and lon lonIndex = np.round( np.interp(sublonm, mlon[0, :], np.arange(0, len(mlon[0, :])))).astype(int) latIndex = np.round( np.interp(sublatm, mlat[:, 0], np.arange(0, len(mlat[:, 0])))).astype(int) # get temperature and salinity data along the glider track (space and time) mtemp = np.full([len(ds.depth), len(model_time)], np.nan) msalt = np.full([len(ds.depth), len(model_time)], np.nan) for i, f in enumerate(rfiles): print(f) with xr.open_dataset(f) as ds: ds = ds.rename({ 'Longitude': 'lon', 'Latitude': 'lat', 'MT': 'time', 'Depth': 'depth' }) ds = ds.sel(depth=slice(0, 1000)) mtemp[:, i] = ds['temperature'][0, :, latIndex[i], lonIndex[i]].values msalt[:, i] = ds['salinity'][0, :, latIndex[i], lonIndex[i]].values # get the temperature transect from the glider gl_tm, gl_lon, gl_lat, gl_depth, gl_temp = gld.grid_glider_data( glider_df, 'temperature', 0.5) # plot temperature by time (glider time/location) - model only targs = {} targs['cmap'] = cmocean.cm.thermal targs['clab'] = 'Temperature ($^oC$)' targs['title'] = f'RTOFS Temperature along {glider} track\n'\ f'Model: {model_t0str} to {model_t1str}\n'\ f'Glider: {gl_t0str} to {gl_t1str}' targs['save_file'] = os.path.join( sdir_glider, f'{glider_name}_rtofs_transect_temp-{gl_t0save}.png') targs['levels'] = color_lims['temp'] targs['ylims'] = ylims targs['xlab'] = 'Time' plot_transect(model_time, ds.depth.values, mtemp, **targs) # plot temperature by time (glider time/location) - model and glider del targs['title'] targs['title0'] = f'{glider_name} transect {gl_t0str} to {gl_t1str}' targs['title1'] = f'RTOFS Temperature: {model_t0str} to {model_t1str}' targs['save_file'] = os.path.join( sdir_glider, f'{glider_name}_rtofs_glider_transect_temp-{gl_t0save}.png') plot_transects(gl_tm, gl_depth, gl_temp, model_time, ds.depth.values, mtemp, **targs) # get the salinity transect gl_tm, gl_lon, gl_lat, gl_depth, gl_salt = gld.grid_glider_data( glider_df, 'salinity', 0.5) # plot salinity by time - model only sargs = {} sargs['cmap'] = cmocean.cm.haline sargs['clab'] = 'Salinity' sargs['title'] = f'RTOFS Salinity along {glider} track\n' \ f'Model: {model_t0str} to {model_t1str}\n' \ f'Glider: {gl_t0str} to {gl_t1str}' sargs['save_file'] = os.path.join( sdir_glider, f'{glider_name}_rtofs_transect_salt-{gl_t0save}.png') sargs['levels'] = color_lims['salt'] sargs['ylims'] = ylims sargs['xlab'] = 'Time' plot_transect(model_time, ds.depth.values, msalt, **sargs) # plot salinity by time (glider time/location) - model and glider del sargs['title'] sargs['title0'] = f'{glider_name} transect {gl_t0str} to {gl_t1str}' sargs['title1'] = f'RTOFS Salinity: {model_t0str} to {model_t1str}' sargs['save_file'] = os.path.join( sdir_glider, f'{glider_name}_rtofs_glider_transect_salt-{gl_t0save}.png') plot_transects(gl_tm, gl_depth, gl_salt, model_time, ds.depth.values, msalt, **sargs)
def main(gliders, save_dir, g_t0, g_t1, ylims, color_lims): url = 'https://tds.hycom.org/thredds/dodsC/GLBy0.08/expt_93.0' # initialize keyword arguments for glider functions gargs = dict() gargs['time_start'] = g_t0 gargs['time_end'] = g_t1 gargs['filetype'] = 'dataframe' for glider in gliders: sdir_glider = os.path.join(save_dir, glider, 'transects', 'transect-ribbons') os.makedirs(sdir_glider, exist_ok=True) glider_df = gld.glider_dataset(glider, **gargs) gl_t0 = pd.to_datetime(np.nanmin(glider_df['time'])) gl_t1 = pd.to_datetime(np.nanmax(glider_df['time'])) gl_t0str = gl_t0.strftime('%Y-%m-%dT%H:%M') gl_t1str = gl_t1.strftime('%Y-%m-%dT%H:%M') gl_t0save = gl_t0.strftime('%Y%m%dT%H%M') glider_name = glider.split('-')[0] with xr.open_dataset(url, drop_variables='tau') as gofs: gofs = gofs.rename({ 'surf_el': 'sea_surface_height', 'water_temp': 'temperature', 'water_u': 'u', 'water_v': 'v' }) # Subset time range (add a little extra to the glider time range) mt0 = gl_t0 - dt.timedelta(hours=1) mt1 = gl_t1 + dt.timedelta(hours=1) ds = gofs.sel(time=slice(mt0, mt1), depth=slice(0, 1000)) model_t0str = pd.to_datetime(np.nanmin( ds.time.values)).strftime('%Y-%m-%dT%H:%M') model_t1str = pd.to_datetime(np.nanmax( ds.time.values)).strftime('%Y-%m-%dT%H:%M') # interpolate glider lat/lon to lat/lon on model time sublonm = np.interp(pd.to_datetime(ds.time.values), pd.to_datetime(glider_df.time), glider_df.longitude) sublatm = np.interp(pd.to_datetime(ds.time.values), pd.to_datetime(glider_df.time), glider_df.latitude) sublonm_GOFS = storms.convert_target_gofs_lon(sublonm) # get temperature and salinity data along the glider track (space and time) mtemp = np.full([len(ds.depth), len(ds.time)], np.nan) msalt = np.full([len(ds.depth), len(ds.time)], np.nan) for i, t in enumerate(ds.time): tds = ds.sel(time=t, lon=sublonm_GOFS[i], lat=sublatm[i], method='nearest') mtemp[:, i] = tds['temperature'].values msalt[:, i] = tds['salinity'].values # get the temperature transect from the glider gl_tm, gl_lon, gl_lat, gl_depth, gl_temp = gld.grid_glider_data( glider_df, 'temperature', 0.5) # plot temperature by time (glider time/location) - model only targs = {} targs['cmap'] = cmocean.cm.thermal targs['clab'] = 'Temperature ($^oC$)' targs['title'] = f'GOFS Temperature along {glider} track\nModel: {model_t0str} to {model_t1str} ' \ f'Glider: {gl_t0str} to {gl_t1str}' targs['save_file'] = os.path.join( sdir_glider, f'{glider_name}_gofs_transect_temp-{gl_t0save}.png') targs['levels'] = color_lims['temp'] targs['ylims'] = ylims targs['xlab'] = 'Time' plot_transect(ds.time.values, ds.depth.values, mtemp, **targs) # plot temperature by time (glider time/location) - model and glider del targs['title'] targs[ 'title0'] = f'{glider_name} transect {gl_t0str} to {gl_t1str}' targs[ 'title1'] = f'GOFS Temperature: {model_t0str} to {model_t1str}' targs['save_file'] = os.path.join( sdir_glider, f'{glider_name}_gofs_glider_transect_temp-{gl_t0save}.png') plot_transects(gl_tm, gl_depth, gl_temp, ds.time.values, ds.depth.values, mtemp, **targs) # get the salinity transect from the glider gl_tm, gl_lon, gl_lat, gl_depth, gl_salt = gld.grid_glider_data( glider_df, 'salinity', 0.5) # plot salinity by time - model only sargs = {} sargs['cmap'] = cmocean.cm.haline sargs['clab'] = 'Salinity' sargs['title'] = f'GOFS Salinity along {glider} track\nModel: {model_t0str} to {model_t1str} ' \ f'Glider: {gl_t0str} to {gl_t1str}' sargs['save_file'] = os.path.join( sdir_glider, f'{glider_name}_gofs_transect_salt-{gl_t0save}.png') sargs['levels'] = color_lims['salt'] sargs['ylims'] = ylims sargs['xlab'] = 'Time' plot_transect(ds.time.values, ds.depth.values, msalt, **sargs) # plot salinity by time (glider time/location) - model and glider del sargs['title'] sargs[ 'title0'] = f'{glider_name} transect {gl_t0str} to {gl_t1str}' sargs['title1'] = f'GOFS Salinity: {model_t0str} to {model_t1str}' sargs['save_file'] = os.path.join( sdir_glider, f'{glider_name}_gofs_glider_transect_salt-{gl_t0save}.png') plot_transects(gl_tm, gl_depth, gl_salt, ds.time.values, ds.depth.values, msalt, **sargs)
def main(gliders, save_dir, bathymetry, m_t0, m_t1, g_t0, g_t1, lt, current_glider_location): url = 'https://tds.hycom.org/thredds/dodsC/GLBy0.08/expt_93.0' # initialize keyword arguments for glider functions gargs = dict() gargs['time_start'] = g_t0 gargs['time_end'] = g_t1 # initialize keyword arguments for map plot kwargs = dict() kwargs['model'] = 'gofs' kwargs['transform'] = ccrs.PlateCarree() kwargs['current_glider_loc'] = current_glider_location if bathymetry: bath = xr.open_dataset(bathymetry) else: bath = False for glider in gliders: sdir_glider = os.path.join(save_dir, glider) os.makedirs(sdir_glider, exist_ok=True) kwargs['save_dir'] = sdir_glider glider_ds = gld.glider_dataset(glider, **gargs) kwargs['gliders'] = glider_ds glider_region = gld.glider_region(glider_ds) # define the glider region gl_t0 = pd.to_datetime(np.nanmin(glider_ds.time.values)) gl_t1 = pd.to_datetime(np.nanmax(glider_ds.time.values)) if len(glider_region) < 1: raise ValueError('No region found for glider: {}'.format(glider)) if lt: lt = gld.custom_gliderline_transects() kwargs['custom_transect'] = dict(lon=[lt[glider]['extent'][0], lt[glider]['extent'][2]], lat=[lt[glider]['extent'][1], lt[glider]['extent'][3]]) # Loop through regions for region in glider_region.items(): extent = region[1]['lonlat'] if bath: kwargs['bathy'] = bath.sel(lon=slice(extent[0] - .1, extent[1] + .1), lat=slice(extent[2] - .1, extent[3] + .1)) with xr.open_dataset(url, drop_variables='tau') as gofs: gofs = gofs.rename({'surf_el': 'sea_surface_height', 'water_temp': 'temperature', 'water_u': 'u', 'water_v': 'v'}) # Subset time range if m_t0: mt0 = m_t0 else: mt0 = gl_t0 - dt.timedelta(hours=6) if m_t1: mt1 = m_t1 else: mt1 = gl_t1 + dt.timedelta(days=1) ds = gofs.sel(time=slice(mt0, mt1)) for t in ds.time: print(f'Accessing GOFS: {str(t.dt.strftime("%Y-%m-%d %H:%M:%S").data)}') tds = ds.sel(time=t) # Select the latest time # subset dataset to the proper extents for each region sub = tds.sel(lon=slice(extent[0] + 359, extent[1] + 361), lat=slice(extent[2] - 1, extent[3] + 1)) sub['lon'] = sub['lon'] - 360 # Convert model lon to glider lon surface_map_glider_track(sub, region, **kwargs)
def main(gliders, save_dir, g_t0, g_t1, ylims, color_lims): # initialize keyword arguments for glider functions gargs = dict() gargs['time_start'] = g_t0 gargs['time_end'] = g_t1 gargs['filetype'] = 'dataframe' #gargs['filetype'] = 'nc' for glider in gliders: sdir_glider = os.path.join(save_dir, glider, 'transects') os.makedirs(sdir_glider, exist_ok=True) glider_df = gld.glider_dataset(glider, **gargs) gl_t0 = pd.to_datetime(np.nanmin(glider_df['time'])) gl_t1 = pd.to_datetime(np.nanmax(glider_df['time'])) gl_t0str = gl_t0.strftime('%Y-%m-%dT%H:%M') gl_t1str = gl_t1.strftime('%Y-%m-%dT%H:%M') gl_t0save = gl_t0.strftime('%Y%m%dT%H%M') glider_name = glider.split('-')[0] gl_tm, gl_lon, gl_lat, gl_depth, gl_temp = gld.grid_glider_data(glider_df, 'temperature', 0.5) # plot temperature by time targs = {} targs['cmap'] = cmocean.cm.thermal targs['clab'] = 'Temperature ($^oC$)' targs['title'] = f'{glider_name} transect {gl_t0str} to {gl_t1str}' targs['save_file'] = os.path.join(sdir_glider, f'{glider_name}_transect_temp-{gl_t0save}.png') targs['xlab'] = 'Time' if ylims: targs['ylims'] = ylims if color_lims: targs['levels'] = color_lims['temp'] print('plotting temperature by time') plot_transect(gl_tm, gl_depth, gl_temp, **targs) # plot temperature by longitude targs['save_file'] = os.path.join(sdir_glider, f'{glider_name}_transect_temp-lon-{gl_t0save}.png') targs['xlab'] = 'Longitude' print('plotting temperature by longitude') plot_transect(gl_lon, gl_depth, gl_temp, **targs) # grid salinity data gl_tm, gl_lon, gl_lat, gl_depth, gl_salt = gld.grid_glider_data(glider_df, 'salinity', 0.5) # plot salinity by time sargs = {} sargs['cmap'] = cmocean.cm.haline sargs['clab'] = 'Salinity' sargs['title'] = f'{glider_name} transect {gl_t0str} to {gl_t1str}' sargs['save_file'] = os.path.join(sdir_glider, f'{glider_name}_transect_salt-{gl_t0save}.png') sargs['xlab'] = 'Time' if ylims: sargs['ylims'] = ylims if color_lims: sargs['levels'] = color_lims['salt'] print('plotting salinity by time') plot_transect(gl_tm, gl_depth, gl_salt, **sargs) # plot salinity by longitude sargs['save_file'] = os.path.join(sdir_glider, f'{glider_name}_transect_salt-lon-{gl_t0save}.png') sargs['xlab'] = 'Longitude' print('plotting salinity by longitude') plot_transect(gl_lon, gl_depth, gl_salt, **sargs)