def main(start_year=1980, end_year=2010, months=None): default_path = "/skynet3_rech1/huziy/hdf_store/quebec_0.1_crcm5-hcd-rl-intfl_ITFS.hdf5" # default_path = "/skynet3_rech1/huziy/hdf_store/quebec_0.1_crcm5-hcd-rl-intfl_ITFS_avoid_truncation1979-1989.hdf5" if months is None: months = list(range(1, 13)) img_folder = os.path.join("interflow_corr_images", os.path.basename(default_path)) if not os.path.isdir(img_folder): os.makedirs(img_folder) img_filename = "interflow_correlations_months={}_{}-{}.pdf".format( "-".join(str(m) for m in months), start_year, end_year) lons, lats, basemap = analysis.get_basemap_from_hdf(file_path=default_path) lons[lons > 180] -= 360 x, y = basemap(lons, lats) # Correlate interflow rate and soil moisture params = dict(path1=default_path, varname1="INTF", level1=0, path2=default_path, level2=0, varname2="I1", months=months) params.update(dict( start_year=start_year, end_year=end_year, )) title_list = [] data_list = [] corr1, intf_clim, i1_clim = calculate_correlation_field_for_climatology( **params) to_plot1 = maskoceans(lons, lats, corr1) title_list.append("Corr({}, {})".format( infovar.get_display_label_for_var(params["varname1"]), infovar.get_display_label_for_var(params["varname2"]))) data_list.append(to_plot1) # correlate interflow and precip params.update(dict(varname2="PR", level2=0)) corr2, i1_clim, pr_clim = calculate_correlation_field_for_climatology( **params) to_plot2 = np.ma.masked_where(to_plot1.mask, corr2) title_list.append("Corr({}, {})".format( infovar.get_display_label_for_var(params["varname1"]), infovar.get_display_label_for_var(params["varname2"]))) data_list.append(to_plot2) # correlate precip and soil moisture # params.update(dict(varname1="I1", level1=0)) # corr3 = calculate_correlation_field_for_climatology(**params) # to_plot3 = np.ma.masked_where(to_plot2.mask, corr3) # title_list.append("Corr({}, {})".format(params["varname1"], params["varname2"])) # data_list.append(to_plot3) # correlate evaporation and soil moisture params.update(dict(varname2="AV", level2=0, varname1="I1", level1=0)) corr4, i1_clim, av_clim = calculate_correlation_field_for_climatology( **params) to_plot3 = np.ma.masked_where(to_plot1.mask, corr4) title_list.append("Corr({}, {})".format( infovar.get_display_label_for_var(params["varname1"]), infovar.get_display_label_for_var(params["varname2"]))) data_list.append(to_plot3) # correlate interflow and evaporation params.update(dict(varname2="AV", level2=0, varname1="INTF", level1=0)) corr4, intf_clim, av_clim = calculate_correlation_field_for_climatology( **params) to_plot4 = np.ma.masked_where(to_plot1.mask, corr4) title_list.append("Corr({}, {})".format( infovar.get_display_label_for_var(params["varname1"]), infovar.get_display_label_for_var(params["varname2"]))) data_list.append(to_plot4) # TODO: Correlate infiltration and surface runoff # Do plotting clevels = np.arange(-1, 1.2, 0.2) npanels = len(data_list) gs = GridSpec(1, npanels + 1, width_ratios=[ 1.0, ] * npanels + [ 0.05, ]) fig = plt.figure() assert isinstance(fig, Figure) fig.set_figheight(1.5 * fig.get_figheight()) img = None for col in range(npanels): ax = fig.add_subplot(gs[0, col]) basemap.drawmapboundary(fill_color="0.75", ax=ax) img = basemap.contourf(x, y, data_list[col], levels=clevels, cmap=cm.get_cmap("RdBu_r", len(clevels) - 1)) plt.title(title_list[col]) basemap.drawcoastlines(linewidth=cpp.COASTLINE_WIDTH, ax=ax) plt.colorbar(img, cax=fig.add_subplot(gs[0, npanels])) fig.savefig(os.path.join(img_folder, img_filename), dpi=cpp.FIG_SAVE_DPI) # plot timeseries the_mask = corr4 < -0.1 varname_to_ts = { "INTF": get_mean_over(the_mask, intf_clim), "LH": get_mean_over(the_mask, av_clim), "SM": get_mean_over(the_mask, i1_clim) } from matplotlib import gridspec fig = plt.figure() fig.set_figheight(3 * fig.get_figheight()) gs = gridspec.GridSpec(len(varname_to_ts), 1) d0 = datetime(2001, 1, 1) dt = timedelta(days=1) dates = [d0 + dt * i for i in range(365) if (d0 + dt * i).month in months] sfmt = ScalarFormatter() dfmt = DateFormatter("%d%b") for i, (label, data) in enumerate(varname_to_ts.items()): ax = fig.add_subplot(gs[i, 0]) ax.plot(dates, data, label=label, lw=2) ax.grid() ax.legend() ax.yaxis.set_major_formatter(sfmt) if i < len(varname_to_ts) - 1: ax.xaxis.set_ticklabels([]) else: ax.xaxis.set_major_formatter(dfmt) fig.savefig(os.path.join( img_folder, "aa_ts_{}_{}.png".format(os.path.basename(default_path), "-".join(str(m) for m in months))), dpi=cpp.FIG_SAVE_DPI)
def main_compare_two_simulations(): """ draw (params2 - params0) climatologic profiles, and a region of interest """ #folder for storing result images img_folder = "" start_date = datetime(1980, 1, 1) end_date = datetime(2010, 12, 31) path0 = "/skynet3_rech1/huziy/hdf_store/quebec_0.1_crcm5-hcd-rl.hdf5" path2 = "/skynet3_rech1/huziy/hdf_store/quebec_0.1_crcm5-hcd-rl-intfl_ITFS.hdf5" exp_label = "interflow_effect_soil" img_folder = "images_for_lake-river_paper" img_folder = os.path.join(img_folder, exp_label) if not os.path.isdir(img_folder): os.makedirs(img_folder) rectangle = IndexRectangle(lower_left_point=IndexPoint(40, 20), width=100, height=45) params2 = InputParams(hdf_path=path2, is_for_comparison=True, start_date=start_date, end_date=end_date, rectangle=rectangle) params0 = InputParams(hdf_path=path0, is_for_comparison=True, start_date=start_date, end_date=end_date, rectangle=rectangle) imin, jmin, w, h = params0.get_start_end_indices_of_selected_region() i_sel, j_sel = np.where(params0.get_land_mask_using_flow_dirs()) i_sel_1 = i_sel[(i_sel >= imin) & (i_sel < imin + w) & (j_sel >= jmin) & (j_sel < jmin + h)] j_sel_1 = j_sel[(i_sel >= imin) & (i_sel < imin + w) & (j_sel >= jmin) & (j_sel < jmin + h)] i_sel = i_sel_1 j_sel = j_sel_1 levs2d, dnums2d = None, None #plot the profile fig = plt.figure() gs = gridspec.GridSpec(len(params0.var_list), 2) #The number of levels of interest n_select_level = 5 #calculate and plot differences for vindex, var_name in enumerate(params0.var_list): print("plotting {0} ...".format(var_name)) dates, levels, data2 = params2.calculate_mean_clim_for_3d_var( var_name=var_name) _, _, data0 = params0.calculate_mean_clim_for_3d_var(var_name=var_name) data = data2 - data0 #calculate the profile selected_diff = data[:, :n_select_level, i_sel, j_sel] sel_data = (data0[:, :n_select_level, i_sel, j_sel] + data2[:, :n_select_level, i_sel, j_sel]) * 0.5 selected_mean = np.zeros_like(sel_data) where_to_compute = np.abs(selected_diff) > 0 selected_mean[where_to_compute] = selected_diff[ where_to_compute] / sel_data[where_to_compute] * 100.0 selected_mean = selected_mean.mean(axis=2) #rectangle subplot ax = fig.add_subplot(gs[:, 0]) params0.basemap.drawcoastlines(linewidth=cpp.COASTLINE_WIDTH, ax=ax) ax.add_patch(params0.get_mpl_rectangle_for_selected_region()) #profile subplot ax = fig.add_subplot(gs[vindex, 1]) assert isinstance(ax, Axes) if levs2d is None: ax.set_ylabel("Depth (m)") levels_meters = np.cumsum([ 0, ] + class_conf.level_width_list_26_default)[:-1][:n_select_level] dnums = date2num(dates) levs2d, dnums2d = np.meshgrid(levels_meters, dnums) vmin, vmax = selected_mean.min(), selected_mean.max() d = max(abs(vmin), abs(vmax)) ncolors = 11 cmap = cm.get_cmap("RdBu_r", ncolors) color_levs = np.linspace(-d, d, ncolors + 1) step = color_levs[1] - color_levs[0] ndec = abs(floor(np.log10(step))) color_levs = np.round(color_levs, decimals=int(ndec)) img = ax.contourf(dnums2d, levs2d, selected_mean, cmap=cmap, levels=color_levs) cb = plt.colorbar(img, ticks=color_levs[::2]) cb.ax.set_aspect(10) ax.xaxis.set_major_formatter(DateFormatter("%d\n%b")) ax.xaxis.set_major_locator(MonthLocator(bymonth=list(range(1, 13, 2)))) if vindex < len(params0.var_list) - 1: ax.xaxis.set_ticklabels([]) ax.invert_yaxis() ax.yaxis.set_major_locator(MaxNLocator(nbins=5)) #ax.grid(b = True) ax.annotate(infovar.get_display_label_for_var(var_name), xy=(0.8, 0.2), xycoords="axes fraction", bbox=dict(facecolor="w")) #construct the path to the output figure impath = os.path.join( img_folder, params0.get_imfilename_for_var(var_name="_".join(params0.var_list))) #save the figure fig.savefig(impath, dpi=cpp.FIG_SAVE_DPI, bbox_inches="tight") plt.close(fig)
def main_compare_two_simulations(): """ draw (params2 - params0) climatologic profiles, and a region of interest """ #folder for storing result images img_folder = "" start_date = datetime(1980, 1, 1) end_date = datetime(2010, 12, 31) path0 = "/skynet3_rech1/huziy/hdf_store/quebec_0.1_crcm5-hcd-rl.hdf5" path2 = "/skynet3_rech1/huziy/hdf_store/quebec_0.1_crcm5-hcd-rl-intfl_ITFS.hdf5" exp_label = "interflow_effect_soil" img_folder = "images_for_lake-river_paper" img_folder = os.path.join(img_folder, exp_label) if not os.path.isdir(img_folder): os.makedirs(img_folder) rectangle = IndexRectangle( lower_left_point=IndexPoint(40, 20), width=100, height=45 ) params2 = InputParams(hdf_path = path2, is_for_comparison=True, start_date=start_date, end_date=end_date, rectangle=rectangle) params0 = InputParams(hdf_path=path0, is_for_comparison=True, start_date=start_date, end_date=end_date, rectangle=rectangle) imin, jmin, w, h = params0.get_start_end_indices_of_selected_region() i_sel, j_sel = np.where(params0.get_land_mask_using_flow_dirs()) i_sel_1 = i_sel[(i_sel >= imin) & (i_sel < imin + w) & (j_sel >= jmin) & (j_sel < jmin + h)] j_sel_1 = j_sel[(i_sel >= imin) & (i_sel < imin + w) & (j_sel >= jmin) & (j_sel < jmin + h)] i_sel = i_sel_1 j_sel = j_sel_1 levs2d, dnums2d = None, None #plot the profile fig = plt.figure() gs = gridspec.GridSpec(len(params0.var_list), 2) #The number of levels of interest n_select_level = 5 #calculate and plot differences for vindex, var_name in enumerate(params0.var_list): print("plotting {0} ...".format(var_name)) dates, levels, data2 = params2.calculate_mean_clim_for_3d_var(var_name=var_name) _, _, data0 = params0.calculate_mean_clim_for_3d_var(var_name=var_name) data = data2 - data0 #calculate the profile selected_diff = data[:, :n_select_level, i_sel, j_sel] sel_data = (data0[:, :n_select_level, i_sel, j_sel] + data2[:, :n_select_level, i_sel, j_sel]) * 0.5 selected_mean = np.zeros_like(sel_data) where_to_compute = np.abs(selected_diff) > 0 selected_mean[where_to_compute] = selected_diff[where_to_compute] / sel_data[where_to_compute] * 100.0 selected_mean = selected_mean.mean(axis=2) #rectangle subplot ax = fig.add_subplot(gs[:, 0]) params0.basemap.drawcoastlines(linewidth=cpp.COASTLINE_WIDTH, ax=ax) ax.add_patch(params0.get_mpl_rectangle_for_selected_region()) #profile subplot ax = fig.add_subplot(gs[vindex, 1]) assert isinstance(ax, Axes) if levs2d is None: ax.set_ylabel("Depth (m)") levels_meters = np.cumsum([0, ] + class_conf.level_width_list_26_default)[:-1][:n_select_level] dnums = date2num(dates) levs2d, dnums2d = np.meshgrid(levels_meters, dnums) vmin, vmax = selected_mean.min(), selected_mean.max() d = max(abs(vmin), abs(vmax)) ncolors = 11 cmap = cm.get_cmap("RdBu_r", ncolors) color_levs = np.linspace(-d, d, ncolors + 1) step = color_levs[1] - color_levs[0] ndec = abs(floor(np.log10(step))) color_levs = np.round(color_levs, decimals=int(ndec)) img = ax.contourf(dnums2d, levs2d, selected_mean, cmap = cmap, levels = color_levs) cb = plt.colorbar(img, ticks = color_levs[::2]) cb.ax.set_aspect(10) ax.xaxis.set_major_formatter(DateFormatter("%d\n%b")) ax.xaxis.set_major_locator(MonthLocator(bymonth=list(range(1, 13, 2)))) if vindex < len(params0.var_list) - 1: ax.xaxis.set_ticklabels([]) ax.invert_yaxis() ax.yaxis.set_major_locator(MaxNLocator(nbins=5)) #ax.grid(b = True) ax.annotate(infovar.get_display_label_for_var(var_name), xy = (0.8, 0.2), xycoords = "axes fraction", bbox = dict(facecolor = "w")) #construct the path to the output figure impath = os.path.join(img_folder, params0.get_imfilename_for_var(var_name = "_".join(params0.var_list))) #save the figure fig.savefig(impath, dpi=cpp.FIG_SAVE_DPI, bbox_inches = "tight") plt.close(fig)
def main(start_year=1980, end_year=2010, months=None, ylabel="", fig=None, current_row=0, gs=None): default_path = "/skynet3_rech1/huziy/hdf_store/quebec_0.1_crcm5-hcd-rl-intfl_ITFS.hdf5" # default_path = "/skynet3_rech1/huziy/hdf_store/quebec_0.1_crcm5-hcd-rl-intfl_ITFS_avoid_truncation1979-1989.hdf5" if months is None: months = list(range(1, 13)) img_folder = os.path.join("interflow_corr_images", os.path.basename(default_path)) if not os.path.isdir(img_folder): os.makedirs(img_folder) img_filename = "4x1_correlations_INTF-PR-I1-Infilt_months={}_{}-{}.png".format("-".join(str(m) for m in months), start_year, end_year) lons, lats, basemap = analysis.get_basemap_from_hdf(file_path=default_path) lons[lons > 180] -= 360 x, y = basemap(lons, lats) # Correlate interflow rate and soil moisture params = dict( path1=default_path, varname1="INTF", level1=0, path2=default_path, level2=0, varname2="I1", months=months ) params.update(dict( start_year=start_year, end_year=end_year, )) title_list = [] data_list = [] corr1, intf_clim, i1_clim = calculate_correlation_field_for_climatology(**params) to_plot1 = maskoceans(lons, lats, corr1) # title_list.append("Corr({}, {})".format( # infovar.get_display_label_for_var(params["varname1"]), # infovar.get_display_label_for_var(params["varname2"]))) # data_list.append(to_plot1) # correlate interflow and precip params.update(dict(varname2="PR", level2=0)) corr2, _, pr_clim = calculate_correlation_field_for_climatology(**params) to_plot2 = np.ma.masked_where(to_plot1.mask, corr2) title_list.append("Corr({}, {})".format( infovar.get_display_label_for_var(params["varname1"]), infovar.get_display_label_for_var(params["varname2"]))) data_list.append(to_plot2) # correlate precip and soil moisture # params.update(dict(varname1="I1", level1=0)) # corr3, _, _ = calculate_correlation_field_for_climatology(**params) # to_plot3 = np.ma.masked_where(to_plot2.mask, corr3) # title_list.append("Corr({}, {})".format( # infovar.get_display_label_for_var(params["varname1"]), # infovar.get_display_label_for_var(params["varname2"]))) # data_list.append(to_plot3) # correlate interflow and infiltration # corr4 = calculate_correlation_of_infiltration_rate_with(start_year=start_year, # end_year=end_year, # path_for_infiltration_data=default_path, # path2=default_path, # varname2="INTF", # level2=0, months=months) # Correlate interflow rate with latent heat flux params = dict( path1=default_path, varname1="INTF", level1=0, path2=default_path, level2=0, varname2="AV", months=months, start_year=start_year, end_year=end_year, ) corr4, _, _ = calculate_correlation_field_for_climatology(**params) to_plot4 = np.ma.masked_where(to_plot1.mask, corr4) title_list.append("Corr({}, {})".format( infovar.get_display_label_for_var(params["varname1"]), infovar.get_display_label_for_var(params["varname2"]))) data_list.append(to_plot4) # Correlate interflow rate with soil ice params = dict( path1=default_path, varname1="INTF", level1=0, path2=default_path, level2=0, varname2="I2", months=months, start_year=start_year, end_year=end_year, ) corr4, _, _ = calculate_correlation_field_for_climatology(**params) to_plot4 = np.ma.masked_where(to_plot1.mask, corr4) title_list.append("Corr({}, {})".format( infovar.get_display_label_for_var(params["varname1"]), infovar.get_display_label_for_var(params["varname2"]))) data_list.append(to_plot4) # Correlate interflow rate with swe params = dict( path1=default_path, varname1="INTF", level1=0, path2=default_path, level2=0, varname2="I5", months=months, start_year=start_year, end_year=end_year, ) corr4, _, _ = calculate_correlation_field_for_climatology(**params) to_plot4 = np.ma.masked_where(to_plot1.mask, corr4) title_list.append("Corr({}, {})".format( infovar.get_display_label_for_var(params["varname1"]), infovar.get_display_label_for_var(params["varname2"]))) data_list.append(to_plot4) # Correlate LHF rate with swe params = dict( path1=default_path, varname1="AV", level1=0, path2=default_path, level2=0, varname2="I5", months=months, start_year=start_year, end_year=end_year, ) corr4, _, _ = calculate_correlation_field_for_climatology(**params) to_plot4 = np.ma.masked_where(to_plot1.mask, corr4) title_list.append("Corr({}, {})".format( infovar.get_display_label_for_var(params["varname1"]), infovar.get_display_label_for_var(params["varname2"]))) data_list.append(to_plot4) # Do plotting clevels = np.arange(-1, 1.2, 0.2) npanels = len(data_list) if gs is None: gs = GridSpec(1, npanels + 1, width_ratios=[1.0, ] * npanels + [0.05, ]) is_subplot = fig is not None fig = plt.figure() if fig is None else fig assert isinstance(fig, Figure) # fig.set_figheight(1.5 * fig.get_figheight()) img = None for col in range(npanels): ax = fig.add_subplot(gs[current_row, col]) if not col: ax.set_ylabel(ylabel) basemap.drawmapboundary(fill_color="0.75", ax=ax) img = basemap.contourf(x, y, data_list[col], levels=clevels, cmap=cm.get_cmap("RdBu_r", len(clevels) - 1)) if current_row == 0: ax.set_title(title_list[col]) basemap.drawcoastlines(linewidth=cpp.COASTLINE_WIDTH, ax=ax) if not is_subplot: plt.colorbar(img, cax=fig.add_subplot(gs[0, npanels])) fig.savefig(os.path.join(img_folder, img_filename), dpi=cpp.FIG_SAVE_DPI) return img, img_folder