def main(dfs_var_name="t2", cru_var_name="tmp", dfs_folder="/home/huziy/skynet3_rech1/NEMO_OFFICIAL/DFS5.2_interpolated", cru_file = "data/cru_data/CRUTS3.1/cru_ts_3_10.1901.2009.tmp.dat.nc"): if not os.path.isdir(NEMO_IMAGES_DIR): os.mkdir(NEMO_IMAGES_DIR) #year range is inclusive [start_year, end_year] start_year = 1981 end_year = 2009 season_name_to_months = OrderedDict([ ("Winter", (1, 2, 12)), ("Spring", list(range(3, 6))), ("Summer", list(range(6, 9))), ("Fall", list(range(9, 12)))]) cru_t_manager = CRUDataManager(var_name=cru_var_name, path=cru_file) cru_lons, cru_lats = cru_t_manager.lons2d, cru_t_manager.lats2d #get seasonal means (CRU) season_to_mean_cru = cru_t_manager.get_seasonal_means(season_name_to_months=season_name_to_months, start_year=start_year, end_year=end_year) #get seasonal means Drakkar dfs_manager = DFSDataManager(folder_path=dfs_folder, var_name=dfs_var_name) season_to_mean_dfs = dfs_manager.get_seasonal_means(season_name_to_months=season_name_to_months, start_year=start_year, end_year=end_year) dfs_lons, dfs_lats = dfs_manager.get_lons_and_lats_2d() xt, yt, zt = lat_lon.lon_lat_to_cartesian(dfs_lons.flatten(), dfs_lats.flatten()) xs, ys, zs = lat_lon.lon_lat_to_cartesian(cru_lons.flatten(), cru_lats.flatten()) ktree = cKDTree(data=list(zip(xs, ys, zs))) dists, inds = ktree.query(list(zip(xt, yt, zt))) season_to_err = OrderedDict() for k in season_to_mean_dfs: interpolated_cru = season_to_mean_cru[k].flatten()[inds].reshape(dfs_lons.shape) if dfs_var_name.lower() == "t2": #interpolated_cru += 273.15 season_to_mean_dfs[k] -= 273.15 elif dfs_var_name.lower() == "precip": # precipitation in mm/day season_to_mean_dfs[k] *= 24 * 60 * 60 season_to_err[k] = season_to_mean_dfs[k] #- interpolated_cru season_indicator = "-".join(sorted(season_to_err.keys())) fig_path = os.path.join(NEMO_IMAGES_DIR, "{3}_errors_{0}-{1}_{2}_dfs.jpeg".format(start_year, end_year, season_indicator, dfs_var_name)) basemap = nemo_commons.get_default_basemap_for_glk(dfs_lons, dfs_lats, resolution="l") x, y = basemap(dfs_lons, dfs_lats) coords_and_basemap = { "basemap": basemap, "x": x, "y": y } plot_errors_in_one_figure(season_to_err, fig_path=fig_path, **coords_and_basemap)
def get_seasonal_clim_obs_data(rconfig=None, vname="TT", bmp_info=None, season_to_months=None, obs_path=None, nx_agg=None, ny_agg=None): # Number of points for aggregation """ return aggregated BasemapInfo object corresponding to the CRU resolution :param rconfig: :param vname: :param bmp_info: BasemapInfo object for the model field (will be upscaled to the CRU resolution) :param season_to_months: """ if bmp_info is None: bmp_info = analysis.get_basemap_info_from_hdf( file_path=rconfig.data_path) if nx_agg is not None: bmp_info_agg = bmp_info.get_aggregated(nagg_x=nx_agg, nagg_y=ny_agg) else: bmp_info_agg = bmp_info # Validate temperature and precip model_vars = ["TT", "PR"] obs_vars = ["tmp", "pre"] obs_paths = [ "/HOME/data/Validation/CRU_TS_3.1/Original_files_gzipped/cru_ts_3_10.1901.2009.tmp.dat.nc", "/HOME/data/Validation/CRU_TS_3.1/Original_files_gzipped/cru_ts_3_10.1901.2009.pre.dat.nc" ] model_var_to_obs_var = dict(zip(model_vars, obs_vars)) model_var_to_obs_path = dict(zip(model_vars, obs_paths)) if obs_path is None: obs_path = model_var_to_obs_path[vname] cru = CRUDataManager(var_name=model_var_to_obs_var[vname], path=obs_path) seasonal_clim_fields_obs = cru.get_seasonal_means( season_name_to_months=season_to_months, start_year=rconfig.start_year, end_year=rconfig.end_year) seasonal_clim_fields_obs_interp = OrderedDict() for season, cru_field in seasonal_clim_fields_obs.items(): seasonal_clim_fields_obs_interp[season] = cru.interpolate_data_to( cru_field, lons2d=bmp_info_agg.lons, lats2d=bmp_info_agg.lats, nneighbours=1) # assert hasattr(seasonal_clim_fields_obs_interp[season], "mask") return bmp_info_agg, seasonal_clim_fields_obs_interp
def compare_vars(vname_model="TT", vname_obs="tmp", r_config=None, season_to_months=None, obs_path=None, nx_agg=5, ny_agg=5, bmp_info_agg=None, axes_list=None): seasonal_clim_fields_model = analysis.get_seasonal_climatology_for_runconfig( run_config=r_config, varname=vname_model, level=0, season_to_months=season_to_months) season_to_clim_fields_model_agg = OrderedDict() for season, field in seasonal_clim_fields_model.items(): print(field.shape) season_to_clim_fields_model_agg[season] = aggregate_array( field, nagg_x=nx_agg, nagg_y=ny_agg) if vname_model == "PR": season_to_clim_fields_model_agg[season] *= 1.0e3 * 24 * 3600 if obs_path is None: cru = CRUDataManager(var_name=vname_obs) else: cru = CRUDataManager(var_name=vname_obs, path=obs_path) seasonal_clim_fields_obs = cru.get_seasonal_means( season_name_to_months=season_to_months, start_year=r_config.start_year, end_year=r_config.end_year) seasonal_clim_fields_obs_interp = OrderedDict() for season, cru_field in seasonal_clim_fields_obs.items(): seasonal_clim_fields_obs_interp[season] = cru.interpolate_data_to( cru_field, lons2d=bmp_info_agg.lons, lats2d=bmp_info_agg.lats, nneighbours=1) assert hasattr(seasonal_clim_fields_obs_interp[season], "mask") season_to_err = OrderedDict() for season in seasonal_clim_fields_obs_interp: if vname_model == "PR": # * 10, because in the UDEL dataset, precipitation is in cm season_to_err[season] = season_to_clim_fields_model_agg[season] - \ seasonal_clim_fields_obs_interp[season] * MM_PER_CM else: season_to_err[season] = season_to_clim_fields_model_agg[ season] - seasonal_clim_fields_obs_interp[season] plot_performance_err_with_cru.plot_seasonal_mean_biases( season_to_error_field=season_to_err, varname=vname_model, basemap_info=bmp_info_agg, axes_list=axes_list)
def get_seasonal_clim_obs_data(rconfig=None, vname="TT", bmp_info=None, season_to_months=None, obs_path=None): # Number of points for aggregation """ return aggregated BasemapInfo object corresponding to the CRU resolution :param rconfig: :param vname: :param bmp_info: BasemapInfo object for the model field (will be upscaled to the CRU resolution) :param season_to_months: """ nx_agg = 5 ny_agg = 5 if bmp_info is None: bmp_info = analysis.get_basemap_info_from_hdf(file_path=rconfig.data_path) bmp_info_agg = bmp_info.get_aggregated(nagg_x=nx_agg, nagg_y=ny_agg) # Validate temperature and precip model_vars = ["TT", "PR"] obs_vars = ["tmp", "pre"] obs_paths = [ "/HOME/data/Validation/CRU_TS_3.1/Original_files_gzipped/cru_ts_3_10.1901.2009.tmp.dat.nc", "/HOME/data/Validation/CRU_TS_3.1/Original_files_gzipped/cru_ts_3_10.1901.2009.pre.dat.nc" ] model_var_to_obs_var = dict(zip(model_vars, obs_vars)) model_var_to_obs_path = dict(zip(model_vars, obs_paths)) if obs_path is None: obs_path = model_var_to_obs_path[vname] cru = CRUDataManager(var_name=model_var_to_obs_var[vname], path=obs_path) seasonal_clim_fields_obs = cru.get_seasonal_means(season_name_to_months=season_to_months, start_year=rconfig.start_year, end_year=rconfig.end_year) seasonal_clim_fields_obs_interp = OrderedDict() for season, cru_field in seasonal_clim_fields_obs.items(): seasonal_clim_fields_obs_interp[season] = cru.interpolate_data_to(cru_field, lons2d=bmp_info_agg.lons, lats2d=bmp_info_agg.lats, nneighbours=1) # assert hasattr(seasonal_clim_fields_obs_interp[season], "mask") return bmp_info_agg, seasonal_clim_fields_obs_interp
def compare_vars(vname_model="TT", vname_obs="tmp", r_config=None, season_to_months=None, obs_path=None, nx_agg=5, ny_agg=5, bmp_info_agg=None, axes_list=None): seasonal_clim_fields_model = analysis.get_seasonal_climatology_for_runconfig(run_config=r_config, varname=vname_model, level=0, season_to_months=season_to_months) season_to_clim_fields_model_agg = OrderedDict() for season, field in seasonal_clim_fields_model.items(): print(field.shape) season_to_clim_fields_model_agg[season] = aggregate_array(field, nagg_x=nx_agg, nagg_y=ny_agg) if vname_model == "PR": season_to_clim_fields_model_agg[season] *= 1.0e3 * 24 * 3600 if obs_path is None: cru = CRUDataManager(var_name=vname_obs) else: cru = CRUDataManager(var_name=vname_obs, path=obs_path) seasonal_clim_fields_obs = cru.get_seasonal_means(season_name_to_months=season_to_months, start_year=r_config.start_year, end_year=r_config.end_year) seasonal_clim_fields_obs_interp = OrderedDict() for season, cru_field in seasonal_clim_fields_obs.items(): seasonal_clim_fields_obs_interp[season] = cru.interpolate_data_to(cru_field, lons2d=bmp_info_agg.lons, lats2d=bmp_info_agg.lats, nneighbours=1) assert hasattr(seasonal_clim_fields_obs_interp[season], "mask") season_to_err = OrderedDict() for season in seasonal_clim_fields_obs_interp: if vname_model == "PR": # * 10, because in the UDEL dataset, precipitation is in cm season_to_err[season] = season_to_clim_fields_model_agg[season] - \ seasonal_clim_fields_obs_interp[season] * MM_PER_CM else: season_to_err[season] = season_to_clim_fields_model_agg[season] - seasonal_clim_fields_obs_interp[season] plot_performance_err_with_cru.plot_seasonal_mean_biases(season_to_error_field=season_to_err, varname=vname_model, basemap_info=bmp_info_agg, axes_list=axes_list)
def main(): erainterim_075_folder = "/HOME/data/Validation/ERA-Interim_0.75/Offline_driving_data/3h_Forecast" vname = "PR" start_year = 1980 end_year = 2010 season_key = "summer" season_labels = {season_key: "Summer"} season_to_months = OrderedDict([ (season_key, [6, 7, 8]) ]) # Validate temperature and precip model_vars = ["TT", "PR"] obs_vars = ["tmp", "pre"] obs_paths = [ "/HOME/data/Validation/CRU_TS_3.1/Original_files_gzipped/cru_ts_3_10.1901.2009.tmp.dat.nc", "/HOME/data/Validation/CRU_TS_3.1/Original_files_gzipped/cru_ts_3_10.1901.2009.pre.dat.nc" ] model_var_to_obs_var = dict(zip(model_vars, obs_vars)) model_var_to_obs_path = dict(zip(model_vars, obs_paths)) obs_path = model_var_to_obs_path[vname] cru = CRUDataManager(var_name=model_var_to_obs_var[vname], path=obs_path) # Calculate seasonal means for CRU seasonal_clim_fields_cru = cru.get_seasonal_means(season_name_to_months=season_to_months, start_year=start_year, end_year=end_year) # Calculate seasonal mean for erai flist = get_files_for_season(erainterim_075_folder, start_year=start_year, end_year=end_year, months=season_to_months[season_key]) rpf = MultiRPN(flist) date_to_field_erai075 = rpf.get_all_time_records_for_name_and_level(varname=vname, level=-1) # Convert to mm/day era075 = np.mean([field for field in date_to_field_erai075.values()], axis=0) * 24 * 3600 * 1000 lons_era, lats_era = rpf.get_longitudes_and_latitudes_of_the_last_read_rec() seasonal_clim_fields_cru_interp = OrderedDict() # Calculate biases for season, cru_field in seasonal_clim_fields_cru.items(): seasonal_clim_fields_cru_interp[season] = cru.interpolate_data_to(cru_field, lons2d=lons_era, lats2d=lats_era, nneighbours=1) # Do the plotting ------------------------------------------------------------------------------ plot_utils.apply_plot_params() fig = plt.figure() b = Basemap() gs = gridspec.GridSpec(nrows=3, ncols=1) ax = fig.add_subplot(gs[0, 0]) xx, yy = b(cru.lons2d, cru.lats2d) cs = b.contourf(xx, yy, seasonal_clim_fields_cru[season_key], 20) b.drawcoastlines(ax=ax) ax.set_title("CRU") plt.colorbar(cs, ax=ax) ax = fig.add_subplot(gs[1, 0]) lons_era[lons_era > 180] -= 360 lons_era, era075 = b.shiftdata(lons_era, datain=era075, lon_0=0) xx, yy = b(lons_era, lats_era) # mask oceans in the era plot as well era075 = maskoceans(lons_era, lats_era, era075) cs = b.contourf(xx, yy, era075, levels=cs.levels, norm=cs.norm, cmap=cs.cmap, ax=ax) b.drawcoastlines(ax=ax) ax.set_title("ERA-Interim 0.75") plt.colorbar(cs, ax=ax) # differences ax = fig.add_subplot(gs[2, 0]) diff = era075 - seasonal_clim_fields_cru_interp[season_key] delta = np.percentile(np.abs(diff)[~diff.mask], 90) clevs = np.linspace(-delta, delta, 20) cs = b.contourf(xx, yy, diff, levels=clevs, cmap="RdBu_r", extend="both") b.drawcoastlines(ax=ax) ax.set_title("ERA-Interim 0.75 - CRU") plt.colorbar(cs, ax=ax) plt.show() fig.savefig(os.path.join(img_folder, "erai0.75_vs_cru_precip.png"), bbox_inches="tight")
def plot_seasonal_2m_temp_cru(samples_folder, seasons=commons.default_seasons): vname = "tmp" file_prefix = "dm" plot_units = "$^\circ$C" mult_coeff = 1 add_offset = 0 out_dx = 0.5 level = 1 # in hybrid coords img_file_name = "CRU_{}.png".format(vname) long_name = "CRU: 2m temperature, {}".format(plot_units) # get data from cru files data_manager = CRUDataManager(path="/RESCUE/skynet3_rech1/huziy/CRU/cru_ts3.23.2011.2014.tmp.dat.nc", var_name=vname, lazy=True) season_to_mean = data_manager.get_seasonal_means(season_name_to_months=seasons, start_year=2013, end_year=2013) lons2d, lats2d = data_manager.lons2d, data_manager.lats2d img_folder = samples_folder.joinpath("images/seasonal") if not img_folder.is_dir(): img_folder.mkdir(parents=True) img_file = img_folder.joinpath(img_file_name) plot_utils.apply_plot_params(width_cm=25, height_cm=15, font_size=18) fig = plt.figure() ncols = 2 gs = GridSpec(len(season_to_mean) // ncols + int(not (len(season_to_mean) % ncols == 0)), ncols, wspace=0, hspace=0) xx, yy = None, None bmp = Basemap(projection="robin", lon_0=0) cmap = plt.get_cmap('bwr') clevs = np.arange(-30, 32, 2) for i, (sname, field) in enumerate(season_to_mean.items()): row = i // ncols col = i % ncols ax = fig.add_subplot(gs[row, col]) lons, lats, data_out = commons.interpolate_to_uniform_global_grid(field, lons_in=lons2d, lats_in=lats2d, out_dx=out_dx) if xx is None: xx, yy = bmp(lons, lats) cs = bmp.contourf(xx, yy, data_out * mult_coeff, clevs, cmap=cmap, extend="both") # save color levels for next subplots clevs = cs.levels print(np.max(data_out * mult_coeff)) ax.set_title(sname) cb = plt.colorbar(cs, ax=ax) if not (row == 0 and col == ncols - 1): # cb.ax.set_title(plot_units) cb.ax.set_visible(False) bmp.drawcoastlines(ax=ax, linewidth=LINEWIDTH) fig.suptitle(long_name) with img_file.open("wb") as f: fig.savefig(f, bbox_inches="tight") plt.close(fig)
def plot_seasonal_2m_temp_cru(samples_folder, seasons=commons.default_seasons): vname = "tmp" file_prefix = "dm" plot_units = "$^\circ$C" mult_coeff = 1 add_offset = 0 out_dx = 0.5 level = 1 # in hybrid coords img_file_name = "CRU_{}.png".format(vname) long_name = "CRU: 2m temperature, {}".format(plot_units) # get data from cru files data_manager = CRUDataManager( path="/RESCUE/skynet3_rech1/huziy/CRU/cru_ts3.23.2011.2014.tmp.dat.nc", var_name=vname, lazy=True) season_to_mean = data_manager.get_seasonal_means( season_name_to_months=seasons, start_year=2013, end_year=2013) lons2d, lats2d = data_manager.lons2d, data_manager.lats2d img_folder = samples_folder.joinpath("images/seasonal") if not img_folder.is_dir(): img_folder.mkdir(parents=True) img_file = img_folder.joinpath(img_file_name) plot_utils.apply_plot_params(width_cm=25, height_cm=15, font_size=18) fig = plt.figure() ncols = 2 gs = GridSpec(len(season_to_mean) // ncols + int(not (len(season_to_mean) % ncols == 0)), ncols, wspace=0, hspace=0) xx, yy = None, None bmp = Basemap(projection="robin", lon_0=0) cmap = plt.get_cmap('bwr') clevs = np.arange(-30, 32, 2) for i, (sname, field) in enumerate(season_to_mean.items()): row = i // ncols col = i % ncols ax = fig.add_subplot(gs[row, col]) lons, lats, data_out = commons.interpolate_to_uniform_global_grid( field, lons_in=lons2d, lats_in=lats2d, out_dx=out_dx) if xx is None: xx, yy = bmp(lons, lats) cs = bmp.contourf(xx, yy, data_out * mult_coeff, clevs, cmap=cmap, extend="both") # save color levels for next subplots clevs = cs.levels print(np.max(data_out * mult_coeff)) ax.set_title(sname) cb = plt.colorbar(cs, ax=ax) if not (row == 0 and col == ncols - 1): # cb.ax.set_title(plot_units) cb.ax.set_visible(False) bmp.drawcoastlines(ax=ax, linewidth=LINEWIDTH) fig.suptitle(long_name) with img_file.open("wb") as f: fig.savefig(f, bbox_inches="tight") plt.close(fig)
def main(): erainterim_075_folder = "/HOME/data/Validation/ERA-Interim_0.75/Offline_driving_data/3h_Forecast" vname = "PR" start_year = 1980 end_year = 2010 season_key = "summer" season_labels = {season_key: "Summer"} season_to_months = OrderedDict([(season_key, [6, 7, 8])]) # Validate temperature and precip model_vars = ["TT", "PR"] obs_vars = ["tmp", "pre"] obs_paths = [ "/HOME/data/Validation/CRU_TS_3.1/Original_files_gzipped/cru_ts_3_10.1901.2009.tmp.dat.nc", "/HOME/data/Validation/CRU_TS_3.1/Original_files_gzipped/cru_ts_3_10.1901.2009.pre.dat.nc", ] model_var_to_obs_var = dict(zip(model_vars, obs_vars)) model_var_to_obs_path = dict(zip(model_vars, obs_paths)) obs_path = model_var_to_obs_path[vname] cru = CRUDataManager(var_name=model_var_to_obs_var[vname], path=obs_path) # Calculate seasonal means for CRU seasonal_clim_fields_cru = cru.get_seasonal_means( season_name_to_months=season_to_months, start_year=start_year, end_year=end_year ) # Calculate seasonal mean for erai flist = get_files_for_season( erainterim_075_folder, start_year=start_year, end_year=end_year, months=season_to_months[season_key] ) rpf = MultiRPN(flist) date_to_field_erai075 = rpf.get_all_time_records_for_name_and_level(varname=vname, level=-1) # Convert to mm/day era075 = np.mean([field for field in date_to_field_erai075.values()], axis=0) * 24 * 3600 * 1000 lons_era, lats_era = rpf.get_longitudes_and_latitudes_of_the_last_read_rec() seasonal_clim_fields_cru_interp = OrderedDict() # Calculate biases for season, cru_field in seasonal_clim_fields_cru.items(): seasonal_clim_fields_cru_interp[season] = cru.interpolate_data_to( cru_field, lons2d=lons_era, lats2d=lats_era, nneighbours=1 ) # Do the plotting ------------------------------------------------------------------------------ plot_utils.apply_plot_params() fig = plt.figure() b = Basemap() gs = gridspec.GridSpec(nrows=3, ncols=1) ax = fig.add_subplot(gs[0, 0]) xx, yy = b(cru.lons2d, cru.lats2d) cs = b.contourf(xx, yy, seasonal_clim_fields_cru[season_key], 20) b.drawcoastlines(ax=ax) ax.set_title("CRU") plt.colorbar(cs, ax=ax) ax = fig.add_subplot(gs[1, 0]) lons_era[lons_era > 180] -= 360 lons_era, era075 = b.shiftdata(lons_era, datain=era075, lon_0=0) xx, yy = b(lons_era, lats_era) # mask oceans in the era plot as well era075 = maskoceans(lons_era, lats_era, era075) cs = b.contourf(xx, yy, era075, levels=cs.levels, norm=cs.norm, cmap=cs.cmap, ax=ax) b.drawcoastlines(ax=ax) ax.set_title("ERA-Interim 0.75") plt.colorbar(cs, ax=ax) # differences ax = fig.add_subplot(gs[2, 0]) diff = era075 - seasonal_clim_fields_cru_interp[season_key] delta = np.percentile(np.abs(diff)[~diff.mask], 90) clevs = np.linspace(-delta, delta, 20) cs = b.contourf(xx, yy, diff, levels=clevs, cmap="RdBu_r", extend="both") b.drawcoastlines(ax=ax) ax.set_title("ERA-Interim 0.75 - CRU") plt.colorbar(cs, ax=ax) plt.show() fig.savefig(os.path.join(img_folder, "erai0.75_vs_cru_precip.png"), bbox_inches="tight")
def main( dfs_var_name="t2", cru_var_name="tmp", dfs_folder="/home/huziy/skynet3_rech1/NEMO_OFFICIAL/DFS5.2_interpolated", cru_file="data/cru_data/CRUTS3.1/cru_ts_3_10.1901.2009.tmp.dat.nc"): if not os.path.isdir(NEMO_IMAGES_DIR): os.mkdir(NEMO_IMAGES_DIR) #year range is inclusive [start_year, end_year] start_year = 1981 end_year = 2009 season_name_to_months = OrderedDict([("Winter", (1, 2, 12)), ("Spring", list(range(3, 6))), ("Summer", list(range(6, 9))), ("Fall", list(range(9, 12)))]) cru_t_manager = CRUDataManager(var_name=cru_var_name, path=cru_file) cru_lons, cru_lats = cru_t_manager.lons2d, cru_t_manager.lats2d #get seasonal means (CRU) season_to_mean_cru = cru_t_manager.get_seasonal_means( season_name_to_months=season_name_to_months, start_year=start_year, end_year=end_year) #get seasonal means Drakkar dfs_manager = DFSDataManager(folder_path=dfs_folder, var_name=dfs_var_name) season_to_mean_dfs = dfs_manager.get_seasonal_means( season_name_to_months=season_name_to_months, start_year=start_year, end_year=end_year) dfs_lons, dfs_lats = dfs_manager.get_lons_and_lats_2d() xt, yt, zt = lat_lon.lon_lat_to_cartesian(dfs_lons.flatten(), dfs_lats.flatten()) xs, ys, zs = lat_lon.lon_lat_to_cartesian(cru_lons.flatten(), cru_lats.flatten()) ktree = cKDTree(data=list(zip(xs, ys, zs))) dists, inds = ktree.query(list(zip(xt, yt, zt))) season_to_err = OrderedDict() for k in season_to_mean_dfs: interpolated_cru = season_to_mean_cru[k].flatten()[inds].reshape( dfs_lons.shape) if dfs_var_name.lower() == "t2": #interpolated_cru += 273.15 season_to_mean_dfs[k] -= 273.15 elif dfs_var_name.lower() == "precip": # precipitation in mm/day season_to_mean_dfs[k] *= 24 * 60 * 60 season_to_err[k] = season_to_mean_dfs[k] #- interpolated_cru season_indicator = "-".join(sorted(season_to_err.keys())) fig_path = os.path.join( NEMO_IMAGES_DIR, "{3}_errors_{0}-{1}_{2}_dfs.jpeg".format(start_year, end_year, season_indicator, dfs_var_name)) basemap = nemo_commons.get_default_basemap_for_glk(dfs_lons, dfs_lats, resolution="l") x, y = basemap(dfs_lons, dfs_lats) coords_and_basemap = {"basemap": basemap, "x": x, "y": y} plot_errors_in_one_figure(season_to_err, fig_path=fig_path, **coords_and_basemap)