Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 4
0
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