def plot_mean_orog_precip(inputs, outputs): cubes = iris.load(str(inputs[0])) orog_precip_mean = cubes.extract_strict('orog_precipitation_flux_mean') nonorog_precip_mean = cubes.extract_strict('non_orog_precipitation_flux_mean') ocean_precip_mean = cubes.extract_strict('ocean_precipitation_flux_mean') extent = util.get_extent_from_cube(orog_precip_mean) for i, (name, precip) in enumerate([('orog', orog_precip_mean.data), ('non orog', nonorog_precip_mean.data), ('ocean/water', ocean_precip_mean.data)]): plt.figure(figsize=(10, 7.5)) ax = plt.axes(projection=ccrs.PlateCarree()) configure_ax_asia(ax) im = ax.imshow(precip, origin='lower', extent=extent, norm=mpl.colors.LogNorm(), vmin=1e-2, vmax=1e2) plt.colorbar(im, orientation='horizontal', label=f'{name} (mm day$^{{-1}}$)', pad=0.1) plt.savefig(outputs[i]) plt.figure(figsize=(10, 7.5)) ax = plt.axes(projection=ccrs.PlateCarree()) configure_ax_asia(ax) im = ax.imshow(100 * orog_precip_mean.data / (orog_precip_mean.data + nonorog_precip_mean.data), origin='lower', extent=extent, vmin=0, vmax=100) plt.colorbar(im, orientation='horizontal', label='% orog', pad=0.1) plt.savefig(outputs[3])
def plot_dem(inputs, outputs): hydrosheds_dir = PATHS['hydrosheds_dir'] bounds, tx, dem, mask = load_hydrosheds_dem(hydrosheds_dir, 'as') hb_gdf = load_hydrobasins_geodataframe(hydrosheds_dir, 'as', [1]) raster = build_raster_from_geometries(hb_gdf.geometry, dem.shape, tx) extent = (bounds.left, bounds.right, bounds.bottom, bounds.top) ma_dem = np.ma.masked_array(dem, (mask == -1) | (raster == 0)) plt.figure(figsize=(5, 3.6)) ax = plt.axes(projection=ccrs.PlateCarree()) cmap = plt.cm.get_cmap('terrain') # Fills masked values. cmap.set_bad(color='k', alpha=0.1) im = ax.imshow(ma_dem[::-1, :], extent=extent, origin='lower', cmap=cmap) configure_ax_asia(ax, tight_layout=False) rect = Rectangle((97.5, 18), 125 - 97.5, 41 - 18, linewidth=1.5, edgecolor='k', facecolor='none') ax.add_patch(rect) plt.colorbar(im, orientation='horizontal', label='elevation (m)', pad=0.1) plt.subplots_adjust(left=0.11, right=0.94, top=0.95, bottom=0.04) plt.savefig(outputs[0])
def plot_dc_anom_wind_region(inputs, outputs, region, num_per_day): (lon, lat, extent, lst_offset, orog_region, precip_region, u_region, v_region) = get_region_data(inputs, region) dc_u = dc(u_region, num_per_day) dc_v = dc(v_region, num_per_day) u_mean = u_region.data.mean(axis=0) v_mean = v_region.data.mean(axis=0) anom_dc_u = dc(u_region - u_mean, num_per_day) anom_dc_v = dc(v_region - v_mean, num_per_day) for h, output in enumerate(outputs): print(h) fig, axes = plt.subplots(1, 2, subplot_kw={'projection': ccrs.PlateCarree()}) fig.set_size_inches(10, 4.5) lst = (h + lst_offset) % 24 fig.suptitle(f'LST: {lst:0.1f}') for ax in axes.flatten(): configure_ax_asia(ax, extent=extent) ax.contour(lon, lat, orog_region.data, [500, 1000, 2000, 3000, 4000, 5000, 6000], cmap='terrain') im = axes[0].quiver(lon[::3], lat[::3], dc_u[h][::3, ::3], dc_v[h][::3, ::3]) im = axes[1].quiver(lon[::3], lat[::3], anom_dc_u[h][::3, ::3], anom_dc_v[h][::3, ::3]) plt.savefig(output) plt.close('all')
def plot_precip_wind_region(inputs, outputs, region, month): (lon, lat, extent, lst_offset, orog_region, precip_region, u_region, v_region) = get_region_data(inputs, region) region_constraint = get_region_constraint(region) orog_mask_cubes_region = iris.load(str(inputs['orog_mask']), region_constraint) dotprod = orog_mask_cubes_region.extract_strict('surf_wind x del orog') expanded_mask = orog_mask_cubes_region.extract_strict( 'expanded surf_wind x del orog > thresh') precip_vmax = precip_region.data.max() dotprod_vmin = dotprod.data.min() dotprod_vmax = dotprod.data.max() # dotprod_absmax = np.max([np.abs(dotprod_vmin), np.abs(dotprod_vmax)]) dotprod_absmax = 0.05 for i, output in enumerate(outputs): print(i) h = i % 24 dom = i // 24 + 1 fig, axes = plt.subplots(2, 2, subplot_kw={'projection': ccrs.PlateCarree()}) fig.set_size_inches(10, 8.5) lst = (h + lst_offset) % 24 fig.suptitle(f'{month} {dom} LST: {lst:0.1f}') for ax in axes.flatten(): configure_ax_asia(ax, extent=extent) ax.contour(lon, lat, orog_region.data, [500, 1000, 2000, 3000, 4000, 5000, 6000], cmap='terrain') im = axes[0, 0].imshow(precip_region.data[i], origin='lower', extent=extent, vmax=precip_vmax, norm=mpl.colors.LogNorm()) im = axes[0, 1].quiver(lon[::3], lat[::3], u_region.data[i][::3, ::3], v_region.data[i][::3, ::3]) im = axes[1, 0].imshow(dotprod.data[i], origin='lower', extent=extent, vmin=-dotprod_absmax, vmax=dotprod_absmax, cmap='bwr') im = axes[1, 1].imshow(expanded_mask.data[i], origin='lower', extent=extent) # plt.colorbar(im, orientation='horizontal', label='precip (??)', pad=0.1) plt.savefig(output) plt.close('all')
def plot_hydrobasins_files(inputs, outputs, hb_name): hb_size = gpd.read_file(str(inputs['shp'])) fig = plt.figure(figsize=(10, 8)) ax = plt.subplot(projection=ccrs.PlateCarree()) ax.set_title(f'scale:{hb_name}, #basins:{len(hb_size)}') hb_size.plot(ax=ax) hb_size.geometry.boundary.plot(ax=ax, color=None, edgecolor='k', linewidth=0.5) configure_ax_asia(ax) plt.savefig(outputs[0]) plt.close('all')
def plot_gridpoint_mean_precip_asia(inputs, outputs): # TODO: Saturated colour scale. cmap, norm, bounds, cbar_kwargs = load_cmap_data( 'cmap_data/li2018_fig2_cb1.pkl') ppt_cubes = [] for dataset, path in inputs.items(): ppt_cube = iris.load_cube(str(path), 'precip_flux_mean') assert ppt_cube.units == 'mm hr-1' ppt_cubes.append(ppt_cube) extent = get_extent_from_cube(ppt_cube) fig, axes = plt.subplots(2, 2, figsize=(10, 7), subplot_kw=dict(projection=ccrs.PlateCarree())) for ax, cube, dataset in zip(axes.flatten(), ppt_cubes, inputs.keys()): ax.set_title(STANDARD_NAMES[dataset]) # Convert from mm hr-1 to mm day-1 im = ax.imshow(cube.data * 24, extent=extent, norm=norm, cmap=cmap) configure_ax_asia(ax, tight_layout=False) xticks = range(60, 160, 40) ax.set_xticks(xticks) ax.set_xticklabels([f'${t}\\degree$ E' for t in xticks]) for ax in axes[:, 1]: ax.get_yaxis().set_ticklabels([]) for ax in axes[0, :].flatten(): ax.get_xaxis().set_ticklabels([]) for i, ax in enumerate(axes.flatten()): c = string.ascii_lowercase[i] ax.text(0.01, 1.06, f'({c})', size=12, transform=ax.transAxes) cax = fig.add_axes([0.12, 0.10, 0.74, 0.02]) cbar_kwargs['extend'] = 'max' cbar_kwargs['ticks'] = [0] + cbar_kwargs['ticks'] plt.colorbar(im, cax=cax, orientation='horizontal', label='precipitation (mm day$^{-1}$)', **cbar_kwargs) plt.subplots_adjust(left=0.06, right=0.95, top=0.95, bottom=0.2, wspace=0.08) # plt.subplots_adjust(left=0.06, right=0.94, top=0.98, bottom=0.17, wspace=0.1) plt.savefig(outputs[0])
def plot_mean_precip(inputs, outputs, dataset, hb_name): weighted_basin_mean_precip_filename = inputs['weighted'] df_mean_precip = pd.read_hdf(weighted_basin_mean_precip_filename) mean_max_min_precip = pickle.loads( inputs['mean_precip_max_min'].read_bytes()) max_mean_precip = mean_max_min_precip['max_mean_precip'] # min_mean_precip = mean_max_min_precip['min_mean_precip'] raster_hb_name = hb_name raster_cube = iris.load_cube(str(inputs['raster_cubes']), f'hydrobasins_raster_{raster_hb_name}') raster = raster_cube.data logger.debug(f'Plot maps - {hb_name}: {dataset}') mean_precip_map = np.zeros_like(raster, dtype=float) for i in range(1, raster.max() + 1): mean_precip_map[raster == i] = df_mean_precip.values[i - 1] extent = get_extent_from_cube(raster_cube) cmap, norm, bounds, cbar_kwargs = load_cmap_data( 'cmap_data/li2018_fig2_cb1.pkl') plt.figure(figsize=(10, 8)) ax = plt.subplot(projection=ccrs.PlateCarree()) plt.title(f'{dataset} mean_precip') grey_fill = np.zeros( (mean_precip_map.shape[0], mean_precip_map.shape[1], 3), dtype=int) grey_fill[raster_cube.data == 0] = (200, 200, 200) ax.imshow(grey_fill, extent=extent) masked_mean_precip_map = np.ma.masked_array(mean_precip_map, raster_cube.data == 0) im = ax.imshow( masked_mean_precip_map * 24, cmap=cmap, norm=norm, # vmin=1e-3, vmax=max_mean_precip, origin='lower', extent=extent) plt.colorbar(im, label=f'precip. (mm day$^{{-1}}$)', **cbar_kwargs, spacing='uniform', orientation='horizontal') configure_ax_asia(ax, extent) mean_precip_filename = outputs[0] plt.savefig(mean_precip_filename) plt.close()
def _configure_hb_name_dataset_map_grid(axes, hb_names, datasets): for ax in axes.flatten(): configure_ax_asia(ax, tight_layout=False) for ax, hb_name in zip(axes[0], hb_names): if hb_name == 'med': hb_name = 'medium' ax.set_title(f'{hb_name} basins') for ax in axes[:, 2].flatten(): ax.get_yaxis().tick_right() for ax in axes[:, :2].flatten(): ax.get_yaxis().set_ticks([]) for ax in axes[:len(axes) - 1, :].flatten(): ax.get_xaxis().set_ticks([]) for i, ax in enumerate(axes.flatten()): c = string.ascii_lowercase[i] ax.text(0.01, 1.04, f'({c})', size=12, transform=ax.transAxes)
def plot_compare_mean_orog_precip(inputs, outputs, models, months): inputs1 = [path for (key, path) in inputs.items() if key[0] == models[0]] inputs2 = [path for (key, path) in inputs.items() if key[0] == models[1]] orog_precip_cubes1 = iris.load([str(p) for p in inputs1]).concatenate() orog_precip_cubes2 = iris.load([str(p) for p in inputs2]).concatenate() extent1, nonorog_precip_mean1, ocean_precip_mean1, orog_precip_mean1 = _extract_precip_fields(orog_precip_cubes1) extent2, nonorog_precip_mean2, ocean_precip_mean2, orog_precip_mean2 = _extract_precip_fields(orog_precip_cubes2) assert extent1 == extent2 extent = extent1 for i, (name, precip1, precip2) in enumerate([('orog', orog_precip_mean1, orog_precip_mean2), ('non orog', nonorog_precip_mean1, nonorog_precip_mean2), ('ocean/water', ocean_precip_mean1, ocean_precip_mean2)]): plt.figure(figsize=(10, 7.5)) ax = plt.axes(projection=ccrs.PlateCarree()) configure_ax_asia(ax) im = ax.imshow(precip2 / precip1 * 100, origin='lower', extent=extent, vmin=0, vmax=200, cmap='bwr_r') plt.colorbar(im, orientation='horizontal', label=f'% change {models[1]}/{models[0]} (%)', pad=0.1) plt.savefig(outputs[i])
def plot_cmorph_min_max(inputs, outputs): min_max_text = inputs['min_max'].read_text() min_data = min_max_text.split('\n')[0].split('=') max_data = min_max_text.split('\n')[1].split('=') assert min_data[0] == 'min' and max_data[0] == 'max' min_start_year = int(min_data[1]) max_start_year = int(max_data[1]) print(min_start_year) print(max_start_year) cmap, norm, bounds, cbar_kwargs = load_cmap_data( 'cmap_data/li2018_fig2_cb1.pkl') fig, axes = plt.subplots(1, 3) keys = ['full', min_start_year, max_start_year] title_min_max = {min_start_year: '(min)', max_start_year: '(max)'} ppt_cubes = [] for ax, key in zip(axes, keys): path = inputs[key] ppt_cube = iris.load_cube(str(path), 'precip_flux_mean') assert ppt_cube.units == 'mm hr-1' ppt_cubes.append(ppt_cube) extent = get_extent_from_cube(ppt_cube) fig, axes = plt.subplots(1, 3, figsize=(10, 3.5), subplot_kw=dict(projection=ccrs.PlateCarree())) for ax, cube, key in zip(axes.flatten(), ppt_cubes, keys): if key == 'full': name = '1998-2018' else: name = f'{key}-{key + 3}' ax.set_title(name) # Convert from mm hr-1 to mm day-1 im = ax.imshow(cube.data * 24, extent=extent, norm=norm, cmap=cmap) configure_ax_asia(ax, tight_layout=False) xticks = range(60, 160, 40) ax.set_xticks(xticks) ax.set_xticklabels([f'${t}\\degree$ E' for t in xticks]) for ax in axes[1:]: ax.get_yaxis().set_ticklabels([]) for i, ax in enumerate(axes.flatten()): c = string.ascii_lowercase[i] ax.text(0.01, 1.06, f'({c})', size=12, transform=ax.transAxes) cax = fig.add_axes([0.12, 0.20, 0.74, 0.02]) plt.colorbar(im, cax=cax, orientation='horizontal', label='precipitation (mm day$^{-1}$)', **cbar_kwargs) plt.subplots_adjust(left=0.06, right=0.94, top=0.99, bottom=0.2, wspace=0.1) plt.savefig(outputs[0])
def plot_fig3(inputs, outputs): m1_cubes = iris.load([ str(inputs[f'al508_diag_{month:02}']) for month in [6, 7, 8] ]).concatenate() m2_cubes = iris.load(str(inputs['al508_direct'])) m1_orog_precip = m1_cubes.extract_strict('orog_precipitation_flux') m1_nonorog_precip = m1_cubes.extract_strict('non_orog_precipitation_flux') m1_ocean_precip = m1_cubes.extract_strict('ocean_precipitation_flux') assert m1_orog_precip.units == 'kg m-2 s-1' assert m1_nonorog_precip.units == 'kg m-2 s-1' assert m1_ocean_precip.units == 'kg m-2 s-1' m1_extent = util.get_extent_from_cube(m1_orog_precip) m1_orog_precip_mean = m1_orog_precip.data.mean( axis=0) * 3600 * 24 # kg m-2 s-1 -> mm day-1 m1_nonorog_precip_mean = m1_nonorog_precip.data.mean( axis=0) * 3600 * 24 # kg m-2 s-1 -> mm day-1 m1_ocean_precip_mean = m1_nonorog_precip.data.mean( axis=0) * 3600 * 24 # kg m-2 s-1 -> mm day-1 m2_orog_precip_mean = m2_cubes.extract_strict( 'orog_precipitation_flux_mean') m2_nonorog_precip_mean = m2_cubes.extract_strict( 'non_orog_precipitation_flux_mean') m2_ocean_precip_mean = m2_cubes.extract_strict( 'ocean_precipitation_flux_mean') m2_extent = util.get_extent_from_cube(m2_orog_precip_mean) fig, axes = plt.subplots(1, 2, figsize=(10, 4), subplot_kw={'projection': ccrs.PlateCarree()}) for ax, (nonorog, orog, ocean), extent in zip( axes.flatten(), [(m1_nonorog_precip_mean, m1_orog_precip_mean, m1_ocean_precip_mean), (m2_nonorog_precip_mean.data, m2_orog_precip_mean.data, m2_ocean_precip_mean.data)], [m1_extent, m2_extent]): configure_ax_asia(ax, tight_layout=False) im = ax.imshow(100 * orog / (orog + nonorog), origin='lower', extent=extent, vmin=0, vmax=100) axes[1].get_yaxis().set_ticks([]) cax = fig.add_axes([0.1, 0.12, 0.8, 0.03]) for i, ax in enumerate(axes.flatten()): c = string.ascii_lowercase[i] ax.text(-0.07, 0.95, f'({c})', size=12, transform=ax.transAxes) axes[0].set_title('M1') axes[1].set_title('M2') plt.colorbar(im, cax=cax, orientation='horizontal', label='% orog.') plt.subplots_adjust(left=0.1, top=0.96, right=0.98, bottom=0.2, hspace=0.07, wspace=0.09) plt.savefig(outputs[0])
def plot_fig4(inputs, outputs): al508_cubes = iris.load(str(inputs['al508_direct'])) ak543_cubes = iris.load(str(inputs['ak543_direct'])) al508_orog_precip_mean = al508_cubes.extract_strict( 'orog_precipitation_flux_mean') al508_nonorog_precip_mean = al508_cubes.extract_strict( 'non_orog_precipitation_flux_mean') al508_ocean_precip_mean = al508_cubes.extract_strict( 'ocean_precipitation_flux_mean') al508_extent = util.get_extent_from_cube(al508_orog_precip_mean) ak543_orog_precip_mean = ak543_cubes.extract_strict( 'orog_precipitation_flux_mean') ak543_nonorog_precip_mean = ak543_cubes.extract_strict( 'non_orog_precipitation_flux_mean') ak543_ocean_precip_mean = ak543_cubes.extract_strict( 'ocean_precipitation_flux_mean') ak543_extent = util.get_extent_from_cube(ak543_orog_precip_mean) al508_mean = al508_orog_precip_mean.data + al508_nonorog_precip_mean.data + al508_ocean_precip_mean.data ak543_mean = ak543_orog_precip_mean.data + ak543_nonorog_precip_mean.data + ak543_ocean_precip_mean.data al508_opf = 100 * al508_orog_precip_mean.data / ( al508_orog_precip_mean.data + al508_nonorog_precip_mean.data) ak543_opf = 100 * ak543_orog_precip_mean.data / ( ak543_orog_precip_mean.data + ak543_nonorog_precip_mean.data) fig, axes = plt.subplots(2, 2, figsize=(10, 6.4), subplot_kw={'projection': ccrs.PlateCarree()}) extent = al508_extent for ax in axes.flatten(): configure_ax_asia(ax, tight_layout=False) im0 = axes[0, 0].imshow(al508_mean, origin='lower', extent=extent, norm=mpl.colors.LogNorm(), vmin=1, vmax=1e2) im1 = axes[1, 0].imshow(ak543_mean, origin='lower', extent=extent, norm=mpl.colors.LogNorm(), vmin=1, vmax=1e2) im3 = axes[0, 1].imshow(al508_opf, origin='lower', extent=extent, vmin=0, vmax=100) im4 = axes[1, 1].imshow(ak543_opf, origin='lower', extent=extent, vmin=0, vmax=100) for ax in axes.flatten()[:2]: ax.get_xaxis().set_ticks([]) for ax in axes[:, 1].flatten(): ax.get_yaxis().set_ticks([]) for i, ax in enumerate(axes.flatten()): c = string.ascii_lowercase[i] ax.text(-0.07, 0.95, f'({c})', size=12, transform=ax.transAxes) axes[0, 0].set_title('total precip.') axes[0, 1].set_title('% orog.') axes[0, 0].set_ylabel('N1280') axes[1, 0].set_ylabel('N1280-EC') cax1 = fig.add_axes([0.1, 0.1, 0.4, 0.03]) cax2 = fig.add_axes([0.56, 0.1, 0.4, 0.03]) plt.colorbar(im1, cax=cax1, orientation='horizontal', label='precip. (mm day$^{-1}$)') plt.colorbar(im3, cax=cax2, orientation='horizontal', label='% orog.') plt.subplots_adjust(left=0.1, top=0.96, right=0.98, bottom=0.2, hspace=0.07, wspace=0.09) plt.savefig(outputs[0]) fig, axes = plt.subplots(1, 2, figsize=(10, 4), subplot_kw={'projection': ccrs.PlateCarree()}) for ax in axes.flatten(): configure_ax_asia(ax, tight_layout=False) for i, ax in enumerate(axes.flatten()): c = string.ascii_lowercase[i] ax.text(-0.07, 0.95, f'({c})', size=12, transform=ax.transAxes) levels = [-20, -10, -5, -1, 1, 5, 10, 20] colour_levels = [0, 0.2, 0.4, 0.5, 0.6, 0.8, 0.99] norm1 = mpl.colors.BoundaryNorm(levels, ncolors=256) colours = [(i / (len(colour_levels) - 1), mpl.cm.bwr_r(v)) for i, v in enumerate(colour_levels)] cmap1 = mpl.colors.LinearSegmentedColormap.from_list('frac_list', colours) im2 = axes[0].imshow(ak543_mean - al508_mean, origin='lower', extent=extent, cmap=cmap1, norm=norm1) levels = [-100, -50, -10, -1, 1, 10, 50, 100] colour_levels = [0, 0.2, 0.4, 0.5, 0.6, 0.8, 0.99] norm2 = mpl.colors.BoundaryNorm(levels, ncolors=256) colours = [(i / (len(colour_levels) - 1), mpl.cm.bwr_r(v)) for i, v in enumerate(colour_levels)] cmap2 = mpl.colors.LinearSegmentedColormap.from_list('frac_list', colours) im5 = axes[1].imshow(ak543_opf - al508_opf, origin='lower', extent=extent, vmin=-100, vmax=100, cmap=cmap2, norm=norm2) axes[1].get_yaxis().set_ticks([]) axes[0].set_title('$\Delta$ total precip.') axes[1].set_title('$\Delta$ % orog.') cax3 = fig.add_axes([0.1, 0.12, 0.4, 0.03]) cax4 = fig.add_axes([0.56, 0.12, 0.4, 0.03]) plt.suptitle('N1280-EC $\minus$ N1280') plt.colorbar(im2, cax=cax3, orientation='horizontal', label='$\Delta$ precip. (mm day$^{-1}$)', extend='both') plt.colorbar(im5, cax=cax4, orientation='horizontal', label='$\Delta$ % orog.') plt.subplots_adjust(left=0.1, top=0.96, right=0.98, bottom=0.2, hspace=0.07, wspace=0.09) plt.savefig(outputs[1])
def plot_phase_mag(inputs, outputs, dataset, hb_name, mode): weighted_basin_phase_mag_filename = inputs['weighted'] df_phase_mag = pd.read_hdf(weighted_basin_phase_mag_filename) raster_hb_name = hb_name raster_cube = iris.load_cube(str(inputs['raster_cubes']), f'hydrobasins_raster_{raster_hb_name}') raster = raster_cube.data phase_filename, alpha_phase_filename, mag_filename = outputs print(f'Plot maps - {hb_name}_{mode}: {dataset}') cmap, norm, bounds, cbar_kwargs = load_cmap_data( 'cmap_data/li2018_fig3_cb.pkl') phase_map, mag_map = gen_map_from_basin_values(df_phase_mag, raster) phase_map = iris.cube.Cube(phase_map, long_name='phase_map', units='hr', dim_coords_and_dims=[ (raster_cube.coord('latitude'), 0), (raster_cube.coord('longitude'), 1) ]) mag_map = iris.cube.Cube(mag_map, long_name='magnitude_map', units='-', dim_coords_and_dims=[ (raster_cube.coord('latitude'), 0), (raster_cube.coord('longitude'), 1) ]) extent = get_extent_from_cube(phase_map) plt.figure(figsize=(10, 8)) ax = plt.subplot(projection=ccrs.PlateCarree()) ax.set_title(f'{dataset} {mode} phase') masked_phase_map = np.ma.masked_array(phase_map.data, raster_cube.data == 0) masked_mag_map = np.ma.masked_array(mag_map.data, raster_cube.data == 0) im = ax.imshow(masked_phase_map, cmap=cmap, norm=norm, origin='lower', extent=extent, vmin=0, vmax=24) plt.colorbar(im, orientation='horizontal') configure_ax_asia(ax, extent) # plt.tight_layout() plt.savefig(phase_filename) plt.close() fig = plt.figure(figsize=(10, 8)) ax = plt.subplot(projection=ccrs.PlateCarree()) ax.set_title(f'{dataset} {mode} phase (alpha)') _plot_phase_alpha(ax, masked_phase_map, masked_mag_map, cmap, norm, extent) configure_ax_asia(ax, extent) cax, _ = cbar.make_axes_gridspec(ax, orientation='horizontal') v = np.linspace(0, 1, 24) d = cmap(v)[None, :, :4] * np.ones((3, 24, 4)) d[1, :, 3] = 0.66 d[0, :, 3] = 0.33 cax.imshow(d, origin='lower', extent=(0, 24, 0, 2), aspect='auto') cax.set_yticks([]) cax.set_xticks(np.linspace(0, 24, 9)) # plt.tight_layout() plt.savefig(alpha_phase_filename) plt.close() plt.figure(figsize=(10, 8)) ax = plt.subplot(projection=ccrs.PlateCarree()) ax.set_title(f'{dataset} {mode} strength') im = ax.imshow(masked_mag_map, origin='lower', extent=extent, vmin=1e-2, norm=LogNorm()) plt.colorbar(im, orientation='horizontal') configure_ax_asia(ax, extent) # plt.tight_layout() plt.savefig(mag_filename) plt.close()
def plot_obs_mean_precip_diff(inputs, outputs, dataset, hb_name): weighted_basin_mean_precip_filename = inputs['dataset_weighted'] obs_weighted_basin_mean_precip_filename = inputs['obs_weighted'] df_mean_precip = pd.read_hdf(weighted_basin_mean_precip_filename) df_obs_mean_precip = pd.read_hdf(obs_weighted_basin_mean_precip_filename) # There can be NaNs in the datasets, as in e.g. APHRODITE at some fine-scale basins. # Use version of RMSE and MAE that mask these out. obs_rmse = rmse_mask_out_nan( df_mean_precip.basin_weighted_mean_precip_mm_per_hr.values.astype( float), df_obs_mean_precip.basin_weighted_mean_precip_mm_per_hr.values.astype( float)) obs_mae = mae_mask_out_nan( df_mean_precip.basin_weighted_mean_precip_mm_per_hr.values.astype( float), df_obs_mean_precip.basin_weighted_mean_precip_mm_per_hr.values.astype( float)) raster_hb_name = hb_name raster_cube = iris.load_cube(str(inputs['raster_cubes']), f'hydrobasins_raster_{raster_hb_name}') raster = raster_cube.data mean_precip_map = np.zeros_like(raster, dtype=float) for i in range(1, raster.max() + 1): mean_precip_map[raster == i] = df_mean_precip.values[i - 1] obs_mean_precip_map = np.zeros_like(raster, dtype=float) for i in range(1, raster.max() + 1): obs_mean_precip_map[raster == i] = df_obs_mean_precip.values[i - 1] extent = get_extent_from_cube(raster_cube) plt.figure(figsize=(10, 8)) ax = plt.subplot(projection=ccrs.PlateCarree()) plt.title( f'{dataset} mean_precip. RMSE: {obs_rmse:.3f} mm hr$^{{-1}}$; MAE: {obs_mae:.3f} mm hr$^{{-1}}$' ) grey_fill = np.zeros( (mean_precip_map.shape[0], mean_precip_map.shape[1], 3), dtype=int) grey_fill[raster_cube.data == 0] = (200, 200, 200) ax.imshow(grey_fill, extent=extent) masked_mean_precip_map = np.ma.masked_array( mean_precip_map - obs_mean_precip_map, raster_cube.data == 0) im = ax.imshow( masked_mean_precip_map, cmap='bwr', norm=MidPointNorm(0, -1, 3), # vmin=-absmax, vmax=absmax, origin='lower', extent=extent) plt.colorbar(im, label=f'precip. (mm hr$^{{-1}}$)', orientation='horizontal') configure_ax_asia(ax, extent) mean_precip_filename = outputs[0] plt.savefig(mean_precip_filename) plt.close()