Beispiel #1
0
def run_all_plots():

    #************************************************************************
    # Global Map
    if True:
        cube = read_data(
            DATALOC +
            "GSG_{}annual mean_G_ano_ref1998-2008.txt".format(settings.YEAR))

        bounds = [-100, -20, -15, -8, -4, 0, 4, 8, 15, 20, 100]
        bounds = [-200, -90, -40, -15, -5, -1, 1, 5, 15, 40, 90, 200]

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "SOZ_{}_anoms".format(settings.YEAR), cube,
            settings.COLOURMAP_DICT["composition"], bounds,
            "Anomalies from 1998-2008 (DU)")

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "p2.1_SOZ_{}_anoms".format(settings.YEAR),
            cube,
            settings.COLOURMAP_DICT["composition"],
            bounds,
            "Anomalies from 1998-2008 (DU)",
            figtext="(z) Stratospheric (Total Column) Ozone")

    #************************************************************************
    # Timeseries (plate 1.1)
    if True:
        #    nh = read_ts(DATALOC + "tozave_60N_90N_3_3.dat")
        #    sh = read_ts(DATALOC + "tozave_90S_60S_10_10.dat")

        nh = read_ts(DATALOC + "NH_polar_ozone.txt")
        sh = read_ts(DATALOC + "SH_polar_ozone.txt")

        fig = plt.figure(figsize=(8, 6))
        plt.clf()

        plt.plot(nh.times, nh.data, "b-", label="March NH")
        plt.plot(sh.times, sh.data, "r-", label="October SH")

        plt.ylabel("total Ozone (DU")
        plt.title("Polar Ozone")

        plt.legend()
        plt.savefig(settings.IMAGELOC + "SOZ_ts{}".format(settings.OUTFMT))

    return  # run_all_plots
Beispiel #2
0
def run_all_plots():

    #************************************************************************
    # Global Map
    if True:

        bounds = [-1000, -160, -120, -80, -40, 0, 40, 80, 120, 160, 1000]
        cube = read_map(DATALOC + "map")

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "GLE_{}_anoms".format(settings.YEAR), cube,
            settings.COLOURMAP_DICT["hydrological"], bounds,
            "Anomalies from 1981-2010 (mm year" + r'$^{-1}$' + ")")
        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "p2.1_GLE_{}_anoms".format(settings.YEAR),
            cube,
            settings.COLOURMAP_DICT["hydrological"],
            bounds,
            "Anomalies from 1981-2010 (mm year" + r'$^{-1}$' + ")",
            figtext="(s) Land Evaporation")

    # Evaporation Map
    if True:

        bounds = [-1000, -160, -120, -80, -40, 0, 40, 80, 120, 160, 1000]
        cube = read_map(DATALOC + "map_transp")

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "GLE_{}_transp".format(settings.YEAR), cube,
            settings.COLOURMAP_DICT["hydrological"], bounds,
            "Anomalies from 1981-2010 (mm year" + r'$^{-1}$' + ")")

    print("no other figures for {}'s report - author has made own".format(
        settings.YEAR))
    sys.exit()
    #************************************************************************
    # Timeseries figures
    if False:
        fig, ax1 = plt.subplots(figsize=(8, 5))

        globe, NH, SH, SOI = read_time(DATALOC + "timeseries")

        utils.plot_ts_panel(ax1, [globe, NH, SH],
                            "-",
                            "hydrological",
                            loc=LEGEND_LOC)

        for data in [globe, NH, SH]:
            slope, dummy, dummy = utils.median_pairwise_slopes(
                data.times, data.data, -99.9, 1.)

            fit_years, fit_values = utils.mpw_plot_points(
                slope, data.times, data.data)

            ax1.plot(fit_years, fit_values, c=settings.COLOURS["hydrological"][data.name], \
                         lw=2, ls="--")

        ax1.set_ylabel("Anomalies (mm year" + r'$^{-1}$' + ")",
                       fontsize=settings.FONTSIZE)
        ax1.set_ylim([-29, 29])

        for tick in ax1.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        ax2 = ax1.twinx()

        interpTimes = np.linspace(SOI.times[0], SOI.times[-1], 1000)
        interpData = np.interp(interpTimes, SOI.times, SOI.data)
        interpSOI = utils.Timeseries("SOI", interpTimes, interpData)

        ax2.fill_between(interpSOI.times, interpSOI.data, where=interpSOI.data >= 0, \
                             color='b', alpha=0.5, zorder=-1)
        ax2.fill_between(interpSOI.times, interpSOI.data, where=interpSOI.data <= 0, \
                             color='r', alpha=0.5, zorder=-1)

        ax2.set_xlim([1979, int(settings.YEAR) + 1])
        ax2.set_ylim([-5, 5])
        ax2.set_ylabel("SOI", fontsize=settings.FONTSIZE)

        for tick in ax1.yaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax2.yaxis.get_major_ticks():
            tick.label2.set_fontsize(settings.FONTSIZE)

        utils.thicken_panel_border(ax2)

        plt.savefig(settings.IMAGELOC + "GLE_ts{}".format(settings.OUTFMT))

        plt.close()

    #************************************************************************
    # Hoemuller figure
    if False:
        bounds = [-100, -10, -8, -4, -2, 0, 2, 4, 8, 10, 100]
        times, latitudes, indata = read_hovmuller(DATALOC + "latitudinal")

        utils.plot_hovmuller(settings.IMAGELOC + "GLE_hovmuller", times, latitudes, indata, \
                             settings.COLOURMAP_DICT["hydrological"], bounds, \
                             "Anomaly (mm month"+r'$^{-1}$'+")")

    return  # run_all_plots
Beispiel #3
0
def run_all_plots():

    #************************************************************************
    # Precipitation Timeseries
    if False:

        ghcn, gpcc, gpcp, ghcn2, erai, merra2 = read_land(
            DATALOC + "Land_insitu_timeseries-1979.dat")

        fig = plt.figure(figsize=(8, 5))

        ax1 = plt.axes([0.1, 0.1, 0.85, 0.85])

        # Land
        utils.plot_ts_panel(ax1, [ghcn, gpcc, gpcp, ghcn2, erai, merra2],
                            "-",
                            "hydrological",
                            loc=LEGEND_LOC,
                            bbox=BBOX)

        ax1.set_ylim([-60, 100])
        ax1.yaxis.set_ticks([-50, -25, 0, 25, 50, 75, 100])
        ax1.set_ylabel("Anomaly (mm)", fontsize=settings.FONTSIZE)

        for tick in ax1.yaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax1.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        # ax1.text(0.02, 0.9, "(a) Land in Situ", transform=ax1.transAxes, fontsize=settings.LABEL_FONTSIZE)

        plt.savefig(settings.IMAGELOC + "PCP_ts{}".format(settings.OUTFMT))
        plt.close()

    # old 3-panel plot for 2015 report
    if False:
        fig = plt.figure(figsize=(8, 8))

        ax1 = plt.axes([0.11, 0.68, 0.78, 0.3])
        ax2 = plt.axes([0.11, 0.38, 0.78, 0.3], sharex=ax1)
        ax3 = plt.axes([0.11, 0.08, 0.78, 0.3], sharex=ax1)

        # Land
        utils.plot_ts_panel(ax1, [ghcn, gpcc, gpcp, ghcn2, erai, merra2],
                            "-",
                            "hydrological",
                            loc=LEGEND_LOC,
                            bbox=BBOX)

        # Ocean
        ocean_year = read_domain(
            DATALOC + "gpcp_v23_globalocean_ann_1979_2018", "GPCP")

        o_clim, o_anoms = utils.calculate_climatology_and_anomalies_1d(
            ocean_year, 1981, 2010)

        ax2.plot(o_anoms.times,
                 o_anoms.data,
                 c="b",
                 ls="-",
                 label=o_anoms.name,
                 lw=2)

        # Nino and others
        land_year = read_domain(DATALOC + "gpcp_v23_globalland_ann_1979_2018",
                                "GPCP")
        l_clim, l_anoms = utils.calculate_climatology_and_anomalies_1d(
            land_year, 1981, 2010)
        combined_year = read_domain(
            DATALOC + "gpcp_v23_globallandocean_ann_1979_2018", "GPCP")
        c_clim, c_anoms = utils.calculate_climatology_and_anomalies_1d(
            combined_year, 1981, 2010)

        nino = read_domain(DATALOC + "nino34_1979_2018_ann_anomaly",
                           "Nino 3.4")

        ax3.plot(o_anoms.times,
                 o_anoms.data,
                 c="b",
                 ls="-",
                 label="{} Ocean".format(o_anoms.name),
                 lw=2,
                 zorder=10)
        ax3.plot(l_anoms.times,
                 l_anoms.data,
                 c="lime",
                 ls="-",
                 label="{} Land".format(l_anoms.name),
                 lw=2,
                 zorder=10)
        ax3.plot(c_anoms.times,
                 c_anoms.data,
                 c="r",
                 ls="-",
                 label="{} Land + Ocean".format(c_anoms.name),
                 lw=2,
                 zorder=10)
        ax3.plot([1960, 1961], [0, 0], c="k", label="Nino 3.4")

        ax4 = ax3.twinx()
        ax4.plot(nino.times, nino.data, c="k", zorder=1)
        ax4.fill_between(nino.times,
                         nino.data,
                         0,
                         color="0.5",
                         label=nino.name,
                         zorder=1)
        ax4.set_ylim([-1.9, 1.9])

        ax3.patch.set_visible(False)
        ax3.set_zorder(ax4.get_zorder() + 1)

        #*******************
        # prettify
        minorLocator = MultipleLocator(1)
        ax1.set_ylim([-60, 100])
        ax1.yaxis.set_ticks([-50, 0, 50, 100])
        for ax in [ax2, ax3]:
            ax.set_ylim([-50, 50])
            ax.axhline(0, c='0.5', ls='--')
            ax.legend(loc=LEGEND_LOC, ncol=2, frameon=False, prop={'size':settings.LEGEND_FONTSIZE}, \
                              labelspacing=0.1, columnspacing=0.5, bbox_to_anchor=BBOX)
            ax.xaxis.set_minor_locator(minorLocator)
            ax.yaxis.set_ticks_position('left')
            utils.thicken_panel_border(ax)

        ax2.set_ylabel("Anomaly (mm yr" + r'$^{-1}$' + ")",
                       fontsize=settings.FONTSIZE)
        plt.setp(ax1.get_xticklabels(), visible=False)
        plt.setp(ax2.get_xticklabels(), visible=False)

        ax4.set_xlim([1979, int(settings.YEAR) + 1])
        ax4.yaxis.set_label_position("right")
        ax3.yaxis.set_tick_params(right=False)
        utils.thicken_panel_border(ax4)

        for ax in [ax1, ax2, ax3]:
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax3.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax4.yaxis.get_major_ticks():
            tick.label2.set_fontsize(settings.FONTSIZE)

        # sort labelling
        ax1.text(0.02,
                 0.9,
                 "(a) Land in Situ",
                 transform=ax1.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax2.text(0.02,
                 0.9,
                 "(b) Ocean",
                 transform=ax2.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax3.text(0.02,
                 0.9,
                 "(c) Globe",
                 transform=ax3.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)

        plt.savefig(settings.IMAGELOC +
                    "PCP_ts_3panel{}".format(settings.OUTFMT))
        plt.close()

    # 3-panel plot for 2019 report
    if True:
        fig, (ax1, ax2, ax3) = plt.subplots(3, figsize=(8, 8), sharex=True)

        # Land
        ghcn, gpcc, gpcp = read_land(DATALOC +
                                     "Land_insitu_timeseries-1979.dat")
        utils.plot_ts_panel(ax1, [ghcn, gpcc, gpcp],
                            "-",
                            "hydrological",
                            loc=LEGEND_LOC,
                            bbox=BBOX)

        # Ocean
        gpcp = read_ocean(DATALOC + "Ocean_insitu_timeseries-1979.dat")
        utils.plot_ts_panel(ax2, [gpcp],
                            "-",
                            "hydrological",
                            loc="",
                            bbox=BBOX)

        # Globe
        gpcp = read_ocean(DATALOC + "Global_insitu_timeseries-1979.dat")
        utils.plot_ts_panel(ax3, [gpcp],
                            "-",
                            "hydrological",
                            loc="",
                            bbox=BBOX)

        #*******************
        # prettify
        fig.subplots_adjust(right=0.98, bottom=0.08, top=0.98, hspace=0.001)

        minorLocator = MultipleLocator(1)
        ax1.set_ylim([-60, 100])
        ax1.yaxis.set_ticks([-50, 0, 50, 100])
        ax2.set_ylim([-29, 43])
        ax3.set_ylim([-29, 43])
        for ax in [ax1, ax2, ax3]:
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

        for tick in ax3.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        ax2.set_ylabel("Anomaly (mm yr" + r'$^{-1}$' + ")",
                       fontsize=settings.FONTSIZE)

        # sort labelling
        ax1.text(0.02,
                 0.9,
                 "(a) Land in Situ",
                 transform=ax1.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax2.text(0.02,
                 0.9,
                 "(b) Ocean",
                 transform=ax2.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax3.text(0.02,
                 0.9,
                 "(c) Globe",
                 transform=ax3.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)

        plt.savefig(settings.IMAGELOC +
                    "PCP_ts_3panel{}".format(settings.OUTFMT))
        plt.close()

    #************************************************************************
    # GPCP map
    if True:
        cube = read_map(
            DATALOC +
            "GPCP_{}anomaly_base_1981-2000.txt".format(settings.YEAR))
        bounds = [-2000, -400, -300, -200, -100, 0, 100, 200, 300, 400, 2000]

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "PCP_{}_anoms_gpcp".format(settings.YEAR),
            cube, settings.COLOURMAP_DICT["hydrological"], bounds,
            "Anomalies from 1981-2000 (mm)")
        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "p2.1_PCP_{}_anoms_gpcp".format(settings.YEAR),
            cube,
            settings.COLOURMAP_DICT["hydrological"],
            bounds,
            "Anomalies from 1981-2000 (mm)",
            figtext="(k) Precipitation")

    #************************************************************************
    # GPCP map - Ocean only

    # # Read Oceans
    # print "FIX YEAR"
    # cube = iris.load(DATALOC + "ocean_precipitation_sotc2015.nc", "anomaly_map")[0]

    # # add in the coordinates which haven't been stored sensibly
    # for c, coord in enumerate(["latitude", "longitude"]):
    #     coord_cube = iris.load(DATALOC + "ocean_precipitation_sotc2015.nc", coord)[0]
    #     if c == 0:
    #         iris_coord = iris.coords.DimCoord(coord_cube.data[:,0], standard_name=coord, units='degrees')
    #     elif c == 1:
    #         iris_coord = iris.coords.DimCoord(coord_cube.data[0], standard_name=coord, units='degrees')

    #     cube.add_dim_coord(iris_coord,c)
    #     cube.coord(coord).guess_bounds()

    # bounds=[-2000, -400, -300, -200, -100, 0, 100, 200, 300, 400, 2000]

    # utils.plot_smooth_map_iris(settings.IMAGELOC + "PCP_{}_anoms_gpcp_ocean".format(settings.YEAR), cube, settings.COLOURMAP_DICT["hydrological"], bounds, "Anomalies from 1981-2000 (mm)")

    return  # run_all_plots
Beispiel #4
0
def run_all_plots():

    if True:
        # multipanel timeseries

        COLOURS = settings.COLOURS["temperature"]
        fig, (ax1, ax2, ax3, ax4, ax5, ax6) = plt.subplots(6,
                                                           figsize=(8, 19),
                                                           sharex=True)

        # ERA5
        era5_globe, era5_ocean, era5_land, era5tropics = utils.era5_ts_read(
            settings.REANALYSISLOC, "sat", annual=True)
        land_era5_clim, land_era5_anoms = utils.calculate_climatology_and_anomalies_1d(
            era5_land, 1981, 2010)
        ocean_era5_clim, ocean_era5_anoms = utils.calculate_climatology_and_anomalies_1d(
            era5_ocean, 1981, 2010)
        global_era5_clim, global_era5_anoms = utils.calculate_climatology_and_anomalies_1d(
            era5_globe, 1981, 2010)

        #*******************
        # in situ L+O
        noaa, nasa, jma = read_global_t(DATALOC +
                                        "{}_LO.csv".format(IS_timeseries_root))

        hadcrut = read_hadcrut_crutem(DATALOC + "hadcrut4.1981-2010.csv")

        p0 = ax1.plot(noaa.times,
                      noaa.data,
                      c=COLOURS[noaa.name],
                      ls='-',
                      label=noaa.name,
                      lw=LW)
        p1 = ax1.plot(nasa.times,
                      nasa.data,
                      c=COLOURS[nasa.name],
                      ls='-',
                      label=nasa.name,
                      lw=LW)
        #     p2 = ax1.plot(jma.times, jma.data, c=COLOURS[jma.name], ls='-', label=jma.name, lw=LW)
        p3 = ax1.plot(hadcrut.times,
                      hadcrut.data,
                      c=COLOURS[hadcrut.name],
                      ls='-',
                      label=hadcrut.name,
                      lw=LW)
        ax1.fill_between(hadcrut.times, hadcrut.lower, hadcrut.upper, \
                             where=hadcrut.upper > hadcrut.lower, color='0.5', alpha=0.7)
        p4 = ax1.fill(np.NaN, np.NaN, '0.5', alpha=0.7)

        ax1.axhline(0, c='0.5', ls='--')

        ax1.legend([p0[0], p1[0], (p3[0], p4[0])], [noaa.name, nasa.name, hadcrut.name], \
                       loc=LEGEND_LOC, ncol=2, frameon=False, prop={'size':settings.LEGEND_FONTSIZE}, \
                       labelspacing=0.1, columnspacing=0.5, bbox_to_anchor=BBOX)

        ax1.text(0.02,
                 0.9,
                 "(a) In Situ Land and Ocean",
                 transform=ax1.transAxes,
                 fontsize=settings.FONTSIZE)

        utils.thicken_panel_border(ax1)
        # ax1.yaxis.set_ticks_position('left')

        #*******************
        # reanalysis L+O

        merra = utils.read_merra(
            settings.REANALYSISLOC +
            "MERRA-2_SfcAnom{}.dat".format(settings.YEAR), "temperature", "LO")
        jra_actuals, jra_anoms = utils.read_jra55(
            settings.REANALYSISLOC + "JRA-55_tmp2m_global_ts.txt",
            "temperature")
        twenty_cr_actuals = utils.read_20cr(
            settings.REANALYSISLOC + "global.2mt.skt.txt", "temperature")
        dummy, twenty_cr_anoms = utils.calculate_climatology_and_anomalies_1d(
            twenty_cr_actuals, 1981, 2010)
        twenty_cr_anoms.zorder = -1

        # 2018 no MERRA
        utils.plot_ts_panel(ax2, [jra_anoms, global_era5_anoms],
                            "-",
                            "temperature",
                            loc=LEGEND_LOC,
                            bbox=BBOX)

        ax2.text(0.02,
                 0.9,
                 "(b) Reanalysis Land and Ocean",
                 transform=ax2.transAxes,
                 fontsize=settings.FONTSIZE)

        #*******************
        # in situ L

        noaa, nasa, jma = read_global_t(DATALOC +
                                        "{}_L.csv".format(IS_timeseries_root))
        crutem = read_hadcrut_crutem(DATALOC +
                                     "crutem4_new_logo.1981-2010.csv")

        p0 = ax3.plot(noaa.times,
                      noaa.data,
                      ls='-',
                      c=COLOURS[noaa.name],
                      label=noaa.name,
                      lw=LW)
        p1 = ax3.plot(nasa.times,
                      nasa.data,
                      ls='-',
                      c=COLOURS[nasa.name],
                      label=nasa.name,
                      lw=LW)
        #    p2 = ax3.plot(jma.times, jma.data, ls='-', c=COLOURS[jma.name], label=jma.name, lw=LW)
        #    p3 = ax3.plot(berkeley.times, berkeley.data, ls = '-', c = COLOURS[berkeley.name], label = berkeley.name, lw = LW)
        p4 = ax3.plot(crutem.times,
                      crutem.data,
                      ls='-',
                      c=COLOURS[crutem.name],
                      label=crutem.name,
                      lw=LW)
        ax3.fill_between(crutem.times, crutem.lower, crutem.upper, \
                             where=crutem.upper > crutem.lower, color='0.5', alpha=0.7)
        p5 = ax1.fill(np.NaN, np.NaN, '0.5', alpha=0.7)

        ax3.axhline(0, c='0.5', ls='--')

        ax3.legend([p0[0], p1[0], (p4[0], p5[0])], [noaa.name, nasa.name, crutem.name], \
                       loc=LEGEND_LOC, ncol=2, frameon=False, prop={'size':settings.LEGEND_FONTSIZE}, \
                       labelspacing=0.1, columnspacing=0.5, bbox_to_anchor=BBOX)

        ax3.text(0.02,
                 0.9,
                 "(c) In Situ Land only",
                 transform=ax3.transAxes,
                 fontsize=settings.FONTSIZE)

        utils.thicken_panel_border(ax3)
        #    ax3.yaxis.set_ticks_position('left')

        #*******************
        # reanalysis L

        merra = utils.read_merra(
            settings.REANALYSISLOC +
            "MERRA-2_SfcAnom{}.dat".format(settings.YEAR), "temperature", "L")
        jra_actual, jra_anoms = utils.read_jra55(
            settings.REANALYSISLOC + "JRA-55_tmp2m_globalland_ts.txt",
            "temperature")
        twenty_cr_actuals = utils.read_20cr(
            settings.REANALYSISLOC + "air2mland.txt", "temperature")
        dummy, twenty_cr_anoms = utils.calculate_climatology_and_anomalies_1d(
            twenty_cr_actuals, 1981, 2010)
        twenty_cr_anoms.zorder = -1

        # 2018 - No MERRA
        utils.plot_ts_panel(ax4, [jra_anoms, land_era5_anoms],
                            "-",
                            "temperature",
                            loc=LEGEND_LOC,
                            bbox=BBOX)

        ax4.text(0.02,
                 0.9,
                 "(d) Reanalysis Land only",
                 transform=ax4.transAxes,
                 fontsize=settings.FONTSIZE)

        #*******************
        # in situ O

        noaa, nasa, jma = read_global_t(DATALOC +
                                        "{}_O.csv".format(IS_timeseries_root))
        hadsst = read_hadcrut_crutem(DATALOC +
                                     "hadsst3_new_logo.1981-2010.csv")

        p0 = ax5.plot(noaa.times,
                      noaa.data,
                      ls='-',
                      c=COLOURS[noaa.name],
                      label=noaa.name,
                      lw=LW)
        p1 = ax5.plot(nasa.times,
                      nasa.data,
                      ls='-',
                      c=COLOURS[nasa.name],
                      label=nasa.name,
                      lw=LW)
        #     p2 = ax5.plot(jma.times, jma.data, ls='-', c=COLOURS[jma.name], label=jma.name, lw=LW)
        p3 = ax5.plot(hadsst.times,
                      hadsst.data,
                      ls='-',
                      c=COLOURS[hadsst.name],
                      label=hadsst.name,
                      lw=LW)
        ax5.fill_between(hadsst.times, hadsst.lower, hadsst.upper, \
                             where=hadsst.upper > hadsst.lower, color='0.5', alpha=0.7)
        p4 = ax1.fill(np.NaN, np.NaN, '0.5', alpha=0.7)

        ax5.axhline(0, c='0.5', ls='--')

        ax5.legend([p0[0], p1[0], (p3[0], p4[0])], [noaa.name, nasa.name, hadsst.name], \
                       loc=LEGEND_LOC, ncol=2, frameon=False, prop={'size':settings.LEGEND_FONTSIZE}, \
                       labelspacing=0.1, columnspacing=0.5, bbox_to_anchor=BBOX)

        ax5.text(0.02,
                 0.9,
                 "(e) In Situ Ocean only",
                 transform=ax5.transAxes,
                 fontsize=settings.FONTSIZE)

        utils.thicken_panel_border(ax5)
        #    ax5.yaxis.set_ticks_position('left')

        #*******************
        # reanalysis O

        merra = utils.read_merra(
            settings.REANALYSISLOC +
            "MERRA-2_SfcAnom{}.dat".format(settings.YEAR), "temperature", "O")
        jra_actual, jra_anoms = utils.read_jra55(
            settings.REANALYSISLOC + "JRA-55_tmp2m_globalocean_ts.txt",
            "temperature")
        twenty_cr_actuals = utils.read_20cr(
            settings.REANALYSISLOC + "airsktocean.txt", "temperature")
        dummy, twenty_cr_anoms = utils.calculate_climatology_and_anomalies_1d(
            twenty_cr_actuals, 1981, 2010)
        twenty_cr_anoms.zorder = -1

        # 2018 no MERRA
        utils.plot_ts_panel(ax6, [jra_anoms, ocean_era5_anoms],
                            "-",
                            "temperature",
                            loc=LEGEND_LOC,
                            bbox=BBOX)

        ax6.text(0.02,
                 0.9,
                 "(f) Reanalysis Ocean only",
                 transform=ax6.transAxes,
                 fontsize=settings.FONTSIZE)

        #*******************
        # prettify

        fig.text(0.03,
                 0.5,
                 "Anomalies (" + r'$^{\circ}$' + "C)",
                 va='center',
                 rotation='vertical',
                 fontsize=settings.FONTSIZE)

        plt.xlim([1900, int(settings.YEAR) + 2])

        minorLocator = MultipleLocator(5)
        for ax in [ax1, ax2, ax3, ax4, ax5, ax6]:
            ax.set_ylim(YLIM)
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
            ax.xaxis.set_minor_locator(minorLocator)

        for tick in ax6.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        fig.subplots_adjust(right=0.96, top=0.995, bottom=0.02, hspace=0.001)

        plt.savefig(settings.IMAGELOC + "SAT_ts{}".format(settings.OUTFMT))

        plt.close()

    #************************************************************************
    # ERA5 Anomaly figure

    if True:
        # Read in ERA anomalies

        cube_list = iris.load(settings.REANALYSISLOC +
                              "era5_t2m_{}01-{}12_ann_ano.nc".format(
                                  settings.YEAR, settings.YEAR))
        for cube in cube_list:
            if cube.var_name == "T2M":
                break

        cube.coord('latitude').guess_bounds()
        cube.coord('longitude').guess_bounds()

        bounds = [-100, -4, -2, -1, -0.5, 0, 0.5, 1, 2, 4, 100]

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "SAT_{}_anoms_era5".format(settings.YEAR),
            cube[0],
            settings.COLOURMAP_DICT["temperature"],
            bounds,
            "Anomalies from 1981-2010 (" + r'$^{\circ}$' + "C)",
            title="ERA5")

    #************************************************************************
    # MERRA2 Anomaly figure
    if True:
        cube_list = iris.load(settings.REANALYSISLOC +
                              "MERRA-2_SfcAnom_{}.nc".format(settings.YEAR))
        for cube in cube_list:
            if cube.var_name == "t2ma":
                break

        cube.coord('latitude').guess_bounds()
        cube.coord('longitude').guess_bounds()

        bounds = [-100, -4, -2, -1, -0.5, 0, 0.5, 1, 2, 4, 100]

        utils.plot_smooth_map_iris(settings.IMAGELOC + "SAT_{}_anoms_merra".format(settings.YEAR), cube[0], \
                                       settings.COLOURMAP_DICT["temperature"], bounds, \
                                       "Anomalies from 1981-2010 ("+r'$^{\circ}$'+"C)", title="MERRA-2")

    #************************************************************************
    # HadCRUT4 Anomaly figure
    if True:
        cube_list = iris.load(DATALOC + "HadCRUT.4.6.0.0.median.nc")
        for cube in cube_list:
            if cube.var_name == "temperature_anomaly":
                break

        cube.coord('latitude').guess_bounds()
        cube.coord('longitude').guess_bounds()

        # restrict to 1851 to last full year
        date_constraint = utils.periodConstraint(
            cube, dt.datetime(1850, 1, 1),
            dt.datetime(int(settings.YEAR) + 1, 1, 1))
        cube = cube.extract(date_constraint)

        # convert to 1981-2010 climatology.
        clim_constraint = utils.periodConstraint(cube, dt.datetime(1981, 1, 1),
                                                 dt.datetime(2011, 1, 1))
        clim_cube = cube.extract(clim_constraint)

        clim_data = clim_cube.data.reshape(-1, 12, clim_cube.data.shape[-2],
                                           clim_cube.data.shape[-1])

        # more than 15 years present
        climatology = np.ma.mean(clim_data, axis=0)
        nyears = np.ma.count(clim_data, axis=0)
        climatology = np.ma.masked_where(nyears <= 15,
                                         climatology)  # Kate keeps GT 15.

        # extract final year
        final_year_constraint = utils.periodConstraint(
            cube, dt.datetime(int(settings.YEAR), 1, 1),
            dt.datetime(int(settings.YEAR) + 1, 1, 1))
        final_year_cube = cube.extract(final_year_constraint)

        final_year_cube.data = final_year_cube.data - climatology

        # more than 6 months present
        annual_cube = final_year_cube.collapsed(['time'], iris.analysis.MEAN)
        nmonths = np.ma.count(final_year_cube.data, axis=0)
        annual_cube.data = np.ma.masked_where(nmonths <= 6, annual_cube.data)

        bounds = [-100, -4, -2, -1, -0.5, 0, 0.5, 1, 2, 4, 100]

        utils.plot_smooth_map_iris(settings.IMAGELOC + "SAT_{}_anoms_hadcrut4".format(settings.YEAR), annual_cube, \
                                       settings.COLOURMAP_DICT["temperature"], bounds, \
                                       "Anomalies from 1981-2010 ("+r'$^{\circ}$'+"C)", title="HadCRUT 4.6")

    #************************************************************************
    # NOAA data Anomaly figure - incl plate 2.1
    if True:
        cube = read_noaa_mlost(DATALOC + "mlost-box.ytd.12.1981-2010bp.txt",
                               int(settings.YEAR))

        bounds = [-100, -4, -2, -1, -0.5, 0, 0.5, 1, 2, 4, 100]

        utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_SAT_{}_anoms_noaa".format(settings.YEAR), cube, \
                                       settings.COLOURMAP_DICT["temperature"], bounds, \
                                       "Anomalies from 1981-2010 ("+r'$^{\circ}$'+"C)", \
                                       figtext="(a) Surface Temperature", \
                                       save_netcdf_filename="{}MLOST_for_NOAA_{}.nc".format(DATALOC, dt.datetime.strftime(dt.datetime.now(), "%d-%b-%Y")))

        utils.plot_smooth_map_iris(settings.IMAGELOC + "SAT_{}_anoms_noaa".format(settings.YEAR), cube, \
                                       settings.COLOURMAP_DICT["temperature"], bounds, \
                                       "Anomalies from 1981-2010 ("+r'$^{\circ}$'+"C)", title="NOAAGlobalTemp")

    #************************************************************************
    # JRA55 data Anomaly figure
    if True:
        cube_list = iris.load(settings.REANALYSISLOC +
                              "jra55_t2m_{}01-{}12_ann_ano.nc".format(
                                  settings.YEAR, settings.YEAR))
        for cube in cube_list:
            if cube.var_name == "T2M":
                break

        cube.coord('latitude').guess_bounds()
        cube.coord('longitude').guess_bounds()

        bounds = [-100, -4, -2, -1, -0.5, 0, 0.5, 1, 2, 4, 100]

        utils.plot_smooth_map_iris(settings.IMAGELOC + "SAT_{}_anoms_jra55".format(settings.YEAR), cube[0,0], \
                                       settings.COLOURMAP_DICT["temperature"], bounds, \
                                       "Anomalies from 1981-2010 ("+r'$^{\circ}$'+"C)", title="JRA-55")

    #************************************************************************
    # NASA GISS Anomaly figure
    if True:
        #cube = read_nasa_giss(DATALOC + "nasa-2015-anomalies-wrt1981-2010bp")

        cube = iris.load(DATALOC + "gistemp1200_GHCNv4_ERSSTv5.nc")[0]

        # convert to 1981-2010 climatology.
        clim_constraint = utils.periodConstraint(cube, dt.datetime(1981, 1, 1),
                                                 dt.datetime(2011, 1, 1))
        clim_cube = cube.extract(clim_constraint)

        clim_data = clim_cube.data.reshape(-1, 12, clim_cube.data.shape[-2],
                                           clim_cube.data.shape[-1])

        # more than 15 years present
        climatology = np.ma.mean(clim_data, axis=0)
        nyears = np.ma.count(clim_data, axis=0)
        climatology = np.ma.masked_where(nyears <= 15,
                                         climatology)  # Kate keeps GT 15.

        # extract final year
        final_year_constraint = utils.periodConstraint(cube, dt.datetime(int(settings.YEAR), 1, 1), \
                                                           dt.datetime(int(settings.YEAR)+1, 1, 1))
        final_year_cube = cube.extract(final_year_constraint)

        final_year_cube.data = final_year_cube.data - climatology

        # more than 6 months present
        annual_cube = final_year_cube.collapsed(['time'], iris.analysis.MEAN)
        nmonths = np.ma.count(final_year_cube.data, axis=0)
        annual_cube.data = np.ma.masked_where(nmonths <= 6, annual_cube.data)

        bounds = [-100, -4, -2, -1, -0.5, 0, 0.5, 1, 2, 4, 100]

        utils.plot_smooth_map_iris(settings.IMAGELOC + "SAT_{}_anoms_nasa".format(settings.YEAR), annual_cube, \
                                       settings.COLOURMAP_DICT["temperature"], bounds, \
                                       "Anomalies from 1981-2010 ("+r'$^{\circ}$'+"C)", title="NASA GISS")

    return  # run_all_plots
Beispiel #5
0
def run_all_plots():

    if True:
        #***************
        # Figure 1

        euro, africa, tibet, canada = read_ts(DATALOC +
                                              "BAMS2020Fig1_data_LSWT.csv")
        #        euro_fit, africa_fit, tibet_fit, canada_fit = read_ts(DATALOC + "Fig1_lines_LSWT.csv")

        euro_fit = utils.Timeseries("Lake", [1994, 2020],
                                    [-0.5136, (2020 - 1994) * 0.0386 - 0.5136])
        africa_fit = utils.Timeseries(
            "Lake", [1994, 2020], [0.0204, (2020 - 1994) * 0.0036 + 0.0204])
        tibet_fit = utils.Timeseries("Lake", [1994, 2020],
                                     [0.0878, (2020 - 1994) * 0.0017 + 0.0878])
        canada_fit = utils.Timeseries(
            "Lake", [1994, 2020], [-0.2018, (2020 - 1994) * 0.0223 - 0.2018])

        fig, (ax1, ax2, ax3, ax4) = plt.subplots(4,
                                                 figsize=(8, 10),
                                                 sharex=True)

        #***************
        # the timeseries
        LEGEND_LOC = ""

        utils.plot_ts_panel(ax1, [euro], "-", "temperature", loc=LEGEND_LOC)
        ax1.plot(euro_fit.times,
                 euro_fit.data,
                 c=settings.COLOURS["temperature"][euro_fit.name],
                 lw=2,
                 ls="--")
        ax1.text(1995, 0.8, "Europe, 127 lakes", fontsize=settings.FONTSIZE)
        utils.plot_ts_panel(ax2, [africa], "-", "temperature", loc=LEGEND_LOC)
        ax2.plot(africa_fit.times,
                 africa_fit.data,
                 c=settings.COLOURS["temperature"][africa_fit.name],
                 lw=2,
                 ls="--")
        ax2.text(1995, 0.8, "Africa, 68 lakes", fontsize=settings.FONTSIZE)
        utils.plot_ts_panel(ax3, [tibet], "-", "temperature", loc=LEGEND_LOC)
        ax3.plot(tibet_fit.times,
                 tibet_fit.data,
                 c=settings.COLOURS["temperature"][tibet_fit.name],
                 lw=2,
                 ls="--")
        ax3.text(1995,
                 0.8,
                 "Tibetan Plateau, 106 lakes",
                 fontsize=settings.FONTSIZE)
        utils.plot_ts_panel(ax4, [canada], "-", "temperature", loc=LEGEND_LOC)
        ax4.plot(canada_fit.times,
                 canada_fit.data,
                 c=settings.COLOURS["temperature"][canada_fit.name],
                 lw=2,
                 ls="--")
        ax4.text(1995, 0.8, "Canada, 244 lakes", fontsize=settings.FONTSIZE)

        # prettify
        for ax in [ax1, ax2, ax3, ax4]:
            ax.axhline(0, c='0.5', ls='--')
            utils.thicken_panel_border(ax)
            ax.set_ylim([-1, 1.2])
            ax.set_xlim([euro.times[0] - 1, int(settings.YEAR) + 1])
            ax.yaxis.set_ticks_position('left')
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax4.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        fig.text(0.01,
                 0.35,
                 "Anomaly from 1996-2016 (" + r'$^\circ$' + "C)",
                 fontsize=settings.FONTSIZE,
                 rotation="vertical")
        fig.subplots_adjust(bottom=0.03, right=0.96, top=0.99, hspace=0.001)

        plt.savefig(settings.IMAGELOC + "LKT_ts{}".format(settings.OUTFMT))

        plt.close()

    #***************
    # Anomaly Scatter map
    if True:
        anomalies = read_lakes(DATALOC + "PlateX_data_LSWT.csv")

        bounds = [-8, -2, -1.5, -1.0, -0.5, 0, 0.5, 1.0, 1.5, 2, 8]
        #        bounds = [-100, -4, -2, -1, -0.5, 0, 0.5, 1, 2, 4, 100]

        lons = np.arange(-90, 120, 30)
        lats = np.arange(-180, 210, 30)
        dummy = np.ma.zeros((len(lats), len(lons)))
        dummy.mask = np.ones(dummy.shape)

        cube = utils.make_iris_cube_2d(dummy, lats, lons, "blank", "m")

        utils.plot_smooth_map_iris(settings.IMAGELOC + "LKT_anomaly", cube, settings.COLOURMAP_DICT["temperature"], \
                                       bounds, "Anomalies from 1996-2016 ("+r"$^{\circ}$"+"C)", \
                                       scatter=[anomalies[1], anomalies[0], anomalies[2]], figtext="", title="")

        utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_LKT_anomaly", cube, settings.COLOURMAP_DICT["temperature"], \
                                       bounds, "Anomalies from 1996-2016 ("+r"$^{\circ}$"+"C)", \
                                       scatter=[anomalies[1], anomalies[0], anomalies[2]], \
                                       figtext="(b) Lake Temperatures", title="")

    #***************
    # Insets Scatter map
    if True:

        fig = plt.figure(figsize=(8, 7))
        plt.clf()

        anomalies = read_lakes(DATALOC + "Fig2_data_LSWT.csv")

        bounds = [-8, -2, -1.5, -1.0, -0.5, 0, 0.5, 1.0, 1.5, 2, 8]
        #        bounds = [-100, -4, -2, -1, -0.5, 0, 0.5, 1, 2, 4, 100]
        cmap = settings.COLOURMAP_DICT["temperature"]
        norm = mpl.cm.colors.BoundaryNorm(bounds, cmap.N)
        this_cmap = copy.copy(cmap)

        # first_cube = iris.load(DATALOC + "amaps_1st_quarter_2018_250km.nc")[0]
        # third_cube = iris.load(DATALOC + "amaps_3rd_quarter_2018_250km.nc")[0]
        # annual_cube = iris.load(DATALOC + "amaps_annual_2018_250km.nc")[0]

        cube = iris.load(DATALOC + "lswt_anom_1979_2019.nc")[0]
        if settings.OUTFMT in [".eps", ".pdf"]:
            if cube.coord("latitude").points.shape[0] > 180 or cube.coord(
                    "longitude").points.shape[0] > 360:
                regrid_size = 1.0
                print("Regridding cube for {} output to {} degree resolution".
                      format(settings.OUTFMT, regrid_size))
                print("Old Shape {}".format(cube.data.shape))
                plot_cube = utils.regrid_cube(cube, regrid_size, regrid_size)
                print("New Shape {}".format(plot_cube.data.shape))
            else:
                plot_cube = copy.deepcopy(cube)
        else:
            plot_cube = copy.deepcopy(cube)

        # make axes by hand
        axes = ([0.01, 0.55, 0.59,
                 0.41], [0.565, 0.45, 0.47,
                         0.50], [0.01, 0.13, 0.59,
                                 0.41], [0.61, 0.07, 0.38,
                                         0.41], [0.1, 0.1, 0.8, 0.03])

        # Europe
        ax = plt.axes(axes[0], projection=cartopy.crs.PlateCarree())

        ax.gridlines()  #draw_labels=True)
        ax.add_feature(cartopy.feature.LAND,
                       zorder=0,
                       facecolor="0.9",
                       edgecolor="k")
        ax.coastlines(resolution="50m")
        #ax.add_feature(cartopy.feature.BORDERS.with_scale('110m'), linewidth=.5)
        ax.set_extent([-25, 40, 34, 72], cartopy.crs.PlateCarree())

        mesh = iris.plot.pcolormesh(plot_cube,
                                    cmap=this_cmap,
                                    norm=norm,
                                    axes=ax)
        plt.scatter(anomalies[1], anomalies[0], c=anomalies[2], cmap=this_cmap, norm=norm, s=25, \
                                transform=cartopy.crs.Geodetic(), edgecolor='0.1', linewidth=0.5, zorder=10)

        ax.text(0.05,
                1.05,
                "(a) Europe",
                fontsize=settings.FONTSIZE * 0.8,
                transform=ax.transAxes)
        utils.thicken_panel_border(ax)

        # Africa
        ax = plt.axes(axes[1], projection=cartopy.crs.PlateCarree())

        ax.gridlines()  #draw_labels=True)
        ax.add_feature(cartopy.feature.LAND,
                       zorder=0,
                       facecolor="0.9",
                       edgecolor="k")
        ax.coastlines(resolution="50m")
        #ax.add_feature(cartopy.feature.BORDERS.with_scale('110m'), linewidth=.5)
        ax.set_extent([-19, 43, -40, 33], cartopy.crs.PlateCarree())

        # lat_constraint = utils.latConstraint([25, 90])
        # nh_cube = third_cube.extract(lat_constraint)
        # lat_constraint = utils.latConstraint([-90, -25])
        # sh_cube = first_cube.extract(lat_constraint)
        # lat_constraint = utils.latConstraint([-25, 25])
        # trop_cube = annual_cube.extract(lat_constraint)

        # mesh = iris.plot.pcolormesh(nh_cube, cmap=this_cmap, norm=norm, axes=ax)
        # mesh = iris.plot.pcolormesh(trop_cube, cmap=this_cmap, norm=norm, axes=ax)
        # mesh = iris.plot.pcolormesh(sh_cube, cmap=this_cmap, norm=norm, axes=ax)
        mesh = iris.plot.pcolormesh(plot_cube,
                                    cmap=this_cmap,
                                    norm=norm,
                                    axes=ax)

        plt.scatter(anomalies[1], anomalies[0], c=anomalies[2], cmap=this_cmap, norm=norm, s=25, \
                                transform=cartopy.crs.Geodetic(), edgecolor='0.1', linewidth=0.5, zorder=10)

        ax.text(0.05,
                1.05,
                "(b) Africa",
                fontsize=settings.FONTSIZE * 0.8,
                transform=ax.transAxes)
        utils.thicken_panel_border(ax)

        # Canada
        ax = plt.axes(axes[2], projection=cartopy.crs.PlateCarree())

        ax.gridlines()  #draw_labels=True)
        ax.add_feature(cartopy.feature.LAND,
                       zorder=0,
                       facecolor="0.9",
                       edgecolor="k")
        ax.coastlines(resolution="50m")
        #ax.add_feature(cartopy.feature.BORDERS.with_scale('110m'), linewidth=.5)
        ax.set_extent([-140, -55, 42, 82], cartopy.crs.PlateCarree())

        mesh = iris.plot.pcolormesh(plot_cube,
                                    cmap=this_cmap,
                                    norm=norm,
                                    axes=ax)
        plt.scatter(anomalies[1], anomalies[0], c=anomalies[2], cmap=this_cmap, norm=norm, s=25, \
                                transform=cartopy.crs.Geodetic(), edgecolor='0.1', linewidth=0.5, zorder=10)

        ax.text(0.05,
                1.05,
                "(c) Canada",
                fontsize=settings.FONTSIZE * 0.8,
                transform=ax.transAxes)
        utils.thicken_panel_border(ax)

        # Tibet
        ax = plt.axes(axes[3], projection=cartopy.crs.PlateCarree())

        ax.gridlines()  #draw_labels=True)
        ax.add_feature(cartopy.feature.LAND,
                       zorder=0,
                       facecolor="0.9",
                       edgecolor="k")
        ax.coastlines(resolution="50m")
        ax.add_feature(cartopy.feature.BORDERS.with_scale('50m'), linewidth=.5)
        ax.set_extent([78, 102, 28, 39], cartopy.crs.PlateCarree())

        mesh = iris.plot.pcolormesh(plot_cube,
                                    cmap=this_cmap,
                                    norm=norm,
                                    axes=ax)
        plt.scatter(anomalies[1], anomalies[0], c=anomalies[2], cmap=this_cmap, norm=norm, s=25, \
                                transform=cartopy.crs.Geodetic(), edgecolor='0.1', linewidth=0.5, zorder=10)

        ax.text(0.05,
                1.05,
                "(d) Tibetan Plateau",
                fontsize=settings.FONTSIZE * 0.8,
                transform=ax.transAxes)
        utils.thicken_panel_border(ax)

        # colourbar
        cb = plt.colorbar(mesh,
                          cax=plt.axes(axes[4]),
                          orientation='horizontal',
                          ticks=bounds[1:-1],
                          drawedges=True)

        # prettify
        cb.ax.tick_params(axis='x',
                          labelsize=settings.FONTSIZE,
                          direction='in',
                          size=0)
        cb.set_label(label="Anomalies from 1996-2016 (" + r"$^{\circ}$" + "C)",
                     fontsize=settings.FONTSIZE)
        cb.set_ticklabels(["{:g}".format(b) for b in bounds[1:-1]])
        cb.outline.set_linewidth(2)
        cb.dividers.set_color('k')
        cb.dividers.set_linewidth(2)

        plt.savefig(settings.IMAGELOC +
                    "LKT_Regions_scatter_map{}".format(settings.OUTFMT))
        plt.close()
Beispiel #6
0
def run_all_plots():
    #************************************************************************
    # Timeseries

    data = read_binary_ts(DATALOC + "TimeSeries_faparanomaliesglobal_bams_v{}_C6_2020.bin".format(int(settings.YEAR)-1))

    fig = plt.figure(figsize=(8, 6))
    ax = plt.axes([0.13, 0.07, 0.8, 0.86])

    COLOURS = settings.COLOURS["land_surface"]

    for dataset in data:
        print(dataset.name)
        ls = "--"
        if dataset.name.split(" ")[-1] == "Smoothed":
            ls = "-"
        ax.plot(dataset.times, dataset.data, c=COLOURS[dataset.name], ls=ls, label=dataset.name, lw=LW)

    ax.axhline(0, c='0.5', ls='--')
    utils.thicken_panel_border(ax)

    ax.legend(loc=LEGEND_LOC, ncol=2, frameon=False, prop={'size':settings.LEGEND_FONTSIZE}, labelspacing=0.1, columnspacing=0.5)

    #*******************
    # prettify

    fig.text(0.01, 0.5, "Anomaly (FAPAR)", va='center', rotation='vertical', fontsize=settings.FONTSIZE)

    plt.xlim([1998-1, int(settings.YEAR)+2])
    plt.ylim([-0.022, None])

    for tick in ax.yaxis.get_major_ticks():
        tick.label.set_fontsize(settings.FONTSIZE)
    ax.xaxis.set_minor_locator(minorLocator)
    for tick in ax.xaxis.get_major_ticks():
        tick.label.set_fontsize(settings.FONTSIZE)

    plt.savefig(settings.IMAGELOC + "FPR_ts{}".format(settings.OUTFMT))
    plt.close()

    #************************************************************************
    # Hovmullers
    data = read_binary(DATALOC + "Hovmuller_Global_lat_fapar1998_2010_bams_trois_C6.eps_{}.bin".format(int(settings.YEAR)+1))

    # reshape - from Readme
    data = data.reshape(360, DURATION)

    data = np.ma.masked_where(data == 0., data)

    lats = np.arange(-90, 90, 0.5)

    bounds = [-20, -0.04, -0.03, -0.02, -0.01, 0, 0.01, 0.02, 0.03, 0.04, 20]
    utils.plot_hovmuller(settings.IMAGELOC + "FPR_hovmuller", times, lats, data, settings.COLOURMAP_DICT["phenological"], bounds, "Anomaly (FAPAR)")


    #************************************************************************
    # Anomalies
    data = read_binary(DATALOC + "DataXFigure1fapar1998_2010_bams_trois_C6_v2.eps_v2020.bin")
    data = data.reshape(360, 720)

    data = np.ma.masked_where(data == -100, data) # land/ocean mask
    data = np.ma.masked_where(data <= -9999., data) # missing data
    data = np.ma.masked_where(np.logical_and(data > -0.001, data < 0.001), data) # missing data

    lons = np.arange(-180, 180, 0.5)
    lats = np.arange(-90, 90, 0.5)

    cube = utils.make_iris_cube_2d(data, lats, lons, "FAPAR", "%")

    bounds = [-20, -0.04, -0.03, -0.02, -0.01, 0, 0.01, 0.02, 0.03, 0.04, 20]
    utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_FPR_{}".format(settings.YEAR), cube, settings.COLOURMAP_DICT["phenological"], bounds, "Anomalies from 1998-{} (FAPAR)".format(2010), figtext="(ae) Fraction of Absorbed Photosynthetically Active Radiation")
    utils.plot_smooth_map_iris(settings.IMAGELOC + "FPR_{}".format(settings.YEAR), cube, settings.COLOURMAP_DICT["phenological"], bounds, "Anomalies from 1998-{} (FAPAR)".format(2010))


    return # run_all_plots
Beispiel #7
0
def run_all_plots():

    #*********************************************
    # Timeseries plot
    if False:
        (hadisdhLQ, hadcruhLQ, hadcruhextLQ, daiLQ, eraiLQ, era5LQ, merraLQ, jraLQ, era5_mskLQ, merra_mskLQ, cr20LQ) = \
            read_ts(DATALOC + "HUM_timeseries_ALL{}.txt".format(settings.YEAR), "q", "L")
        (hadisdhMQ, hadcruhMQ, daiMQ, nocsMQ, hoapsMQ, eraiMQ, era5MQ, merraMQ, jraMQ, cr20MQ) = \
            read_ts(DATALOC + "HUM_timeseries_ALL{}.txt".format(settings.YEAR), "q", "M")
        (hadisdhLR, hadcruhLR, hadcruhextLR, daiLR, eraiLR, era5LR, merraLR, jraLR, era5_mskLR, merra_mskLR, cr20LR) = \
            read_ts(DATALOC + "HUM_timeseries_ALL{}.txt".format(settings.YEAR), "rh", "L")
        (hadisdhMR, hadcruhMR, daiMR, nocsMR, hoapsMR, eraiMR, era5MR, merraMR, jraMR, cr20MR) = \
            read_ts(DATALOC + "HUM_timeseries_ALL{}.txt".format(settings.YEAR), "rh", "M")

        COLOURS = settings.COLOURS["hydrological"]
        fig = plt.figure(figsize=(14, 12))

        # manually set up the 8 axes
        w = 0.45 # width
        h = 0.24 # height
        c = 0.53 # centre line of plots
        ax1 = plt.axes([c-w, 0.99-h, w, h])
        ax2 = plt.axes([c, 0.99-h, w, h])
        ax3 = plt.axes([c-w, 0.99-(2*h), w, h], sharex=ax1)
        ax4 = plt.axes([c, 0.99-(2*h), w, h], sharex=ax2)
        ax5 = plt.axes([c-w, 0.99-(3*h), w, h], sharex=ax1)
        ax6 = plt.axes([c, 0.99-(3*h), w, h], sharex=ax2)
        ax7 = plt.axes([c-w, 0.99-(4*h), w, h], sharex=ax1)
        ax8 = plt.axes([c, 0.99-(4*h), w, h], sharex=ax2)

        if int(settings.YEAR) < 2019:
            # in situ
            utils.plot_ts_panel(ax1, [hadisdhLQ, hadcruhLQ, hadcruhextLQ, daiLQ, era5_mskLQ], "-", "hydrological", loc=LEGEND_LOC, bbox=BBOX)
            utils.plot_ts_panel(ax3, [hadisdhMQ, hadcruhMQ, daiMQ, nocsMQ, hoapsMQ], "-", "hydrological", loc=LEGEND_LOC, bbox=BBOX)
            utils.plot_ts_panel(ax5, [hadisdhLR, hadcruhLR, hadcruhextLR, daiLR, era5_mskLR], "-", "hydrological", loc="")
            utils.plot_ts_panel(ax7, [hadisdhMR, hadcruhMR, daiMR], "-", "hydrological", loc="")

            # reanalyses
            utils.plot_ts_panel(ax2, [eraiLQ, era5LQ, merraLQ, jraLQ], "-", "hydrological", loc=LEGEND_LOC, bbox=BBOX)
            utils.plot_ts_panel(ax4, [eraiMQ, era5MQ, merraMQ, jraMQ], "-", "hydrological", loc=LEGEND_LOC, bbox=BBOX)
            utils.plot_ts_panel(ax6, [eraiLR, era5LR, jraLR], "-", "hydrological", loc="")
            utils.plot_ts_panel(ax8, [eraiMR, era5MR, jraMR], "-", "hydrological", loc="")
        else:
            # in situ
            utils.plot_ts_panel(ax1, [hadisdhLQ], "-", "hydrological", loc=LEGEND_LOC, bbox=BBOX)
            utils.plot_ts_panel(ax3, [hadisdhMQ, nocsMQ], "-", "hydrological", loc=LEGEND_LOC, bbox=BBOX)
            utils.plot_ts_panel(ax5, [hadisdhLR], "-", "hydrological", loc="")
            utils.plot_ts_panel(ax7, [hadisdhMR], "-", "hydrological", loc="")

            # hadisdh uncertainties in due course

            # reanalyses
            utils.plot_ts_panel(ax2, [era5LQ, merraLQ, jraLQ, cr20LQ], "-", "hydrological", loc=LEGEND_LOC, bbox=BBOX)
            utils.plot_ts_panel(ax4, [era5MQ, merraMQ, jraMQ, cr20MQ], "-", "hydrological", loc=LEGEND_LOC, bbox=BBOX)
            utils.plot_ts_panel(ax6, [era5LR, jraLR, cr20LR], "-", "hydrological", loc="")
            utils.plot_ts_panel(ax8, [era5MR, jraMR, cr20MR], "-", "hydrological", loc="")

        # prettify
        ax1.set_xlim([1957, int(settings.YEAR)+2])
        ax2.set_xlim([1957, int(settings.YEAR)+2])
        ax1.set_xticklabels(["", "1960", "1970", "1980", "1990", "2000", "2010", ""])

        for ax in [ax1, ax2, ax3, ax4]:
            ax.set_ylim([-0.39, 0.8])
        for ax in [ax5, ax6, ax7, ax8]:
            ax.set_ylim([-1.8, 1.5])

        for ax in [ax1, ax3, ax5, ax7]:
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax7.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax8.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        plt.setp([a.get_xticklabels() for a in fig.axes[:-2]], visible=False)
        plt.setp(ax2.get_yticklabels(), visible=False)
        plt.setp(ax4.get_yticklabels(), visible=False)
        plt.setp(ax6.get_yticklabels(), visible=False)
        plt.setp(ax8.get_yticklabels(), visible=False)


        ax1.text(0.02, 0.85, "(a) In Situ Land q", transform=ax1.transAxes, fontsize=settings.FONTSIZE)
        ax2.text(0.02, 0.85, "(b) Reanalyses Land q", transform=ax2.transAxes, fontsize=settings.FONTSIZE)
        ax3.text(0.02, 0.85, "(c) In Situ Ocean q", transform=ax3.transAxes, fontsize=settings.FONTSIZE)
        ax4.text(0.02, 0.85, "(d) Reanalyses Ocean q", transform=ax4.transAxes, fontsize=settings.FONTSIZE)
        ax5.text(0.02, 0.85, "(e) In Situ Land RH", transform=ax5.transAxes, fontsize=settings.FONTSIZE)
        ax6.text(0.02, 0.85, "(f) Reanalyses Land RH", transform=ax6.transAxes, fontsize=settings.FONTSIZE)
        ax7.text(0.02, 0.85, "(g) In Situ Ocean RH", transform=ax7.transAxes, fontsize=settings.FONTSIZE)
        ax8.text(0.02, 0.85, "(h) Reanalyses Ocean RH", transform=ax8.transAxes, fontsize=settings.FONTSIZE)


        plt.figtext(0.01, 0.75, "Specific Humidity (g kg"+r'$^{-1}$'+")", va='center', rotation='vertical', fontsize=settings.FONTSIZE)
        plt.figtext(0.01, 0.25, "Relative Humidity (%rh)", va='center', rotation='vertical', fontsize=settings.FONTSIZE)

        fig.subplots_adjust(right=0.98, top=0.95, bottom=0.05, hspace=0.001)

        plt.savefig(settings.IMAGELOC + "HUM_ts{}".format(settings.OUTFMT))
        plt.close()

    #*********************************************
    # Timeseries uncertainty plot
    if True:
        (hadisdhLQ, hadisdhLQ_l, hadisdhLQ_u, era5LQ, merraLQ, jraLQ, era5_mskLQ, merra_mskLQ, cr20LQ) = \
            read_ts_unc(DATALOC + "HUM_timeseries_ALL{}_unc.txt".format(settings.YEAR), "q", "L")
        (hadisdhMQ, hadisdhMQ_l, hadisdhMQ_u, nocsMQ, era5MQ, merraMQ, jraMQ, cr20MQ) = \
            read_ts_unc(DATALOC + "HUM_timeseries_ALL{}_unc.txt".format(settings.YEAR), "q", "M")
        (hadisdhLR, hadisdhLR_l, hadisdhLR_u,  era5LR, merraLR, jraLR, era5_mskLR, merra_mskLR, cr20LR) = \
            read_ts_unc(DATALOC + "HUM_timeseries_ALL{}_unc.txt".format(settings.YEAR), "rh", "L")
        (hadisdhMR, hadisdhMR_l, hadisdhMR_u, nocsMR, era5MR, merraMR, jraMR, cr20MR) = \
            read_ts_unc(DATALOC + "HUM_timeseries_ALL{}_unc.txt".format(settings.YEAR), "rh", "M")

        COLOURS = settings.COLOURS["hydrological"]
        fig = plt.figure(figsize=(14, 12))

        # manually set up the 8 axes
        w = 0.45 # width
        h = 0.24 # height
        c = 0.53 # centre line of plots
        ax1 = plt.axes([c-w, 0.99-h, w, h])
        ax2 = plt.axes([c, 0.99-h, w, h])
        ax3 = plt.axes([c-w, 0.99-(2*h), w, h], sharex=ax1)
        ax4 = plt.axes([c, 0.99-(2*h), w, h], sharex=ax2)
        ax5 = plt.axes([c-w, 0.99-(3*h), w, h], sharex=ax1)
        ax6 = plt.axes([c, 0.99-(3*h), w, h], sharex=ax2)
        ax7 = plt.axes([c-w, 0.99-(4*h), w, h], sharex=ax1)
        ax8 = plt.axes([c, 0.99-(4*h), w, h], sharex=ax2)

        # in situ
        utils.plot_ts_panel(ax1, [hadisdhLQ], "-", "hydrological", loc="",)
        ax1.fill_between(hadisdhLQ.times, hadisdhLQ_u.data, hadisdhLQ_l.data, color='0.8', label="")
        utils.plot_ts_panel(ax3, [hadisdhMQ, nocsMQ], "-", "hydrological", loc="")
        ax3.fill_between(hadisdhMQ.times, hadisdhMQ_u.data, hadisdhMQ_l.data, color='0.8', label="")
        utils.plot_ts_panel(ax5, [hadisdhLR], "-", "hydrological", loc="")
        ax5.fill_between(hadisdhLR.times, hadisdhLR_u.data, hadisdhLR_l.data, color='0.8', label="")
        utils.plot_ts_panel(ax7, [hadisdhMR], "-", "hydrological", loc="")
        ax7.fill_between(hadisdhMR.times, hadisdhMR_u.data, hadisdhMR_l.data, color='0.8', label="")

    
        # reanalyses
        utils.plot_ts_panel(ax2, [era5LQ, merraLQ, jraLQ, cr20LQ], "-", "hydrological", loc=LEGEND_LOC, bbox=BBOX)
        utils.plot_ts_panel(ax4, [era5MQ, merraMQ, jraMQ, cr20MQ], "-", "hydrological", loc=LEGEND_LOC, bbox=BBOX)
        utils.plot_ts_panel(ax6, [era5LR, jraLR, cr20LR], "-", "hydrological", loc="")
        utils.plot_ts_panel(ax8, [era5MR, jraMR, cr20MR], "-", "hydrological", loc="")

        # fix legend
        unc_patch = ax1.fill(np.NaN, np.NaN, '0.8', zorder = 1, alpha=0.7)

        for ax in [ax1, ax3]:
            lines = []
            labels = []
            for line in ax.get_lines():
                if line.get_label() == "HadISDH":
                    lines += [(line, unc_patch[0])]
                    labels += [line.get_label()]                   
                else:
                    lines += [line]
                    labels += [line.get_label()]


            ax.legend(lines, labels, \
                       loc=LEGEND_LOC, ncol=2, frameon=False, prop={'size':settings.LEGEND_FONTSIZE}, \
                       labelspacing=0.1, columnspacing=0.5, bbox_to_anchor=BBOX)

        # prettify
        ax1.set_xlim([1957, int(settings.YEAR)+2])
        ax2.set_xlim([1957, int(settings.YEAR)+2])
        ax1.set_xticklabels(["", "1960", "1970", "1980", "1990", "2000", "2010", ""])

        for ax in [ax1, ax2, ax3, ax4]:
            ax.set_ylim([-0.39, 0.8])
        for ax in [ax5, ax6, ax7, ax8]:
            ax.set_ylim([-1.8, 1.5])

        for ax in [ax1, ax3, ax5, ax7]:
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax7.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax8.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        plt.setp([a.get_xticklabels() for a in fig.axes[:-2]], visible=False)
        plt.setp(ax2.get_yticklabels(), visible=False)
        plt.setp(ax4.get_yticklabels(), visible=False)
        plt.setp(ax6.get_yticklabels(), visible=False)
        plt.setp(ax8.get_yticklabels(), visible=False)


        ax1.text(0.02, 0.85, "(a) In Situ Land q", transform=ax1.transAxes, fontsize=settings.FONTSIZE)
        ax2.text(0.02, 0.85, "(b) Reanalyses Land q", transform=ax2.transAxes, fontsize=settings.FONTSIZE)
        ax3.text(0.02, 0.85, "(c) In Situ Ocean q", transform=ax3.transAxes, fontsize=settings.FONTSIZE)
        ax4.text(0.02, 0.85, "(d) Reanalyses Ocean q", transform=ax4.transAxes, fontsize=settings.FONTSIZE)
        ax5.text(0.02, 0.85, "(e) In Situ Land RH", transform=ax5.transAxes, fontsize=settings.FONTSIZE)
        ax6.text(0.02, 0.85, "(f) Reanalyses Land RH", transform=ax6.transAxes, fontsize=settings.FONTSIZE)
        ax7.text(0.02, 0.85, "(g) In Situ Ocean RH", transform=ax7.transAxes, fontsize=settings.FONTSIZE)
        ax8.text(0.02, 0.85, "(h) Reanalyses Ocean RH", transform=ax8.transAxes, fontsize=settings.FONTSIZE)


        plt.figtext(0.01, 0.75, "Specific Humidity (g kg"+r'$^{-1}$'+")", va='center', rotation='vertical', fontsize=settings.FONTSIZE)
        plt.figtext(0.01, 0.25, "Relative Humidity (%rh)", va='center', rotation='vertical', fontsize=settings.FONTSIZE)

        fig.subplots_adjust(right=0.98, top=0.95, bottom=0.05, hspace=0.001)

        plt.savefig(settings.IMAGELOC + "HUM_ts_unc{}".format(settings.OUTFMT))
        plt.close()

    input("stOP")
    #*********************************************
    # Map plots
    ## RH
    bounds = [-50, -12, -9, -6, -3, 0, 3, 6, 9, 12, 50]
    # RH HadISDH
    if False:
        cube = read_maps(DATALOC + "HUMrh_anomalymap_HADISDHland{}.txt".format(settings.YEAR), "HadISDH RH", None, footer=True)

        utils.plot_smooth_map_iris(settings.IMAGELOC + "HUM_RH_hadisdh_land", cube, settings.COLOURMAP_DICT["hydrological"], \
                                       bounds, "Anomalies from 1981-2010 (%rh)", figtext="", title="")

    # RH HadISDH Land and Marine
    if True:
   
        cube = read_maps(DATALOC + "HUMrh_anomalymap_HADISDH{}.txt".format(settings.YEAR), "HadISDH RH", None, footer=True)

        utils.plot_smooth_map_iris(settings.IMAGELOC + "HUM_RH_hadisdh_combined", cube, settings.COLOURMAP_DICT["hydrological"], \
                                   bounds, "Anomalies from 1981-2010 (%rh)", figtext="", title="")
        utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_HUM_RH_hadisdh_combined", cube, settings.COLOURMAP_DICT["hydrological"], \
                                   bounds, "Anomalies from 1981-2010 (%rh)", figtext="(h) Surface Relative Humidity", title="")

    # RH ERA 
    if True:
        cube = read_maps(DATALOC + "HUMrh_anomalymap_ERA5{}.txt".format(settings.YEAR), "ERA-I RH", None, footer=True)
        
        utils.plot_smooth_map_iris(settings.IMAGELOC + "HUM_RH_era5", cube, settings.COLOURMAP_DICT["hydrological"], \
                                   bounds, "Anomalies from 1981-2010 (%rh)", figtext="", title="")
        #    utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_HUM_RH_era5", cube, settings.COLOURMAP_DICT["hydrological"], \
            #                                   bounds, "Anomalies from 1981-2010 (%rh)", figtext="(o) Surface Relative Humidity", title="")

    # RH MERRA 
    if True:
        cube = read_maps(DATALOC + "HUMrh_anomalymap_MERRA2{}.txt".format(settings.YEAR), "MERRA2 RH", None, footer=True)
   
        utils.plot_smooth_map_iris(settings.IMAGELOC + "HUM_RH_merra", cube, settings.COLOURMAP_DICT["hydrological"], \
                                   bounds, "Anomalies from 1981-2010 (%rh)", figtext="", title="")

    ## Q
    bounds = [-20., -2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5, 2, 20]
    # q HadISDH
    if False:
        cube = read_maps(DATALOC + "HUMq_anomalymap_HADISDHland{}.txt".format(settings.YEAR), "HadISDH q", "g/kg", footer=True)

        utils.plot_smooth_map_iris(settings.IMAGELOC + "HUM_q_hadisdh_land", cube, settings.COLOURMAP_DICT["hydrological"], \
                                   bounds, "Anomalies from 1981-2010 (g kg"+r'$^{-1}$'+")", figtext="", title="")
        #    utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_HUM_q_hadisdh_land", cube, settings.COLOURMAP_DICT["hydrological"], \
            #                                   bounds, "Anomalies from 1981-2010 (g kg"+r'$^{-1}$'+")", figtext="(n) Surface Specific Humidity", title="")

    # q HadISDH Land and Marine
    if True:
        cube = read_maps(DATALOC + "HUMq_anomalymap_HADISDH{}.txt".format(settings.YEAR), "HadISDH q", "g/kg", footer=True)

        utils.plot_smooth_map_iris(settings.IMAGELOC + "HUM_q_hadisdh_combined", cube, settings.COLOURMAP_DICT["hydrological"], \
                                   bounds, "Anomalies from 1981-2010 (g kg"+r'$^{-1}$'+")", figtext="", title="")
        utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_HUM_q_hadisdh_combined", cube, settings.COLOURMAP_DICT["hydrological"], \
                                   bounds, "Anomalies from 1981-2010 (g kg"+r'$^{-1}$'+")", figtext="(g) Surface Specific Humidity", title="")

    # q ERA
    if True:
        cube = read_maps(DATALOC + "HUMq_anomalymap_ERA5{}.txt".format(settings.YEAR), "ERA-I q", "g/kg", footer=True)

        utils.plot_smooth_map_iris(settings.IMAGELOC + "HUM_q_era5", cube, settings.COLOURMAP_DICT["hydrological"], \
                                   bounds, "Anomalies from 1981-2010 (g kg"+r'$^{-1}$'+")", figtext="", title="")

    # MERRA?
    if True:
        cube = read_maps(DATALOC + "HUMq_anomalymap_MERRA2{}.txt".format(settings.YEAR), "MERRA2 q", "g/kg", footer=True)

        utils.plot_smooth_map_iris(settings.IMAGELOC + "HUM_q_merra", cube, settings.COLOURMAP_DICT["hydrological"], \
                                   bounds, "Anomalies from 1981-2010 (g kg"+r'$^{-1}$'+")", figtext="", title="")



    return # run_all_plots
Beispiel #8
0
def run_all_plots():

    #************************************************************************
    # Timeseries - 2016
    if False:
        grasp, erai, era_presat, merra, jra55 = read_uaw_ts(DATALOC +
                                                            "20N-40N300.nc",
                                                            smooth=True)
        qbo = read_QBO(DATALOC + "qbo_1908_2015_REC_ERA40_ERAINT.txt")

        fig, (ax1, ax2, ax3, ax4, ax5) = plt.subplots(5,
                                                      figsize=(8, 12),
                                                      sharex=True)

        # Observations
        utils.plot_ts_panel(ax1, [grasp],
                            "-",
                            "circulation",
                            loc=LEGEND_LOC,
                            ncol=2,
                            extra_labels=[" (0.02)"])

        # Reanalyses
        utils.plot_ts_panel(
            ax2, [erai, era_presat, jra55, merra],
            "-",
            "circulation",
            loc=LEGEND_LOC,
            ncol=2,
            extra_labels=[" (-0.20)", " (0.33)", " (-0.13)", " (-0.07)"])

        grasp, erai, era_presat, merra, jra55 = read_uaw_ts(DATALOC +
                                                            "10S-10N50.nc",
                                                            smooth=False)

        # Observations
        utils.plot_ts_panel(ax3, [qbo, grasp],
                            "-",
                            "circulation",
                            loc=LEGEND_LOC,
                            ncol=2,
                            extra_labels=["", " (-0.31)"])
        ax3.set_ylabel("Zonal Anomaly (m s" + r'$^{-1}$' + ")",
                       fontsize=settings.FONTSIZE)

        # Reanalyses
        utils.plot_ts_panel(
            ax4, [erai, era_presat, jra55, merra],
            "-",
            "circulation",
            loc=LEGEND_LOC,
            ncol=2,
            extra_labels=[" (-0.33)", " (-0.16)", " (-0.37)", " (0.30)"])

        fig.subplots_adjust(left=0.11, right=0.99, top=0.99, hspace=0.001)

        # turn on 4th axis ticks

        for tick in ax4.get_xticklabels():
            tick.set_visible(True)

        # delete the 5th axis and recreate - to break the sharex link
        fig.delaxes(ax5)
        ax5 = fig.add_subplot(515)
        pos = ax5.get_position()
        new_pos = [pos.x0, pos.y0 - 0.05, pos.width, pos.height]
        ax5.set_position(new_pos)

        # Obs & Reanalyses
        utils.plot_ts_panel(ax5, [grasp, erai, jra55, merra],
                            "-",
                            "circulation",
                            loc=LEGEND_LOC,
                            ncol=2)

        # sort formatting
        for ax in [ax4, ax5]:
            for tick in ax.xaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

        for ax in [ax1, ax2, ax3, ax4, ax5]:
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

        # x + y limit
        ax1.set_xlim([1930, 2017.9])
        ax1.set_ylim([-13, 6])
        ax1.yaxis.set_ticks([-10, -5, 0])
        ax2.set_ylim([-3.8, 3.8])
        ax2.yaxis.set_ticks([-2, 0, 2, 4])
        ax3.set_ylim([-34, 24])
        ax4.set_ylim([-34, 24])
        ax5.set_ylim([-34, 24])

        ax5.set_xlim([2000, 2017.9])

        # sort labelling
        ax1.text(0.02,
                 0.87,
                 "(a) Observations 20" + r'$^\circ$' + " - 40" + r'$^\circ$' +
                 "N 300hPa",
                 transform=ax1.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax2.text(0.02,
                 0.87,
                 "(b) Reanalyses 20" + r'$^\circ$' + " - 40" + r'$^\circ$' +
                 "N 300hPa",
                 transform=ax2.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax3.text(0.02,
                 0.87,
                 "(c) Observations & Reconstructions 10" + r'$^\circ$' +
                 "S - 10" + r'$^\circ$' + "N 50hPa",
                 transform=ax3.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax4.text(0.02,
                 0.87,
                 "(d) Reanalyses 10" + r'$^\circ$' + "S - 10" + r'$^\circ$' +
                 "N 50hPa",
                 transform=ax4.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax5.text(0.02,
                 0.87,
                 "(e) Observations & Reanalyses 10" + r'$^\circ$' + "S - 10" +
                 r'$^\circ$' + "N 50hPa",
                 transform=ax5.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)

        plt.savefig(settings.IMAGELOC + "UAW_ts{}".format(settings.OUTFMT))

    #************************************************************************
    # Timeseries - 2018
    if True:
        plt.figure(figsize=(8, 5))
        plt.clf()
        ax = plt.axes([0.12, 0.10, 0.87, 0.87])

        # Globe
        #    grasp, erai, cera, merra, jra55 = read_uaw_ts(DATALOC + "Globe850.nc", annual=True)
        era5, erai, merra, jra55 = read_uaw_ts(DATALOC + "Globe850_v2.nc",
                                               annual=True)
        utils.plot_ts_panel(ax, [merra, erai, era5, jra55], "-", "circulation", \
                            loc=LEGEND_LOC, ncol=2, extra_labels=[" (0.03)", " (0.07)", \
                                                                      " (0.03)", " (0.06)"])

        # sort formatting
        for tick in ax.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        for tick in ax.yaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        # x + y limit
        ax.set_xlim([1958, int(settings.YEAR) + 0.9])
        ax.set_ylim([-0.39, 1.0])
        ax.yaxis.set_ticks_position('left')
        ax.set_ylabel("Wind Anomaly (m s" + r'$^{-1}$' + ")",
                      fontsize=settings.LABEL_FONTSIZE)

        # # sort labelling
        ax.text(0.02,
                0.87,
                "Globe 850hPa",
                transform=ax.transAxes,
                fontsize=settings.LABEL_FONTSIZE)

        plt.savefig(settings.IMAGELOC +
                    "UAW_globe_ts{}".format(settings.OUTFMT))

    #*******
    # Tropics timeseries
    if False:
        fig = plt.figure(figsize=(8, 5))
        plt.clf()
        ax = plt.axes([0.10, 0.10, 0.87, 0.87])

        # 10N to 10S
        grasp, erai, cera, merra, jra55 = read_uaw_ts(DATALOC + "10S-10N50.nc")
        utils.plot_ts_panel(ax, [merra, erai, jra55, grasp], "-", "circulation",\
                                loc=LEGEND_LOC, ncol=2, extra_labels=[" (0.17)", " (-0.40)", \
                                                                          " (-0.51)", " (-0.30)"])

        # sort formatting
        for tick in ax.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        for tick in ax.yaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        # x + y limit
        ax.set_xlim([2000, int(settings.YEAR) + 2])
        ax.set_ylim([-28, 18])
        ax.yaxis.set_ticks_position('left')
        ax.set_ylabel("Wind Anomaly (m s" + r'$^{-1}$' + ")",
                      fontsize=settings.LABEL_FONTSIZE)

        # # sort labelling
        ax.text(0.02, 0.87, "10"+r'$^\circ$'+"S - 10"+r'$^\circ$'+"N 50hPa", \
                    transform=ax.transAxes, fontsize=settings.LABEL_FONTSIZE)

        plt.savefig(settings.IMAGELOC +
                    "UAW_tropics_ts{}".format(settings.OUTFMT))

    #************************************************************************
    # Global Map - ERA5 Anomaly figure
    if True:
        # Read in ERA5 anomalies

        # IRIS doesn't like the Conventions attribute
        ncfile = ncdf.Dataset(DATALOC + "ERA5_850_u.nc", 'r')

        var = ncfile.variables["u"][:]  # this is a masked array
        lons = ncfile.variables["longitude"][:]
        lats = ncfile.variables["latitude"][:]

        ncfile.close()

        # monthly data, so take mean
        print("not complete year used in 2019")
        mean = np.mean(var[7:], axis=0)

        cube = utils.make_iris_cube_2d(mean, lats, lons, "UAW_ANOM", "m/s")

        bounds = [-100, -4, -2, -1, -0.5, 0, 0.5, 1, 2, 4, 100]

        utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_UAW_{}_anoms_era5".format(settings.YEAR), \
                                       cube, settings.COLOURMAP_DICT["circulation"], bounds, \
                                       "Anomalies from 1981-2010 (m s"+r'$^{-1}$'+")", \
                                       figtext="(w) Upper Air (850-hPa) Eastward Winds (ASOND)")
        utils.plot_smooth_map_iris(settings.IMAGELOC + "UAW_{}_anoms_era5".format(settings.YEAR), \
                                       cube, settings.COLOURMAP_DICT["circulation"], bounds, \
                                       "Anomalies from 1981-2010 (m s"+r'$^{-1}$'+")")

    #************************************************************************
    # QBO plot - https://www.geo.fu-berlin.de/en/met/ag/strat/produkte/qbo/index.html
    if False:
        levels = np.array([70., 50., 40., 30., 20., 15., 10.])
        times = []
        dttimes = []
        data = np.zeros((levels.shape[0], 13))
        factor = 0.1
        j = 0

        with open(DATALOC + "qbo.dat", "r") as infile:

            for line in infile:
                line = line.split()

                if len(line) > 0:

                    # get current year
                    try:
                        if int(line[1][:2]) >= int(settings.YEAR[-2:]) and int(
                                line[1][:2]) <= int(settings.YEAR[-2:]) + 1:
                            month = int(line[1][-2:])
                            times += [month]
                            dttimes += [
                                dt.datetime(int(settings.YEAR), month, 1)
                            ]
                            data[:, j] = [float(i) * factor for i in line[2:]]
                            j += 1
                    except ValueError:
                        pass

        data = np.array(data)
        times = np.array(times)
        times[-1] += 12

        # And now plot
        cmap = settings.COLOURMAP_DICT["circulation"]
        bounds = [
            -100., -45., -30., -15., -10., -5., 0., 5., 10., 15., 30., 45., 100
        ]
        norm = mpl.cm.colors.BoundaryNorm(bounds, cmap.N)

        fig = plt.figure(figsize=(8, 8))
        plt.clf()
        ax = plt.axes([0.12, 0.07, 0.8, 0.9])

        times, levels = np.meshgrid(times, levels)

        con = plt.contourf(times,
                           levels,
                           data,
                           bounds,
                           cmap=cmap,
                           norm=norm,
                           vmax=bounds[-1],
                           vmin=bounds[1])

        plt.ylabel("Pressure (hPa)", fontsize=settings.FONTSIZE)
        plt.xlabel(settings.YEAR, fontsize=settings.FONTSIZE)
        plt.xticks(times[0], [dt.datetime.strftime(d, "%b") for d in dttimes],
                   fontsize=settings.FONTSIZE * 0.8)

        plt.xlim([1, 13])
        plt.ylim([70, 10])

        ax.set_yscale("log", subsy=[])
        plt.gca().yaxis.set_major_locator(
            matplotlib.ticker.MultipleLocator(10))
        plt.gca().yaxis.set_minor_locator(matplotlib.ticker.NullLocator())
        plt.gca().yaxis.set_major_formatter(
            matplotlib.ticker.ScalarFormatter())

        plt.yticks(np.arange(70, 0, -10),
                   ["{}".format(l) for l in np.arange(70, 0, -10)],
                   fontsize=settings.FONTSIZE)

        # colourbar and prettify
        cb = plt.colorbar(con, orientation='horizontal', pad=0.1, fraction=0.05, aspect=30, \
                              ticks=bounds[1:-1], label="zonal wind (m/s)", drawedges=True)

        cb.set_ticklabels(["{:g}".format(b) for b in bounds[1:-1]])
        cb.ax.tick_params(axis='x',
                          labelsize=settings.FONTSIZE * 0.6,
                          direction='in')

        cb.set_label(label="zonal wind (m/s)",
                     fontsize=settings.FONTSIZE * 0.6)
        #    cb.outline.set_color('k')
        cb.outline.set_linewidth(2)
        cb.dividers.set_color('k')
        cb.dividers.set_linewidth(2)

        utils.thicken_panel_border(ax)

        plt.savefig(settings.IMAGELOC +
                    "UAW_QBO_levels{}".format(settings.OUTFMT))

    #************************************************************************
    # https://www.geo.fu-berlin.de/met/ag/strat/produkte/qbo/singapore2019.dat
    if True:
        levels = []
        times = np.arange(1, 13, 1)
        data = []
        factor = 0.1
        j = 0

        with open(DATALOC + "singapore{}.dat".format(settings.YEAR),
                  "r") as infile:
            read = False
            for line in infile:
                line = line.split()
                if len(line) == 0:
                    continue

                if line[0] == "hPa":
                    read = True
                    continue
                elif read:

                    if len(line) > 0:

                        levels += [int(line[0])]
                        data += [[float(l) * 0.1 for l in line[1:]]]

                else:
                    continue

        # convert ot arrays and reorder
        levels = np.array(levels)
        levels = levels[::-1]
        data = np.array(data)
        data = data[::-1, :]

        # And now plot
        cmap = settings.COLOURMAP_DICT["circulation"]
        bounds = [
            -100., -45., -30., -15., -10., -5., 0., 5., 10., 15., 30., 45., 100
        ]
        norm = mpl.cm.colors.BoundaryNorm(bounds, cmap.N)

        fig = plt.figure(figsize=(8, 8))
        plt.clf()
        ax = plt.axes([0.12, 0.07, 0.85, 0.9])

        times, levels = np.meshgrid(times, levels)

        con = plt.contourf(times,
                           levels,
                           data,
                           bounds,
                           cmap=cmap,
                           norm=norm,
                           vmax=bounds[-1],
                           vmin=bounds[1])

        plt.ylabel("Pressure (hPa)", fontsize=settings.FONTSIZE)
        plt.xlabel(settings.YEAR, fontsize=settings.FONTSIZE)
        dttimes = [
            dt.datetime(int(settings.YEAR), m + 1, 1) for m in range(12)
        ]
        plt.xticks(times[0], [dt.datetime.strftime(d, "%b") for d in dttimes],
                   fontsize=settings.FONTSIZE)

        plt.xlim([1, 12])
        plt.ylim([100, 10])

        ax.set_yscale("log", subsy=[])
        plt.gca().yaxis.set_major_locator(
            matplotlib.ticker.MultipleLocator(10))
        plt.gca().yaxis.set_minor_locator(matplotlib.ticker.NullLocator())
        plt.gca().yaxis.set_major_formatter(
            matplotlib.ticker.ScalarFormatter())

        plt.yticks(np.arange(100, 0, -10),
                   ["{}".format(l) for l in np.arange(100, 0, -10)],
                   fontsize=settings.FONTSIZE)

        # colourbar and prettify
        cb = plt.colorbar(con, orientation='horizontal', pad=0.1, fraction=0.05, aspect=30, \
                              ticks=bounds[1:-1], drawedges=True)

        cb.set_ticklabels(["{:g}".format(b) for b in bounds[1:-1]])
        cb.set_label(label="zonal wind (m/s)", fontsize=settings.FONTSIZE)
        cb.ax.tick_params(axis='x',
                          labelsize=settings.FONTSIZE,
                          direction='in')

        cb.set_label(label="zonal wind (m/s)", fontsize=settings.FONTSIZE)
        #    cb.outline.set_color('k')
        cb.outline.set_linewidth(2)
        cb.dividers.set_color('k')
        cb.dividers.set_linewidth(2)

        utils.thicken_panel_border(ax)

        plt.savefig(settings.IMAGELOC + "UAW_levels{}".format(settings.OUTFMT))

    #************************************************************************
    # 200hPa winds in 1980 and 2018
    if False:
        cube_list = iris.load(DATALOC + "ws200_spread_197901_201801.nc")
        names = np.array([str(cube.var_name) for cube in cube_list])

        # hard coded labels
        mu = {"1980": "1.8", "2018": "1.0"}
        rms = {"1980": "2.0", "2018": "1.1"}
        label = {"1980": "(a)", "2018": "(b)"}
        bounds = [0, 0.5, 1, 1.5, 2, 2.5, 3.0, 100]
        for name in names:
            print(name)
            cube_index, = np.where(names == name)
            cube = cube_list[cube_index[0]]

            year = name.split("_")[-1][:4]

            utils.plot_smooth_map_iris(
                settings.IMAGELOC + "UAW_200hPa_Jan{}".format(year),
                cube,
                plt.cm.BuPu,
                bounds,
                "m/s",
                figtext="{} January {}, mean={}, RMS={}".format(
                    label[year], year, mu[year], rms[year]))

    #************************************************************************
    # Plots
    if False:
        label = {"1980": "(c)", "2018": "(d)"}
        for year in ["1980", "2018"]:

            cube_list = iris.load(DATALOC + "v200_zonal_{}01.nc".format(year))

            for cube in cube_list:
                if cube.var_name == "products":
                    names = cube
                elif cube.var_name == "v200_array":
                    data_array = cube

            latitudes = data_array.coord("latitude").points
            plt.figure()
            ax = plt.axes([0.13, 0.13, 0.85, 0.85])

            COLOURS = {
                "ERA5 ens. mean": "red",
                "ERA5 ensemble": "orange",
                "ERA5 HRES": "orange",
                "JRA55": "c",
                "MERRA-2": "m",
                "ERA-Interim": "orange"
            }

            for name, data in zip(names.data, data_array.data):

                str_name = "".join(str(name.compressed(), "latin-1").rstrip())
                # manually fix names
                if str_name == "ERAI":
                    str_name = "ERA-Interim"
                elif str_name == "ERA5 ens mean":
                    str_name = "ERA5 ens. mean"

                if str_name[:3] == "mem":
                    plt.plot(latitudes[1:], data[1:], c="orange")
                elif str_name == "ERA-Interim":
                    plt.plot(latitudes[1:],
                             data[1:],
                             c=COLOURS[str_name],
                             label=str_name,
                             lw=2,
                             ls="--")
                else:
                    plt.plot(latitudes[1:],
                             data[1:],
                             c=COLOURS[str_name],
                             label=str_name,
                             lw=2)

            plt.legend(loc="upper right", ncol=1, frameon=False)
            plt.xlabel("Latitude", fontsize=settings.FONTSIZE * 0.8)
            plt.ylabel("m/s", fontsize=settings.FONTSIZE * 0.8)
            plt.text(0.03,
                     0.92,
                     "{} January {}".format(label[year], year),
                     transform=ax.transAxes,
                     fontsize=settings.FONTSIZE * 0.8)

            plt.xlim([-90, 90])
            plt.xticks(np.arange(-90, 120, 30))
            plt.ylim([-1, 4])
            for tick in ax.xaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE * 0.8)
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE * 0.8)
            utils.thicken_panel_border(ax)

            plt.savefig(settings.IMAGELOC +
                        "UAW_200hPa_Jan{}_ts{}".format(year, settings.OUTFMT))

    return
Beispiel #9
0
def run_all_plots():

    # # CEI timeseries
    if True:
        # from https://www.ncdc.noaa.gov/extremes/cei/graph/us/03-05/4 (Spring, Step4 indicator)
        cei = read_cei("CEI_step4_figure_data.csv")
        smoothed = binomialfilter(cei.data, -99.9, 9, pad=False)
        smoothed = np.ma.masked_where(smoothed == -99.9, smoothed)

        fig = plt.figure(figsize=(8, 5))
        plt.clf()
        ax1 = plt.axes([0.11, 0.08, 0.86, 0.90])

        ax1.bar(cei.times,
                cei.data,
                color="g",
                label=cei.name,
                align="center",
                width=1,
                edgecolor="darkgreen")
        ax1.plot(cei.times, smoothed, "r", lw=LW)

        ax1.plot([cei.times[0], cei.times[-1]],
                 [np.mean(cei.data), np.mean(cei.data)],
                 "k",
                 lw=1)

        ax1.set_xlim([1910, int(settings.YEAR) + 2])
        ax1.set_ylabel("%", fontsize=settings.FONTSIZE)
        minorLocator = MultipleLocator(1)
        ax1.xaxis.set_minor_locator(minorLocator)

        utils.thicken_panel_border(ax1)
        ax1.yaxis.set_tick_params(right=False)
        for tick in ax1.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax1.yaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

#        ax1.text(0.02, 0.9, "(e)", transform=ax1.transAxes, fontsize=settings.FONTSIZE)
        plt.savefig(settings.IMAGELOC + "PEX_CEI_ts{}".format(settings.OUTFMT))

        plt.close()

    #*************************
    # GHCNDEX indices
    rank_bounds = [-4.5, -3.5, -2.5, -1.5, 1.5, 2.5, 3.5, 4.5]

    if True:

        for index in ETCCDI_INDICES:

            cube_list = iris.load(
                DATALOC +
                "GHCND_{}_1951-{}_RegularGrid_global_2.5x2.5deg_LSmask.nc".
                format(index,
                       int(settings.YEAR) + 1))
            names = np.array([cube.name() for cube in cube_list])

            #*************
            # plot annual map

            selected_cube, = np.where(names == "Ann")

            total_cube = cube_list[selected_cube[0]]
            total_cube.coord('latitude').guess_bounds()
            total_cube.coord('longitude').guess_bounds()

            anoms = copy.deepcopy(total_cube)
            anoms = ApplyClimatology(anoms)

            # select the year to plot
            years = GetYears(total_cube)
            loc, = np.where(years == SELECTED_YEAR)

            # sort the bounds and colourbars
            if index in ["Rx1day"]:
                bounds = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
                cmap = settings.COLOURMAP_DICT["precip_sequential"]
            elif index in ["Rx5day"]:
                bounds = [0, 20, 40, 60, 80, 100, 120, 140, 160, 180]
                cmap = settings.COLOURMAP_DICT["precip_sequential"]
            elif index in ["R10mm"]:
                bounds = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45]
                cmap = settings.COLOURMAP_DICT["precip_sequential"]
            elif index in ["R20mm"]:
                bounds = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45]
                cmap = settings.COLOURMAP_DICT["precip_sequential"]
            elif index in ["R95p"]:
                bounds = [0, 25, 50, 75, 100, 125, 150, 175, 200, 225]
                cmap = settings.COLOURMAP_DICT["precip_sequential"]
            elif index in ["PRCPTOT"]:
                bounds = [0, 25, 50, 75, 100, 125, 150, 200, 300, 400]
                cmap = settings.COLOURMAP_DICT["precip_sequential"]

            utils.plot_smooth_map_iris(
                settings.IMAGELOC +
                "PEX_{}_{}_ghcndex".format(index, settings.YEAR),
                total_cube[loc[0]],
                cmap,
                bounds,
                "{} ({})".format(index, ETCCDI_UNITS[index]),
                title="GHCNDEX {} - {}".format(index, ETCCDI_LABELS[index]))

            # sort the bounds and colourbars
            if index in ["Rx1day"]:
                bounds = [-100, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 100]
                bounds = [
                    -100, -40, -30, -20, -10, -5, 0, 5, 10, 20, 30, 40, 100
                ]
                cmap = settings.COLOURMAP_DICT["hydrological"]
            elif index in ["Rx5day"]:
                bounds = [
                    -100, -40, -30, -20, -10, -5, 0, 5, 10, 20, 30, 40, 100
                ]
                cmap = settings.COLOURMAP_DICT["hydrological"]
            elif index in ["R10mm"]:
                bounds = [-20, -8, -6, -4, -2, 0, 2, 4, 6, 8, 20]
                cmap = settings.COLOURMAP_DICT["hydrological"]
            elif index in ["R20mm"]:
                bounds = [-20, -4, -3, -2, -1, 0, 1, 2, 3, 4, 20]
                cmap = settings.COLOURMAP_DICT["hydrological"]
            elif index in ["R95p"]:
                bounds = [
                    -1000, -100, -80, -60, -40, -20, 0, 20, 40, 60, 80, 100,
                    1000
                ]
                cmap = settings.COLOURMAP_DICT["hydrological"]
            elif index in ["PRCPTOT"]:
                bounds = [
                    -1000, -150, -80, -60, -40, -20, 0, 20, 40, 60, 80, 150,
                    1000
                ]
                cmap = settings.COLOURMAP_DICT["hydrological"]

            utils.plot_smooth_map_iris(
                settings.IMAGELOC +
                "PEX_{}_{}_anoms_ghcndex".format(index, settings.YEAR),
                anoms[loc[0]],
                cmap,
                bounds,
                "{} ({})".format(index, ETCCDI_UNITS[index]),
                title="GHCNDEX {} - {}".format(index, ETCCDI_LABELS[index]))
            if index == "Rx1day":
                utils.plot_smooth_map_iris(
                    settings.IMAGELOC + "p2.1_PEX_{}_{}_anoms_ghcndex".format(
                        index, settings.YEAR),
                    anoms[loc[0]],
                    cmap,
                    bounds,
                    "{} ({})".format(index, ETCCDI_UNITS[index]),
                    figtext="(k) Maximum 1 Day Precipitation Amount")

            rank_cube = get_ranks(anoms)

            plot_rank_map(
                settings.IMAGELOC +
                "PEX_{}_{}_rank_ghcndex".format(index, settings.YEAR),
                rank_cube[loc[0]],
                cmap,
                rank_bounds,
                "Rank",
                title="{} - {}".format(index, ETCCDI_UNITS[index]))
            #*************
            # plot season maps (2x2)

            if index in ["Rx1day", "Rx5day"]:

                for sc, cube in enumerate([total_cube, anoms]):

                    season_list = []
                    for season in SEASONS:

                        # extract each month
                        month_data = []
                        months = SEASON_DICT[season]
                        for month in months:

                            selected_cube, = np.where(names == month)
                            cube = cube_list[selected_cube[0]]

                            if month == "Dec":
                                # need to extract from previous year - cheat by rolling data around
                                cube.data = np.roll(cube.data, 1, axis=0)
                                cube.data.mask[
                                    0, :, :] = True  # and mask out the previous years'

                            month_data += [cube.data]

                        # finished getting all months, make a dummy cube to populate
                        month_data = np.ma.array(month_data)
                        season_cube = copy.deepcopy(cube)

                        # take appropriate seasonal value
                        season_cube.data = np.ma.max(month_data, axis=0)

                        # mask if fewer that 2 months present
                        nmonths_locs = np.ma.count(month_data, axis=0)
                        season_cube.data = np.ma.masked_where(
                            nmonths_locs < 2, season_cube.data)

                        # make anomalies
                        if sc == 1:
                            season_cube = ApplyClimatology(season_cube)

                        # fix for plotting
                        season_cube.coord('latitude').guess_bounds()
                        season_cube.coord('longitude').guess_bounds()

                        # select the year to plot
                        years = GetYears(cube)
                        loc, = np.where(years == SELECTED_YEAR)

                        # add to list
                        season_list += [season_cube[loc[0]]]

                    # sort the bounds and colourbars
                    if sc == 0:
                        if index in ["Rx1day", "Rx5day"]:
                            bounds = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
                            cmap = settings.COLOURMAP_DICT["precip_sequential"]

                        # pass to plotting routine
                        utils.plot_smooth_map_iris_multipanel(
                            settings.IMAGELOC +
                            "PEX_{}_{}_seasons_ghcndex".format(
                                index, settings.YEAR),
                            season_list,
                            cmap,
                            bounds,
                            "{} ({})".format(index, ETCCDI_UNITS[index]),
                            shape=(2, 2),
                            title=SEASONS,
                            figtext=["(a)", "(b)", "(c)", "(d)"],
                            figtitle="{} - {}".format(index,
                                                      ETCCDI_LABELS[index]))
                    elif sc == 1:
                        cmap = settings.COLOURMAP_DICT["hydrological"]
                        if index in ["Rx1day"]:
                            bounds = [
                                -100, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10,
                                100
                            ]
                        elif index in ["Rx5day"]:
                            bounds = [
                                -100, -20, -16, -12, -8, -4, 0, 4, 8, 12, 16,
                                20, 100
                            ]

                        # pass to plotting routine
                        utils.plot_smooth_map_iris_multipanel(
                            settings.IMAGELOC +
                            "PEX_{}_{}_anoms_seasons_ghcndex".format(
                                index, settings.YEAR),
                            season_list,
                            cmap,
                            bounds,
                            "{} ({})".format(index, ETCCDI_UNITS[index]),
                            shape=(2, 2),
                            title=SEASONS,
                            figtext=["(a)", "(b)", "(c)", "(d)"],
                            figtitle="{} - {}".format(index,
                                                      ETCCDI_LABELS[index]))

    #*************************
    # DWD indices
    if True:
        for index in DWD_INDICES:
            print(index)
            if not os.path.exists(
                    DATALOC +
                    "First_Guess_Daily_{}_{}.nc".format(settings.YEAR, index)):
                print("File {} missing".format(
                    "First_Guess_Daily_{}_{}.nc".format(settings.YEAR, index)))
                continue
            cube_list = iris.load(
                DATALOC +
                "First_Guess_Daily_{}_{}.nc".format(settings.YEAR, index))

            if len(cube_list) == 1:
                cube = cube_list[0]
            else:
                # these have two fields
                for cube in cube_list:
                    if cube.units == "mm per 5 day" and index == "RX5":
                        break
                    elif cube.var_name == "consecutive_wet_days_index_per_time_period" and index == "CWD":
                        break
                    elif cube.var_name == "consecutive_dry_days_index_per_time_period" and index == "CDD":
                        break
                    else:
                        print(
                            "Check cube for {} for extra fields".format(index))

            cube = cube[0]  # take only single slice
            cube.coord('latitude').guess_bounds()
            cube.coord('longitude').guess_bounds()

            if index in ["CDD"]:
                bounds = [0, 20, 40, 60, 80, 100, 120, 140, 160, 180]
                cmap = settings.COLOURMAP_DICT["precip_sequential_r"]
            elif index in ["CWD"]:
                bounds = [0, 20, 40, 60, 80, 100, 120, 140, 160, 180]
                bounds = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
                cmap = settings.COLOURMAP_DICT["precip_sequential"]
            elif index in ["DD"]:
                bounds = [0, 40, 80, 120, 160, 200, 240, 280, 320, 360]
                cmap = settings.COLOURMAP_DICT["precip_sequential_r"]
            elif index in ["PD"]:
                bounds = [0, 40, 80, 120, 160, 200, 240, 280, 320, 360]
                cmap = settings.COLOURMAP_DICT["precip_sequential"]
            elif index in ["RX1", "PD10"]:
                bounds = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
                cmap = settings.COLOURMAP_DICT["precip_sequential"]
            elif index in ["RX5"]:
                bounds = [0, 50, 100, 150, 200, 250, 300, 350, 400, 450]
                bounds = [0, 20, 40, 60, 80, 100, 120, 140, 160, 180]
                cmap = settings.COLOURMAP_DICT["precip_sequential"]
            elif index in ["R10", "R20", "R95P", "SDII", "PD20"]:
                bounds = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45]
                cmap = settings.COLOURMAP_DICT["precip_sequential"]

            utils.plot_smooth_map_iris(
                settings.IMAGELOC +
                "PEX_{}_{}_dwd".format(index, settings.YEAR),
                cube,
                cmap,
                bounds,
                "{} ({})".format(index, DWD_UNITS[index]),
                title="{} - {}".format(index, DWD_LABELS[index]))

    #*************************
    # DWD differences indices
    if True:
        for index in DWD_INDICES:
            print(index)
            if not os.path.exists(
                    DATALOC +
                    "Diff_{}-Mean_{}.nc".format(index, settings.YEAR)):
                print("File {} missing".format("Diff_{}-Mean_{}.nc".format(
                    index, settings.YEAR)))
                continue
            cube_list = iris.load(
                DATALOC + "Diff_{}-Mean_{}.nc".format(index, settings.YEAR))

            if len(cube_list) == 1:
                cube = cube_list[0]
            else:
                # these have two fields
                for cube in cube_list:
                    if cube.units == "mm per 5 day" and index == "RX5":
                        break

            cube = cube[0]  # take only single slice
            cube.coord('latitude').guess_bounds()
            cube.coord('longitude').guess_bounds()

            if index in ["RX1"]:
                bounds = [-100, -50, -25, -10, -5, 0, 5, 10, 25, 50, 100]
                cmap = settings.COLOURMAP_DICT["hydrological"]
            elif index in ["RX5"]:
                bounds = [-50, -30, -20, -10, -5, 0, 5, 10, 20, 30, 50]
                bounds = [-100, -50, -25, -10, -5, 0, 5, 10, 25, 50, 100]
                cmap = settings.COLOURMAP_DICT["hydrological"]
            elif index in ["PD10", "PD20", "R95P"]:
                bounds = [-50, -30, -20, -10, -5, 0, 5, 10, 20, 30, 50]
                cmap = settings.COLOURMAP_DICT["hydrological"]

            utils.plot_smooth_map_iris(
                settings.IMAGELOC +
                "PEX_{}_{}_diff_dwd".format(index, settings.YEAR),
                cube,
                cmap,
                bounds,
                "Anomalies from 1982-2016 {} ({})".format(
                    index, DWD_UNITS[index]),
                title="{} - {}".format(index, DWD_LABELS[index]))
            if index == "PD10":
                utils.plot_smooth_map_iris(
                    settings.IMAGELOC +
                    "p2.1_PEX_{}_{}_diff_dwd".format("R10mm", settings.YEAR),
                    cube,
                    cmap,
                    bounds,
                    "Anomalies from 1982-2016 {} ({})".format(
                        "R10mm", ETCCDI_UNITS["R10mm"]),
                    figtext="(l) {} anomalies".format("R10mm"))
            else:
                utils.plot_smooth_map_iris(
                    settings.IMAGELOC +
                    "p2.1_PEX_{}_{}_diff_dwd".format(index, settings.YEAR),
                    cube,
                    cmap,
                    bounds,
                    "Anomalies from 1982-2016 {} ({})".format(
                        index, DWD_UNITS[index]),
                    figtext="(l) {} anomalies".format(index))

    #*************************
    # MERRA map
    if True:
        index = "R10mm"
        cube = iris.load(DATALOC + "MERRA2_ann_2019_r10mm_gl_anom.nc")[0]

        bounds = [-50, -30, -20, -10, -5, 0, 5, 10, 20, 30, 50]
        cmap = settings.COLOURMAP_DICT["hydrological"]

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "PEX_R10mm_{}_merra2".format(settings.YEAR),
            cube[0],
            cmap,
            bounds,
            "{} ({})".format(index, ETCCDI_UNITS[index]),
            title="MERRA-2 {} - {}".format(index, ETCCDI_LABELS[index]))

    #*************************
    # ERA5 map
    if False:
        index = "Rx1day"
        cube = read_era5("prmax_{}.txt".format(settings.YEAR))

        bounds = [0, 2, 5, 10, 20, 40, 80, 160, 300, 450]
        cmap = settings.COLOURMAP_DICT["precip_sequential"]

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "PEX_Rx1day_{}_era5".format(settings.YEAR),
            cube,
            cmap,
            bounds,
            "{} ({})".format(index, ETCCDI_UNITS[index]),
            title="ERA5 {} - {}".format(index, ETCCDI_LABELS[index]))

    #*************************
    # ERA5 map
    if True:
        index = "Rx1day"
        cube = read_era5("prmax1d_anomaly_for_{}_wrt_1981-2010.txt".format(
            settings.YEAR))

        bounds = [-400, -100, -75, -50, -25, 0, 25, 50, 75, 100, 400]
        bounds = [-400, -100, -50, -20, -10, 0, 10, 20, 50, 100, 400]
        bounds = [-100, -40, -30, -20, -10, -5, 0, 5, 10, 20, 30, 40, 100]
        cmap = settings.COLOURMAP_DICT["hydrological"]

        utils.plot_smooth_map_iris(
            settings.IMAGELOC +
            "PEX_Rx1day_{}_anoms_era5".format(settings.YEAR),
            cube,
            cmap,
            bounds,
            "{} ({})".format(index, ETCCDI_UNITS[index]),
            title="ERA5 {} - {}".format(index, ETCCDI_LABELS[index]))
    #    utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_PEX_Rx1day_{}_anoms_era5".format(settings.YEAR), cube, cmap, bounds, "{} ({})".format(index, ETCCDI_UNITS[index]), figtext="(i) Rx1day anomalies")

    # cube = read_era5("prmax_for_{}_as_a_percentage_of_1981-2010_mean.txt".format(settings.YEAR))

    # bounds = [0, 10, 25, 50, 75, 100, 150, 200, 250, 300, 1000]
    # cmap = settings.COLOURMAP_DICT["hydrological"]

    # utils.plot_smooth_map_iris(settings.IMAGELOC + "PEX_Rx1day_{}_anoms_percent_era5".format(settings.YEAR), cube, cmap, bounds, "Anomalies from 1981-2010 (%)", title="ERA5 - Rx1day %")
    # utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_PEX_Rx1day_{}_anoms_percent_era5".format(settings.YEAR), cube, cmap, bounds, "Anomalies from 1981-2010 (%)", figtext="(m) Rx1day anomalies")

    #*************************
    # DWD percentile
    if True:

        #        dwd_cube = read_dwd_percentile(DATALOC + "GPCC_perzentile_{}.xyzras".format(settings.YEAR))

        cube_list = iris.load(DATALOC + "Quantile_12month_{}01-{}12.nc".format(
            settings.YEAR, settings.YEAR))
        dwd_cube = cube_list[0][0]

        bounds = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
        cmap = settings.COLOURMAP_DICT["hydrological"]
        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "PEX_{}_{}_dwd".format("R90", settings.YEAR),
            dwd_cube,
            cmap,
            bounds,
            "{} ({})".format("percentile", "%"),
            title="Percentile of the annual precipitation total")
        utils.plot_smooth_map_iris(
            settings.IMAGELOC +
            "p2.1_PEX_{}_{}_dwd".format("R90", settings.YEAR),
            dwd_cube,
            cmap,
            bounds,
            "{} ({})".format("percentile", "%"),
            figtext="(l) Percentile of the Annual Precipitation Total")

    #*************************
    # DWD drought
    if True:

        #        dwd_cube = read_dwd_percentile(DATALOC + "GPCC_perzentile_{}.xyzras".format(settings.YEAR))

        cube_list = iris.load(DATALOC + "GPCC_DI_201912_12.nc")
        dwd_cube = cube_list[0][0]

        bounds = [-10, -5, -3, -2, -1, 0, 1, 2, 3, 5, 10]
        cmap = settings.COLOURMAP_DICT["hydrological"]
        utils.plot_smooth_map_iris(settings.IMAGELOC +
                                   "PEX_{}_{}_dwd".format("DI", settings.YEAR),
                                   dwd_cube,
                                   cmap,
                                   bounds,
                                   "{} ({})".format("DI", "-"),
                                   title="12 month Drought Index")

    #*************************
    # GHCND totals and ratios
    if False:
        import cartopy.feature as cfeature

        NAMES = {"japan": "Japan", "neaus": "Australia", "hawaii": "Hawaii"}
        EXTENTS = {
            "japan": (132, 33, [126, 139, 30, 36]),
            "neaus": (145, -17, [139, 151, -26, -8]),
            "hawaii": (-158, 20, [-161, -154, 18.5, 22.5])
        }

        land_10m = cfeature.NaturalEarthFeature(
            'physical',
            'land',
            '10m',
            edgecolor='face',
            facecolor=cfeature.COLORS['land'])
        land_50m = cfeature.NaturalEarthFeature(
            'physical',
            'land',
            '50m',
            edgecolor='face',
            facecolor=cfeature.COLORS['land'])

        for index in ["Rx5day", "Rx1day"]:
            for state in ["03-neaus", "07-japan", "08-hawaii"]:

                print("{} - {}".format(state, index))
                lats, lons, value_mm, prev_value_mm = read_ghcnd(
                    "{}/{}-{}-non0-sorted-{}.txt".format(
                        DATALOC, index, settings.YEAR, state))

                ratio = value_mm / prev_value_mm

                # set up figure
                if "neaus" in state:
                    fig = plt.figure(figsize=(8, 5))
                else:
                    fig = plt.figure(figsize=(8, 3.5))

                if index == "Rx5day":
                    bounds = [0, 100, 200, 300, 400, 500, 600, 700, 800, 900]
                elif index == "Rx1day":
                    bounds = [0, 50, 100, 150, 200, 250, 300, 350, 400, 450]
                cmap = settings.COLOURMAP_DICT["precip_sequential"]
                norm = mpl.cm.colors.BoundaryNorm(bounds, cmap.N)

                #            ratio_cmap = plt.cm.YlOrRd
                #            ratio_bounds = [1, 1.05, 1.1, 1.15, 1.2, 1.3, 1.5, 1.75, 2.0 ]
                #            ratio_cmap = settings.COLOURMAP_DICT["hydrological"]
                #            ratio_bounds = [0.01, 0.5, 0.75, 0.9, 0.95, 1.0, 1.05, 1.1, 1.25, 2.0, 10.0]
                ratio_cmap = plt.cm.Blues
                ratio_bounds = [
                    0.01, 0.5, 0.7, 0.9, 1.0, 1.1, 1.3, 1.5, 2.0, 10.0
                ]
                ratio_norm = mpl.cm.colors.BoundaryNorm(
                    ratio_bounds, ratio_cmap.N)

                plt.clf()

                # set up axes
                ax0 = plt.axes([0.01, 0.12, 0.45, 0.85],
                               projection=cartopy.crs.Stereographic(
                                   central_longitude=EXTENTS[state[3:]][0],
                                   central_latitude=EXTENTS[state[3:]][1]))
                ax1 = plt.axes([0.51, 0.12, 0.45, 0.85],
                               projection=cartopy.crs.Stereographic(
                                   central_longitude=EXTENTS[state[3:]][0],
                                   central_latitude=EXTENTS[state[3:]][1]))

                for ax in [ax0, ax1]:
                    ax.set_extent(EXTENTS[state[3:]][2],
                                  cartopy.crs.PlateCarree())

                    states_provinces = cfeature.NaturalEarthFeature(
                        category='cultural',
                        name='admin_1_states_provinces_lines',
                        scale='50m',
                        facecolor='none')
                    ax.add_feature(states_provinces, edgecolor='gray')
                    ax.coastlines(resolution="10m", linewidth=0.5)
                    ax.add_feature(land_50m,
                                   zorder=0,
                                   facecolor="0.9",
                                   edgecolor="k")

                    # add other features
                    ax.gridlines()  #draw_labels=True)
                    ax.add_feature(cartopy.feature.BORDERS,
                                   zorder=0,
                                   facecolor="0.9",
                                   edgecolor="k")

                #  plot
                for ax, data, cm, bnds, nrm, label in zip(
                    [ax0, ax1], [value_mm, ratio], [cmap, ratio_cmap],
                    [bounds, ratio_bounds], [norm, ratio_norm],
                    ["{} (mm)".format(index), "Ratio to previous record"]):

                    scatter = ax.scatter(lons, lats, c=data, cmap=cm, norm=nrm, s=50, \
                                             transform=cartopy.crs.Geodetic(), edgecolor='0.5', linewidth=0.5)

                    # thicken border of colorbar and the dividers
                    # http://stackoverflow.com/questions/14477696/customizing-colorbar-border-color-on-matplotlib
                    if "Ratio" in label:
                        cb = fig.colorbar(scatter, ax=ax, orientation='horizontal', pad=0.05, fraction=0.05, \
                                        aspect=30, ticks=bnds[1:-1], label=label, drawedges=True)
                        cb.set_ticklabels(
                            ["{:g}".format(b) for b in bnds[1:-1]])
                    else:
                        cb = fig.colorbar(scatter, ax=ax, orientation='horizontal', pad=0.05, fraction=0.05, \
                                        aspect=30, ticks=bnds[1:-1], label=label, drawedges=True)
                        cb.set_ticklabels(["{:g}".format(b) for b in bnds])

                    cb.outline.set_linewidth(2)
                    cb.dividers.set_color('k')
                    cb.dividers.set_linewidth(2)
                    cb.ax.tick_params(axis='x',
                                      labelsize=settings.FONTSIZE * 0.6,
                                      direction='in')

                if index == "Rx5day" and state[3:] == "hawaii":
                    ax0.text(0.05,
                             1.05,
                             "(a)",
                             transform=ax0.transAxes,
                             fontsize=settings.FONTSIZE * 0.8)
                    ax1.text(0.05,
                             1.05,
                             "(b)",
                             transform=ax1.transAxes,
                             fontsize=settings.FONTSIZE * 0.8)
                elif index == "Rx1day" and state[3:] == "hawaii":
                    ax0.text(0.05,
                             1.05,
                             "(c)",
                             transform=ax0.transAxes,
                             fontsize=settings.FONTSIZE * 0.8)
                    ax1.text(0.05,
                             1.05,
                             "(d)",
                             transform=ax1.transAxes,
                             fontsize=settings.FONTSIZE * 0.8)

                plt.savefig(
                    settings.IMAGELOC +
                    "PEX_{}_{}-{}".format(index, NAMES[state[3:]], state[:2]) +
                    settings.OUTFMT)
                plt.close()

    return  # run_all_plots
Beispiel #10
0
def run_all_plots():

    #************************************************************************
    # Cloudiness timeseries
    if True:
        plt.clf()
        fig, (ax1, ax2) = plt.subplots(2, figsize=(8, 6.5), sharex=True)

        infilename = os.path.join(
            DATALOC,
            "{}_global_cloudiness_timeseries_v2.txt".format(settings.YEAR))

        # anomalies
        patmosx, hirs, misr, modis, calipso, ceres, satcorps, clara_a2, patmosdx, cci = \
            read_ts(infilename, anomaly=True)

        utils.plot_ts_panel(ax1, [
            patmosx, hirs, misr, modis, calipso, ceres, satcorps, clara_a2,
            patmosdx, cci
        ],
                            "-",
                            "hydrological",
                            loc="")

        ax1.text(0.02,
                 0.9,
                 "(a) Satellite - Anomalies",
                 transform=ax1.transAxes,
                 fontsize=settings.FONTSIZE)

        # actuals
        patmosx, hirs, misr, modis, calipso, ceres, satcorps, clara_a2, patmosdx, cci = \
            read_ts(infilename)

        utils.plot_ts_panel(ax2, [
            patmosx, hirs, misr, modis, calipso, ceres, satcorps, clara_a2,
            patmosdx, cci
        ],
                            "-",
                            "hydrological",
                            loc=LEGEND_LOC,
                            ncol=3)

        ax2.text(0.02,
                 0.9,
                 "(b) Satellite - Actual",
                 transform=ax2.transAxes,
                 fontsize=settings.FONTSIZE)

        #*******************
        # prettify
        ax1.set_ylabel("Anomaly (%)", fontsize=settings.FONTSIZE)
        ax2.set_ylabel("(%)", fontsize=settings.FONTSIZE)

        for tick in ax2.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        minorLocator = MultipleLocator(1)
        for ax in [ax1, ax2]:
            utils.thicken_panel_border(ax)
            ax.set_yticks(ax.get_yticks()[1:])
            ax.xaxis.set_minor_locator(minorLocator)
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

        plt.setp([a.get_xticklabels() for a in fig.axes[:-1]], visible=False)
        fig.subplots_adjust(right=0.96,
                            top=0.99,
                            bottom=0.04,
                            left=0.09,
                            hspace=0.001)

        plt.xlim([hirs.times[0] - 1, hirs.times[-1] + 1])
        ax1.set_ylim([-4.4, 6.9])
        ax2.set_ylim([0, 95])

        plt.savefig(settings.IMAGELOC + "CLD_ts{}".format(settings.OUTFMT))
        plt.close()

    #************************************************************************
    # make a version using the full base period of the data and only the pre2000 datasets
    if False:
        plt.clf()
        fig, (ax1, ax2) = plt.subplots(2, figsize=(8, 6.5), sharex=True)

        # anomalies
        patmosx, hirs, misr, modis, calipso, ceres, satcorps, clara_a2, patmosdx, cci = \
            read_ts(DATALOC + "{}_global_cloudiness_timeseries.txt".format(settings.YEAR), \
                        anomaly=True, fullbase=True)

        utils.plot_ts_panel(ax1, [patmosx, hirs, satcorps, clara_a2, cci],
                            "-",
                            "hydrological",
                            loc="")

        ax1.text(0.02,
                 0.9,
                 "(a) Satellite - Anomalies",
                 transform=ax1.transAxes,
                 fontsize=settings.FONTSIZE)

        # actuals
        patmosx, hirs, misr, modis, calipso, ceres, satcorps, clara_a2, patmosdx, cci = \
            read_ts(DATALOC + "{}_global_cloudiness_timeseries.txt".format(settings.YEAR))

        utils.plot_ts_panel(ax2, [patmosx, hirs, satcorps, clara_a2, cci], "-", "hydrological", \
                                loc=LEGEND_LOC, ncol=3)

        ax2.text(0.02,
                 0.9,
                 "(b) Satellite - Actual",
                 transform=ax2.transAxes,
                 fontsize=settings.FONTSIZE)

        #*******************
        # prettify
        ax1.set_ylabel("Anomaly (%)", fontsize=settings.FONTSIZE)
        ax2.set_ylabel("(%)", fontsize=settings.FONTSIZE)

        for tick in ax2.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        minorLocator = MultipleLocator(1)
        for ax in [ax1, ax2]:
            utils.thicken_panel_border(ax)
            ax.set_yticks(ax.get_yticks()[1:])
            ax.xaxis.set_minor_locator(minorLocator)
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

        plt.setp([a.get_xticklabels() for a in fig.axes[:-1]], visible=False)
        fig.subplots_adjust(right=0.95, top=0.95, hspace=0.001)

        plt.xlim([hirs.times[0] - 1, hirs.times[-1] + 1])
        ax1.set_ylim([-4.9, 4.4])
        ax2.set_ylim([0, 95])

        plt.savefig(settings.IMAGELOC +
                    "CLD_ts_fullbaseperiod{}".format(settings.OUTFMT))
        plt.close()

    #************************************************************************
    # Cloudiness map
    if True:
        mapfile_dict = scipy.io.readsav(
            DATALOC +
            "patmosx_global_monthly_cloudiness_anomaly_map_{}.sav".format(
                settings.YEAR))

        annual_anoms = mapfile_dict["annual_anom"] * 100.
        djf_anoms = mapfile_dict["djf_anom"] * 100.
        jja_anoms = mapfile_dict["jja_anom"] * 100.
        mam_anoms = mapfile_dict["mam_anom"] * 100.
        son_anoms = mapfile_dict["son_anom"] * 100.

        lats = mapfile_dict["lat"]
        lons = mapfile_dict["lon"]

        cube = utils.make_iris_cube_2d(annual_anoms, lats[:, 0], lons[0],
                                       "CLD_anom", "%")

        bounds = [-100, -15, -10, -5, -2.5, 0, 2.5, 5, 10, 15, 100]

        utils.plot_smooth_map_iris(settings.IMAGELOC + "CLD_{}_anoms".format(settings.YEAR), cube, \
                                       settings.COLOURMAP_DICT["hydrological"], bounds, \
                                       "Anomalies from 1981-2010 (%)")
        utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_CLD_{}_anoms".format(settings.YEAR), \
                                       cube, settings.COLOURMAP_DICT["hydrological"], bounds, \
                                       "Anomalies from 1981-2010 (%)", figtext="(n) Cloudiness")

    #************************************************************************
    # Cloudiness Seasonal Map
    if True:
        cubelist = []
        for season in [djf_anoms, mam_anoms, jja_anoms, son_anoms]:

            cube = utils.make_iris_cube_2d(season, lats[:, 0], lons[0],
                                           "CLD_anom", "%")
            cubelist += [cube]


        utils.plot_smooth_map_iris_multipanel(settings.IMAGELOC + "CLD_{}_anoms_seasons".format(settings.YEAR), \
                                                  cubelist, settings.COLOURMAP_DICT["hydrological"], \
                                                  bounds, "Anomaly (%)", shape=(2, 2), \
                                                  title=["DJF", "MAM", "JJA", "SON"], \
                                                  figtext=["(a)", "(b)", "(c)", "(d)"])

    #************************************************************************
    # Cloudiness Hovmoller
    if True:
        data_dict = scipy.io.readsav(
            DATALOC +
            "patmosx_global_monthly_cloudiness_hovmuller_{}.sav".format(
                settings.YEAR))

        lats = data_dict["latitude"]
        times = data_dict["hov_time"]
        anoms = data_dict["hov_anom"] * 100.

        utils.plot_hovmuller(settings.IMAGELOC + "CLD_hovmuller", times, lats,
                             anoms, settings.COLOURMAP_DICT["hydrological"],
                             bounds, "Anomaly (%)")

    return  # run_all_plots
Beispiel #11
0
def run_all_plots():

    if True:
        for index in INDICES:

            # dummy so far
            #        NYEARS = 66
            #        rank_bounds = [-1,1,2,3,NYEARS-2,NYEARS-1,NYEARS,100]
            rank_bounds = [-4.5, -3.5, -2.5, -1.5, 1.5, 2.5, 3.5, 4.5]

            # sort the bounds and colourbars
            if index in ["TX90p", "TN90p"]:
                bounds = [-100, -40, -30, -20, -10, 0, 10, 20, 30, 40, 100]
                cmap = settings.COLOURMAP_DICT["temperature"]
            elif index in ["TX10p", "TN10p"]:
                bounds = [-100, -40, -30, -20, -10, 0, 10, 20, 30, 40, 100]
                cmap = settings.COLOURMAP_DICT["temperature_r"]
            elif index in ["TXx", "TNx", "TXn", "TNn"]:
                bounds = [-100, -6, -4, -2, -1, 0, 1, 2, 4, 6, 100]
                cmap = settings.COLOURMAP_DICT["temperature"]

            cube_list = iris.load(
                DATALOC +
                "GHCND_{}_1951-{}_RegularGrid_global_2.5x2.5deg_LSmask.nc".
                format(index,
                       int(settings.YEAR) + 1))
            names = np.array([cube.name() for cube in cube_list])

            #*************
            # plot annual map

            selected_cube, = np.where(names == "Ann")[0]

            cube = cube_list[selected_cube]
            cube.coord('latitude').guess_bounds()
            cube.coord('longitude').guess_bounds()

            if index in ["TX90p", "TN90p", "TX10p", "TN10p"]:
                # change from % to days
                cube.data = cube.data * 3.65

            cube = ApplyClimatology(cube)

            # select the year to plot
            years = GetYears(cube)
            loc, = np.where(years == SELECTED_YEAR)

            utils.plot_smooth_map_iris(
                settings.IMAGELOC +
                "TEX_{}_{}_anoms_ghcndex".format(index, settings.YEAR),
                cube[loc[0]],
                cmap,
                bounds,
                "Anomalies from 1961-90 ({})".format(INDEX_UNITS[index]),
                title="{} - {}".format(index, INDEX_LABELS[index]),
                figtext=FIGURE_LABELS[index])

            if index == "TX90p":
                utils.plot_smooth_map_iris(
                    settings.IMAGELOC + "p2.1_TEX_{}_{}_anoms_ghcndex".format(
                        index, settings.YEAR),
                    cube[loc[0]],
                    cmap,
                    bounds,
                    "Anomalies from 1961-90 ({})".format(INDEX_UNITS[index]),
                    title="",
                    figtext="(c) Warm Days",
                    save_netcdf_filename="{}{}_for_NOAA_{}.nc".format(
                        DATALOC, index,
                        dt.datetime.strftime(dt.datetime.now(), "%d-%b-%Y")))
            if index == "TN10p":
                utils.plot_smooth_map_iris(
                    settings.IMAGELOC + "p2.1_TEX_{}_{}_anoms_ghcndex".format(
                        index, settings.YEAR),
                    cube[loc[0]],
                    cmap,
                    bounds,
                    "Anomalies from 1961-90 ({})".format(INDEX_UNITS[index]),
                    title="",
                    figtext="(d) Cool Nights",
                    save_netcdf_filename="{}{}_for_NOAA_{}.nc".format(
                        DATALOC, index,
                        dt.datetime.strftime(dt.datetime.now(), "%d-%b-%Y")))

            rank_cube = get_ranks(cube)

            plot_rank_map(
                settings.IMAGELOC +
                "TEX_{}_{}_rank_ghcndex".format(index, settings.YEAR),
                rank_cube[loc[0]],
                cmap,
                rank_bounds,
                "Rank",
                title="{} - {}".format(index, INDEX_LABELS[index]))

            #*************
            # plot season maps (2x2)

            season_list = []
            for season in SEASONS:

                # extract each month
                month_data = []
                months = SEASON_DICT[season]
                for month in months:

                    selected_cube, = np.where(names == month)[0]
                    cube = cube_list[selected_cube]

                    if month == "Dec":
                        # need to extract from previous year - cheat by rolling data around
                        cube.data = np.roll(cube.data, 1, axis=0)
                        cube.data.mask[
                            0, :, :] = True  # and mask out the previous years'

                    if index in ["TX90p", "TN90p", "TX10p", "TN10p"]:
                        # change from % to days
                        cube.data = cube.data * (
                            3.65 / 4.)  # assume a season is 1/4 of a year

                    month_data += [cube.data]

                # finished getting all months, make a dummy cube to populate
                month_data = np.ma.array(month_data)
                season_cube = copy.deepcopy(cube)

                # take appropriate seasonal value
                if index in ["TX90p", "TN90p", "TX10p", "TN10p"]:
                    season_cube.data = np.ma.mean(month_data, axis=0)
                elif index in ["TXx", "TNx"]:
                    season_cube.data = np.ma.max(month_data, axis=0)
                elif index in ["TXn", "TNn"]:
                    season_cube.data = np.ma.min(month_data, axis=0)

                # mask if fewer that 2 months present
                nmonths_locs = np.ma.count(month_data, axis=0)
                season_cube.data = np.ma.masked_where(nmonths_locs < 2,
                                                      season_cube.data)

                # make anomalies
                season_cube = ApplyClimatology(season_cube)

                # fix for plotting
                season_cube.coord('latitude').guess_bounds()
                season_cube.coord('longitude').guess_bounds()

                # select the year to plot
                years = GetYears(cube)
                loc, = np.where(years == SELECTED_YEAR)

                # add to list
                season_list += [season_cube[loc[0]]]

            # sort the bounds and colourbars
            if index in ["TX90p", "TN90p"]:
                bounds = [-100, -10, -7.5, -5, -2.5, 0, 2.5, 5, 7.5, 10, 100]
            elif index in ["TX10p", "TN10p"]:
                bounds = [-100, -10, -7.5, -5, -2.5, 0, 2.5, 5, 7.5, 10, 100]
            elif index in ["TXx", "TNx", "TXn", "TNn"]:
                bounds = [-100, -6, -4, -2, -1, 0, 1, 2, 4, 6, 100]

            # pass to plotting routine
            utils.plot_smooth_map_iris_multipanel(
                settings.IMAGELOC +
                "TEX_{}_{}_seasons_ghcndex".format(index, settings.YEAR),
                season_list,
                cmap,
                bounds,
                "Anomalies from 1961-90 ({})".format(INDEX_UNITS[index]),
                shape=(2, 2),
                title=SEASONS,
                figtext=SEASON_LABELS[index],
                figtitle="{} - {}".format(index, INDEX_LABELS[index]))

    #*************
    # timeseries obs
    if True:
        for index_pair in [["TX90p", "TN10p"], ["TN90p", "TX10p"]]:

            fig, (ax1, ax2) = plt.subplots(2, figsize=(8, 6.5), sharex=True)

            ax3 = ax1.twinx()
            ax4 = ax2.twinx()

            axes = (ax1, ax2, ax3, ax4)

            for ix, index in enumerate(index_pair):

                index_ts, cover_ts = obtain_timeseries(
                    DATALOC +
                    "GHCND_{}_1951-{}_RegularGrid_global_2.5x2.5deg_LSmask.nc".
                    format(index,
                           int(settings.YEAR) + 1), "Ann", "GHCNDEX", index)

                utils.plot_ts_panel(axes[ix], [index_ts],
                                    "-",
                                    "temperature",
                                    loc="",
                                    bbox=BBOX)  # no legend as single line
                axes[ix].text(0.02,
                              0.9,
                              "({}) {}".format(string.ascii_lowercase[ix],
                                               index),
                              transform=axes[ix].transAxes,
                              fontsize=settings.FONTSIZE)

                # red tickmarks
                axes[ix].tick_params(axis='y', colors='red', direction="in")

                # and smoothed
                index_ts.data.fill_value = -99.9
                smoothed = binomialfilter(index_ts.data.filled(),
                                          -99.9,
                                          5,
                                          pad=False)
                smoothed = np.ma.masked_where(smoothed == -99.9, smoothed)

                axes[ix].plot(index_ts.times, smoothed, "r--", lw=LW)

                # print the index, the current anomaly and the rank information
                print(index,
                      index_ts.data.compressed()[-1] / 36.5,
                      np.argsort(np.argsort(index_ts.data.compressed())) + 1)

                axes[ix + 2].plot(cover_ts.times, cover_ts.data, "k:", lw=2)
                axes[ix + 2].yaxis.set_label_position("right")
                axes[ix + 2].yaxis.set_ticks_position('right')

            # prettify
            plt.xlim([1950, int(settings.YEAR) + 1])
            axes[0].set_ylim([15, None])
            if "X" in index:
                axes[1].set_ylim([19, 59])
            elif "N" in index:
                axes[1].set_ylim([11, 59])

            ax3.set_ylim([0, 98])
            ax4.set_ylim([0, 98])

            fig.text(0.03,
                     0.5,
                     "Number of Days",
                     va='center',
                     rotation='vertical',
                     fontsize=settings.FONTSIZE,
                     color="r")
            fig.text(0.97,
                     0.5,
                     "% land covered",
                     va='center',
                     rotation='vertical',
                     fontsize=settings.FONTSIZE)

            for ax in axes:
                for tick in ax.yaxis.get_major_ticks():
                    tick.label.set_fontsize(settings.FONTSIZE)
                    tick.label2.set_fontsize(settings.FONTSIZE)
            for tick in axes[1].xaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

            fig.subplots_adjust(left=0.1,
                                right=0.9,
                                top=0.98,
                                bottom=0.05,
                                hspace=0.001)

            plt.savefig(settings.IMAGELOC + "TEX_{}+{}_ts_ghcndex{}".format(
                index_pair[0], index_pair[1], settings.OUTFMT))
            plt.close()

    # #*************
    # # timeseries ERA-Int

    # for index_pair in [["TX90p", "TN10p"], ["TN90p", "TX10p"]]:

    #     fig, axes = plt.subplots(2, figsize=(8, 6.5), sharex=True)

    #     for ix, index in enumerate(index_pair):

    #         index_ts, cover_ts = obtain_timeseries(DATALOC + "ERA-Int_1979-{}_{}_LSmask.nc".format(settings.YEAR, index), "Annual", "ERA-Interim", index)

    #         utils.plot_ts_panel(axes[ix], [index_ts], "-", "temperature", loc = LEGEND_LOC, bbox = BBOX)

    #         axes[ix].text(0.02, 0.9, "({}) {}".format(string.ascii_lowercase[ix], index), transform = axes[ix].transAxes, fontsize = settings.FONTSIZE)

    #         # and smoothed
    #         index_ts.data.fill_value = -99.9
    #         smoothed = binomialfilter(index_ts.data.filled(), -99.9, 5, pad = False)
    #         smoothed = np.ma.masked_where(smoothed == -99.9, smoothed)

    #         axes[ix].plot(index_ts.times, smoothed, "r--", lw = LW)

    #     # prettify
    #     plt.xlim([1950,2019])
    #     axes[0].set_ylim([15,None])
    #     axes[1].set_ylim([16,59])

    #     fig.text(0.03, 0.5, "Number of Days", va='center', rotation='vertical', fontsize = settings.FONTSIZE)

    #     for ax in axes:
    #         for tick in ax.yaxis.get_major_ticks():
    #             tick.label.set_fontsize(settings.FONTSIZE)
    #     for tick in axes[1].xaxis.get_major_ticks():
    #         tick.label.set_fontsize(settings.FONTSIZE)

    #     fig.subplots_adjust(right = 0.95, top = 0.95, bottom = 0.05, hspace = 0.001)

    #     plt.savefig(settings.IMAGELOC+"TEX_{}+{}_ts_erai{}".format(index_pair[0], index_pair[1], settings.OUTFMT))
    #     plt.close()

    # #*************
    # # ERA-Int Maps (annual only)

    # for index in INDICES:

    #     # sort the bounds and colourbars
    #     if index in ["TX90p", "TN90p"]:
    #         bounds = [-100, -30, -20, -10, -5, 0, 5, 10, 20, 30, 100]
    #         cmap=settings.COLOURMAP_DICT["temperature"]
    #     elif index in ["TX10p", "TN10p"]:
    #         bounds = [-100, -30, -20, -10, -5, 0, 5, 10, 20, 30, 100]
    #         cmap=settings.COLOURMAP_DICT["temperature_r"]
    #     elif index in ["TXx", "TNx", "TXn", "TNn"]:
    #         bounds = [-100, -6, -4, -2, -1, 0, 1, 2, 4, 6, 100]
    #         cmap=settings.COLOURMAP_DICT["temperature"]

    #     cube_list = iris.load(DATALOC + "ERA-Int_1979-{}_{}_LSmask.nc".format(settings.YEAR, index))
    #     names = np.array([cube.name() for cube in cube_list])

    #     #*************
    #     # plot annual map

    #     selected_cube, = np.where(names == "Annual")[0]

    #     cube = cube_list[selected_cube]
    #     cube.coord('latitude').guess_bounds()
    #     cube.coord('longitude').guess_bounds()

    #     if index in ["TX90p", "TN90p", "TX10p", "TN10p"]:
    #         # change from % to days
    #         cube.data = cube.data * 3.65

    #     cube = ApplyClimatology(cube)

    #     # select the year to plot
    #     years = GetYears(cube)
    #     loc, = np.where(years == SELECTED_YEAR)

    #     utils.plot_smooth_map_iris(settings.IMAGELOC + "TEX_{}_{}_anoms_erai".format(index, settings.YEAR), cube[loc[0]], cmap, bounds, "Anomalies from 1981-2010 ({})".format(INDEX_UNITS[index]), title = "ERA-Interim {} - {}".format(index, INDEX_LABELS[index]), figtext = FIGURE_LABELS[index])

    #     #*************
    #     # plot season maps (2x2)

    #     season_list = []
    #     for season in SEASONS:

    #         # extract each month
    #         month_data = []
    #         months = SEASON_DICT_ERA[season]
    #         for month in months:

    #             selected_cube, = np.where(names == month)[0]
    #             cube = cube_list[selected_cube]

    #             if month  == "December":
    #                 # need to extract from previous year - cheat by rolling data around
    #                 cube.data = np.roll(cube.data, 1, axis = 0)
    #                 cube.data.mask[0,:,:] = True # and mask out the previous years'

    #             if index in ["TX90p", "TN90p", "TX10p", "TN10p"]:
    #                 # change from % to days
    #                 cube.data = cube.data * (3.65/4.) # assume a season is 1/4 of a year

    #             month_data += [cube.data]

    #         # finished getting all months, make a dummy cube to populate
    #         month_data = np.ma.array(month_data)
    #         season_cube = copy.deepcopy(cube)

    #         # take appropriate seasonal value
    #         if index in ["TX90p", "TN90p", "TX10p", "TN10p"]:
    #             season_cube.data = np.ma.mean(month_data, axis = 0)
    #         elif index in ["TXx", "TNx"]:
    #             season_cube.data = np.ma.max(month_data, axis = 0)
    #         elif index in ["TXn", "TNn"]:
    #             season_cube.data = np.ma.min(month_data, axis = 0)

    #         # mask if fewer that 2 months present
    #         nmonths_locs = np.ma.count(month_data, axis = 0)
    #         season_cube.data = np.ma.masked_where(nmonths_locs < 2, season_cube.data)

    #         # make anomalies
    #         season_cube = ApplyClimatology(season_cube)

    #         # fix for plotting
    #         season_cube.coord('latitude').guess_bounds()
    #         season_cube.coord('longitude').guess_bounds()

    #         # select the year to plot
    #         years = GetYears(cube)
    #         loc, = np.where(years == SELECTED_YEAR)

    #         # add to list
    #         season_list += [season_cube[loc[0]]]

    #     # sort the bounds and colourbars
    #     if index in ["TX90p", "TN90p"]:
    #         bounds = [-100, -10, -7.5, -5, -2.5, 0, 2.5, 5, 7.5, 10, 100]
    #     elif index in ["TX10p", "TN10p"]:
    #         bounds = [-100, -10, -7.5, -5, -2.5, 0, 2.5, 5, 7.5, 10, 100]
    #     elif index in ["TXx", "TNx", "TXn", "TNn"]:
    #         bounds = [-100, -6, -4, -2, -1, 0, 1, 2, 4, 6, 100]

    #     # pass to plotting routine
    #     utils.plot_smooth_map_iris_multipanel(settings.IMAGELOC + "TEX_{}_{}_seasons_erai".format(index, settings.YEAR), season_list, cmap, bounds, "Anomalies from 1981-2010 ({})".format(INDEX_UNITS[index]), shape = (2,2), title = SEASONS, figtext = SEASON_LABELS[index], figtitle = "{} - {}".format(index, INDEX_LABELS[index]))

    #*************
    # timeseries ERA5
    ERA5LOCTEMP = "/data/users/rdunn/reanalyses/data/era5/v20200409/indices/"
    #    ERA5LOCTEMP = "/scratch/rdunn/reanalyses/era5/final/"
    if True:

        for index_pair in [["TX90p", "TN10p"], ["TN90p", "TX10p"]]:

            fig, axes = plt.subplots(2, figsize=(8, 6.5), sharex=True)

            for ix, index in enumerate(index_pair):

                index_ts, cover_ts = obtain_timeseries(
                    ERA5LOCTEMP +
                    "ERA5_{}_1979-{}.nc".format(index, settings.YEAR),
                    "Ann",
                    "ERA5",
                    index,
                    is_era5=True)

                utils.plot_ts_panel(axes[ix], [index_ts],
                                    "-",
                                    "temperature",
                                    loc=LEGEND_LOC,
                                    bbox=BBOX)

                axes[ix].text(0.02,
                              0.9,
                              "({}) {}".format(string.ascii_lowercase[ix],
                                               index),
                              transform=axes[ix].transAxes,
                              fontsize=settings.FONTSIZE)

                # and smoothed
                index_ts.data.fill_value = -99.9
                smoothed = binomialfilter(index_ts.data.filled(),
                                          -99.9,
                                          5,
                                          pad=False)
                smoothed = np.ma.masked_where(smoothed == -99.9, smoothed)

                axes[ix].plot(index_ts.times, smoothed, "r--", lw=LW)

            # prettify
            plt.xlim([1950, int(settings.YEAR) + 1])
            axes[0].set_ylim([15, None])
            axes[1].set_ylim([16, 59])

            fig.text(0.03,
                     0.5,
                     "Number of Days",
                     va='center',
                     rotation='vertical',
                     fontsize=settings.FONTSIZE)

            for ax in axes:
                for tick in ax.yaxis.get_major_ticks():
                    tick.label.set_fontsize(settings.FONTSIZE)
            for tick in axes[1].xaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

            fig.subplots_adjust(right=0.95,
                                top=0.95,
                                bottom=0.05,
                                hspace=0.001)

            plt.savefig(settings.IMAGELOC + "TEX_{}+{}_ts_era5{}".format(
                index_pair[0], index_pair[1], settings.OUTFMT))
            plt.close()

    #*************
    # ERA Maps (annual only)
    if True:
        for index in INDICES:

            # sort the bounds and colourbars
            if index in ["TX90p", "TN90p"]:
                #                bounds = [-100, -30, -20, -10, -5, 0, 5, 10, 20, 30, 100]
                bounds = [-100, -40, -30, -20, -10, 0, 10, 20, 30, 40, 100]
                cmap = settings.COLOURMAP_DICT["temperature"]
            elif index in ["TX10p", "TN10p"]:
                #                bounds = [-100, -30, -20, -10, -5, 0, 5, 10, 20, 30, 100]
                bounds = [-100, -40, -30, -20, -10, 0, 10, 20, 30, 40, 100]
                cmap = settings.COLOURMAP_DICT["temperature_r"]
            elif index in ["TXx", "TNx", "TXn", "TNn"]:
                bounds = [-100, -6, -4, -2, -1, 0, 1, 2, 4, 6, 100]
                cmap = settings.COLOURMAP_DICT["temperature"]

            cube_list = iris.load(
                ERA5LOCTEMP +
                "ERA5_{}_1979-{}.nc".format(index, settings.YEAR))
            names = np.array([cube.var_name for cube in cube_list])

            #*************
            # plot annual map

            selected_cube, = np.where(names == "Ann")[0]

            cube = cube_list[selected_cube]
            cube.coord('latitude').guess_bounds()
            cube.coord('longitude').guess_bounds()

            if index in ["TX90p", "TN90p", "TX10p", "TN10p"]:
                # change from % to days
                cube.data = cube.data * 3.65

            cube = ApplyClimatology(cube, is_era5=True)

            # select the year to plot
            years = GetYears(cube, is_era5=True)
            loc, = np.where(years == SELECTED_YEAR)

            utils.plot_smooth_map_iris(
                settings.IMAGELOC +
                "TEX_{}_{}_anoms_era5".format(index, settings.YEAR),
                cube[loc[0]],
                cmap,
                bounds,
                "Anomalies from 1981-2010 ({})".format(INDEX_UNITS[index]),
                title="ERA5 {} - {}".format(index, INDEX_LABELS[index]),
                figtext=FIGURE_LABELS[index])

            #*************
            # plot season maps (2x2)

            season_list = []
            for season in SEASONS:

                # extract each month
                month_data = []
                months = SEASON_DICT[season]
                for month in months:

                    selected_cube, = np.where(names == month)[0]
                    cube = cube_list[selected_cube]

                    if month == "December":
                        # need to extract from previous year - cheat by rolling data around
                        cube.data = np.roll(cube.data, 1, axis=0)
                        cube.data.mask[
                            0, :, :] = True  # and mask out the previous years'

                    if index in ["TX90p", "TN90p", "TX10p", "TN10p"]:
                        # change from % to days
                        cube.data = cube.data * (
                            3.65 / 4.)  # assume a season is 1/4 of a year

                    month_data += [cube.data]

                # finished getting all months, make a dummy cube to populate
                month_data = np.ma.array(month_data)
                season_cube = copy.deepcopy(cube)

                # take appropriate seasonal value
                if index in ["TX90p", "TN90p", "TX10p", "TN10p"]:
                    season_cube.data = np.ma.mean(month_data, axis=0)
                elif index in ["TXx", "TNx"]:
                    season_cube.data = np.ma.max(month_data, axis=0)
                elif index in ["TXn", "TNn"]:
                    season_cube.data = np.ma.min(month_data, axis=0)

                # mask if fewer that 2 months present
                nmonths_locs = np.ma.count(month_data, axis=0)
                season_cube.data = np.ma.masked_where(nmonths_locs < 2,
                                                      season_cube.data)

                # make anomalies
                season_cube = ApplyClimatology(season_cube, is_era5=True)

                # fix for plotting
                season_cube.coord('latitude').guess_bounds()
                season_cube.coord('longitude').guess_bounds()

                # select the year to plot
                years = GetYears(cube, is_era5=True)
                loc, = np.where(years == SELECTED_YEAR)

                # add to list
                season_list += [season_cube[loc[0]]]

            # sort the bounds and colourbars
            if index in ["TX90p", "TN90p"]:
                bounds = [-100, -10, -7.5, -5, -2.5, 0, 2.5, 5, 7.5, 10, 100]
            elif index in ["TX10p", "TN10p"]:
                bounds = [-100, -10, -7.5, -5, -2.5, 0, 2.5, 5, 7.5, 10, 100]
            elif index in ["TXx", "TNx", "TXn", "TNn"]:
                bounds = [-100, -6, -4, -2, -1, 0, 1, 2, 4, 6, 100]

            # pass to plotting routine
            utils.plot_smooth_map_iris_multipanel(
                settings.IMAGELOC +
                "TEX_{}_{}_seasons_era5".format(index, settings.YEAR),
                season_list,
                cmap,
                bounds,
                "Anomalies from 1981-2010 ({})".format(INDEX_UNITS[index]),
                shape=(2, 2),
                title=SEASONS,
                figtext=SEASON_LABELS[index],
                figtitle="ERA5 {} - {}".format(index, INDEX_LABELS[index]))

    #*************
    # timeseries obs with uncertainties
    if True:
        for index_pair in [["TX90p", "TN10p"], ["TN90p", "TX10p"]]:

            fig, (ax1, ax2) = plt.subplots(2, figsize=(8, 6.5), sharex=True)

            ax3 = ax1.twinx()
            ax4 = ax2.twinx()

            axes = (ax1, ax2, ax3, ax4)

            for ix, index in enumerate(index_pair):

                index_ts, cover_ts = obtain_timeseries(
                    DATALOC +
                    "GHCND_{}_1951-{}_RegularGrid_global_2.5x2.5deg_LSmask.nc".
                    format(index,
                           int(settings.YEAR) + 1), "Ann", "GHCNDEX", index)

                utils.plot_ts_panel(axes[ix], [index_ts],
                                    "-",
                                    "temperature",
                                    loc="",
                                    bbox=BBOX)  # no legend as single line
                axes[ix].text(0.02,
                              0.9,
                              "({}) {}".format(string.ascii_lowercase[ix],
                                               index),
                              transform=axes[ix].transAxes,
                              fontsize=settings.FONTSIZE)

                # obs cube
                cube_list = iris.load(
                    DATALOC +
                    "GHCND_{}_1951-{}_RegularGrid_global_2.5x2.5deg_LSmask.nc".
                    format(index,
                           int(settings.YEAR) + 1))
                names = np.array([cube.var_name for cube in cube_list])
                selected_cube, = np.where(names == "Ann")[0]

                ghcndex_cube = cube_list[selected_cube]
                ghcndex_cube.coord('latitude').guess_bounds()
                ghcndex_cube.coord('longitude').guess_bounds()
                ghcndex_cube = fix_time_coord(ghcndex_cube)

                if index in ["TX90p", "TN90p", "TX10p", "TN10p"]:
                    # change from % to days
                    ghcndex_cube.data = ghcndex_cube.data * 3.65

                # era5 cube
                cube_list = iris.load(
                    ERA5LOCTEMP +
                    "ERA5_{}_1979-{}.nc".format(index, settings.YEAR))
                names = np.array([cube.var_name for cube in cube_list])
                selected_cube, = np.where(names == "Ann")[0]

                era5_cube = cube_list[selected_cube]
                era5_cube.coord('latitude').guess_bounds()
                era5_cube.coord('longitude').guess_bounds()

                if index in ["TX90p", "TN90p", "TX10p", "TN10p"]:
                    # change from % to days
                    era5_cube.data = era5_cube.data * 3.65

                # need to regrid
                era5_cube = era5_cube.regrid(
                    ghcndex_cube,
                    iris.analysis.Linear(extrapolation_mode="mask"))

                coverage_offset, coverage_stdev = compute_coverage_error(
                    ghcndex_cube, era5_cube)
                coverage_stdev *= 2.  # 90%, 2s.d.
                axes[ix].fill_between(index_ts.times,
                                      index_ts.data - coverage_stdev,
                                      index_ts.data + coverage_stdev,
                                      color='mistyrose',
                                      label="ERA5 coverage uncertainty")

                # red tickmarks
                axes[ix].tick_params(axis='y', colors='red', direction="in")

                # and smoothed
                index_ts.data.fill_value = -99.9
                smoothed = binomialfilter(index_ts.data.filled(),
                                          -99.9,
                                          5,
                                          pad=False)
                smoothed = np.ma.masked_where(smoothed == -99.9, smoothed)

                axes[ix].plot(index_ts.times, smoothed, "r--", lw=LW)

                # print the index, the current anomaly and the rank information
                print(index,
                      index_ts.data.compressed()[-1] / 36.5,
                      np.argsort(np.argsort(index_ts.data.compressed())) + 1)

                axes[ix + 2].plot(cover_ts.times, cover_ts.data, "k:", lw=2)
                axes[ix + 2].yaxis.set_label_position("right")
                axes[ix + 2].yaxis.set_ticks_position('right')

            # prettify
            plt.xlim([1950, int(settings.YEAR) + 1])
            axes[0].set_ylim([15, None])
            if "X" in index:
                axes[1].set_ylim([19, 59])
            elif "N" in index:
                axes[1].set_ylim([11, 59])

            ax3.set_ylim([0, 98])
            ax4.set_ylim([0, 98])

            fig.text(0.03,
                     0.5,
                     "Number of Days",
                     va='center',
                     rotation='vertical',
                     fontsize=settings.FONTSIZE,
                     color="r")
            fig.text(0.97,
                     0.5,
                     "% land covered",
                     va='center',
                     rotation='vertical',
                     fontsize=settings.FONTSIZE)

            for ax in axes:
                for tick in ax.yaxis.get_major_ticks():
                    tick.label.set_fontsize(settings.FONTSIZE)
                    tick.label2.set_fontsize(settings.FONTSIZE)
            for tick in axes[1].xaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

            fig.subplots_adjust(left=0.1,
                                right=0.9,
                                top=0.98,
                                bottom=0.05,
                                hspace=0.001)

            plt.savefig(settings.IMAGELOC +
                        "TEX_{}+{}_ts_ghcndex_uncertainties{}".format(
                            index_pair[0], index_pair[1], settings.OUTFMT))
            plt.close()

    return  # run_all_plots
Beispiel #12
0
def run_all_plots():

    #************************************************************************
    # Timeseries - 2016 version
    if False:
        fig, (ax1, ax2) = plt.subplots(2, figsize=(8, 6.5), sharex=True)

        gfed = read_csv(DATALOC + "timeseries_NAme", "GFED3.1")
        gfas3 = read_csv(DATALOC + "timeseries_NAme", "GFAS1p3")
        gfas0 = read_csv(DATALOC + "timeseries_NAme", "GFAS1p0")

        utils.plot_ts_panel(ax1, [gfed, gfas3, gfas0],
                            "-",
                            "land_surface",
                            loc=LEGEND_LOC)

        ax1.set_ylabel("Tg(C) per month", fontsize=settings.FONTSIZE)
        ax1.set_ylim([0, 100])

        gfed = read_csv(DATALOC + "timeseries_TAsi", "GFED3.1")
        gfas3 = read_csv(DATALOC + "timeseries_TAsi", "GFAS1p3")
        gfas0 = read_csv(DATALOC + "timeseries_TAsi", "GFAS1p0")

        utils.plot_ts_panel(ax2, [gfed, gfas3, gfas0],
                            "-",
                            "land_surface",
                            loc=LEGEND_LOC)

        ax2.set_ylabel("Tg(C) per month", fontsize=settings.FONTSIZE)
        ax2.set_ylim([0, 450])

        # sort formatting
        plt.xlim([1997, 2017])

        for tick in ax2.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for ax in [ax1, ax2]:
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

        # sort labelling
        ax1.text(0.02,
                 0.9,
                 "(a) North America",
                 transform=ax1.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax2.text(0.02,
                 0.9,
                 "(b) Tropical Asia",
                 transform=ax2.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)

        fig.subplots_adjust(right=0.95, top=0.95, hspace=0.001)

        plt.savefig(settings.IMAGELOC + "BOB_ts{}".format(settings.OUTFMT))

        plt.close()

    #************************************************************************
    # Timeseries - 2017, 2018 version
    if True:
        fig = plt.figure(figsize=(8, 5))
        plt.clf()
        ax = plt.axes([0.11, 0.09, 0.88, 0.89])

        gfed = read_gfed_csv(DATALOC + "data4Johannes.txt", "global")
        gfas = read_csv(DATALOC + "timeseries_glob", "GFAS1p4")

        utils.plot_ts_panel(ax, [gfed, gfas],
                            "-",
                            "land_surface",
                            loc=LEGEND_LOC)

        ax.set_ylabel("Tg(C) month" + r'$^{-1}$', fontsize=settings.FONTSIZE)
        ax.set_ylim([0, 840])

        # sort formatting
        plt.xlim([1997, int(settings.YEAR) + 2])

        for tick in ax.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax.yaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        # sort labelling
        ax.text(0.02,
                0.9,
                "Global",
                transform=ax.transAxes,
                fontsize=settings.LABEL_FONTSIZE)

        plt.savefig(settings.IMAGELOC + "BOB_ts{}".format(settings.OUTFMT))
        plt.close()

    #************************************************************************
    # Timeseries - 2019 version
    if True:
        majorLocator = MultipleLocator(5)
        fig, (ax1, ax2, ax3, ax4) = plt.subplots(4,
                                                 figsize=(8, 10),
                                                 sharex=True)

        data = read_csv(DATALOC + "timeseries_TAsi", "GFAS1p4")
        utils.plot_ts_panel(ax1, [data], "-", "land_surface", loc="")
        ax1.text(0.02,
                 0.9,
                 "(a) Tropical Asia",
                 transform=ax1.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax1.set_ylim([0, 160])

        data = read_csv(DATALOC + "timeseries_Arct", "GFAS1p4")
        utils.plot_ts_panel(ax2, [data], "-", "land_surface", loc="")
        ax2.text(0.02,
                 0.9,
                 "(b) Arctic",
                 transform=ax2.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax2.set_ylim([0, 12])

        data = read_csv(DATALOC + "timeseries_SEAu", "GFAS1p4")
        utils.plot_ts_panel(ax3, [data], "-", "land_surface", loc="")
        ax3.text(0.02,
                 0.9,
                 "(c) NSW & Victoria",
                 transform=ax3.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax3.set_ylim([0, 16])

        data = read_csv(DATALOC + "timeseries_SAme", "GFAS1p4")
        utils.plot_ts_panel(ax4, [data], "-", "land_surface", loc="")
        ax4.text(0.02,
                 0.9,
                 "(d) Southern America",
                 transform=ax4.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax4.set_ylim([0, 160])

        # sort formatting
        plt.xlim([2003, int(settings.YEAR) + 2])
        fig.text(0.03,
                 0.5,
                 "Tg(C) per month",
                 fontsize=settings.FONTSIZE,
                 rotation="vertical")
        ax4.xaxis.set_major_locator(majorLocator)
        for tick in ax4.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for ax in [ax1, ax2, ax3, ax4]:
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

        # sort labelling

        fig.subplots_adjust(right=0.96, top=0.98, bottom=0.05, hspace=0.001)

        plt.savefig(settings.IMAGELOC +
                    "BOB_regional_ts{}".format(settings.OUTFMT))

        plt.close()

    #************************************************************************
    # Global Anomalies
    if True:
        #    cube = read_data(DATALOC + "anomaly{}from2003-2015_smooth.txt".format(settings.YEAR), 2.1021584473146504e-05)
        #    cube_list = iris.load(DATALOC + "anomaly{}from2003-{}_coarse20.grb".format(settings.YEAR, int(settings.YEAR)-1))
        cube_list = iris.load(
            DATALOC +
            "anomaly{}from2003-{}_coarse20.grb".format(settings.YEAR, 2010))

        # 2016 - these grib files have 6 identical fields (email from J Kaiser 10/3/2017)
        cube = cube_list[0]
        # convert from kg(C) m-2 s-1 to g(C) m-2 a-1
        print("remove factor 1.14 after 2018 run")
        cube.data = cube.data * 1000 * 60 * 60 * 24 * 365. * GFAS_FACTOR

        bounds = [-1000, -160, -80, -40, -10, -5, 5, 10, 40, 80, 160, 1000]
        bounds = [-1000, -100, -40, -10, -5, -1, 1, 5, 10, 40, 100, 1000]

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "BOB_anomalies{}".format(settings.YEAR), cube,
            settings.COLOURMAP_DICT["land_surface"], bounds,
            "Anomalies from 2003-{} (g C m".format(2010) + r'$^{-2}$' + " yr" +
            r'$^{-1}$' + ")")
        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "p2.1_BOB_anomalies{}".format(settings.YEAR),
            cube,
            settings.COLOURMAP_DICT["land_surface"],
            bounds,
            "Anomalies from 2003-{} (g C m".format(2010) + r'$^{-2}$' + " yr" +
            r'$^{-1}$' + ")",
            figtext="(af) Carbon Emissions from Biomass Burning")

    #************************************************************************
    # Global actuals
    if True:
        #    cube = read_data(DATALOC + "year2016_smooth.txt", 0)
        cube_list = iris.load(DATALOC +
                              "year{}_coarse20.grb".format(settings.YEAR))
        cube = cube_list[0]
        # convert from kg(C) m-2 s-1 to g(C) m-2 a-1
        print("remove factor 1.14 after 2018 run")
        cube.data = cube.data * 1000 * 60 * 60 * 24 * 365. * GFAS_FACTOR

        bounds = [0, 5, 10, 40, 80, 120, 160, 200, 240, 500]
        bounds = [0, 1, 5, 10, 40, 80, 120, 160, 200, 500]

        # adjust to mask out <1 gC/m2/yr (Feb 2018)
        cmap = plt.cm.YlOrBr
        cmaplist = [cmap(i) for i in range(cmap.N)]
        for i in range(30):
            cmaplist[i] = (0.75, 0.75, 0.75, 1.0)
        cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N)

        cube.data = np.ma.masked_where(cube.data < 1, cube.data)

        print("using hard coded sequential colourmap")
        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "BOB_actuals{}".format(settings.YEAR), cube,
            cmap, bounds, "g C m" + r'$^{-2}$' + " yr" + r'$^{-1}$' + "")

    #************************************************************************
    # Global climatology
    if False:
        cube_list = iris.load(DATALOC + "clim2003-2015_smooth.grb")
        cube = cube_list[0]
        # convert from kg(C) m-2 s-1 to g(C) m-2 a-1
        cube.data = cube.data * 1000 * 60 * 60 * 24 * 365.

        bounds = [0, 5, 10, 40, 80, 120, 160, 200, 240, 500]

        print("using hard coded sequential colourmap")
        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "BOB_climatology{}".format(settings.YEAR),
            cube, plt.cm.YlOrBr, bounds,
            "g C m" + r'$^{-2}$' + " yr" + r'$^{-1}$' + "")

    return  # run_all_plots
Beispiel #13
0
#************************************************************************
# Discharge Map

cube_list = iris.load(data_loc + "discharge.{}.nc".format(settings.YEAR))

cube = fix_coords(cube_list[0])

#cube.data = np.ma.masked_where(np.logical_and(cube.data < 20, cube.data > -20), cube.data)
mask = cube.data.mask

bounds = [-10000, -1000, -500, -100, -50, -25, 25, 50, 100, 500, 1000, 10000]

utils.plot_smooth_map_iris(
    image_loc + "RDC_discharge_{}_jra55".format(settings.YEAR), cube[0],
    settings.COLOURMAP_DICT["hydrological"], bounds,
    "Anomalies from 1958-{} (m".format(int(settings.YEAR) - 1) + r'$^{3}$' +
    " s" + r'$^{-1}$' + ")")
utils.plot_smooth_map_iris(
    image_loc + "p2.1_RDC_discharge_{}_jra55".format(settings.YEAR),
    cube[0],
    settings.COLOURMAP_DICT["hydrological"],
    bounds,
    "Anomalies from 1958-{} (m".format(int(settings.YEAR) - 1) + r'$^{3}$' +
    " s" + r'$^{-1}$' + ")",
    figtext="(o) River Discharge")

#************************************************************************
# Runoff Map

cube_list = iris.load(data_loc + "runoff.{}.nc".format(settings.YEAR))
Beispiel #14
0
def run_all_plots():

    #************************************************************************
    # GRACE timeseries
    if True:

        #       model = read_ts(DATALOC + "glb_avg_tws_2003-2018_model.txt", "Model")
        #        model.ls = "--"
        grace = read_ts(DATALOC + "avg_JPLM06v2_land.txt", "GRACE")
        grace_fo = utils.Timeseries("GRACE FO", grace.times[:], grace.data[:])

        # post 2018
        locs, = np.where(grace_fo.times > 2018)
        grace_fo.times = grace_fo.times[locs]
        grace_fo.data = grace_fo.data[locs]

        # pre 2018
        locs, = np.where(grace.times < 2018)
        grace.times = grace.times[locs]
        grace.data = grace.data[locs]

        fig = plt.figure(figsize=(8, 5))

        ax1 = plt.axes([0.1, 0.1, 0.88, 0.88])

        utils.plot_ts_panel(ax1, [grace, grace_fo],
                            "-",
                            "hydrological",
                            loc=LEGEND_LOC)

        #*******************
        # prettify
        ax1.set_ylim([-5.2, 2.3])
        ax1.set_xlim([2003, int(settings.YEAR) + 1.3])
        ax1.set_ylabel("Anomaly (cm)", fontsize=settings.FONTSIZE)

        for tick in ax1.yaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax1.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        plt.savefig(settings.IMAGELOC + "TWS_ts{}".format(settings.OUTFMT))
        plt.close()

    #************************************************************************
    # Hovmuller - Model
    if False:
        times, latitudes, data = read_hovmuller(DATALOC + "zonal_mean_tws.txt")

        bounds = np.array([-200, -12, -9, -6, -3, 0, 3, 6, 9, 12, 200])

        utils.plot_hovmuller(settings.IMAGELOC + "TWS_hovmuller_grace", times,
                             latitudes, data,
                             settings.COLOURMAP_DICT["hydrological"], bounds,
                             "Anomaly (cm)")

    #************************************************************************
    # GRACE Hovmuller
    if True:
        times, latitudes, data = read_hovmuller_2017(DATALOC)

        bounds = np.array([-200, -12, -9, -6, -3, 0, 3, 6, 9, 12, 200])

        utils.plot_hovmuller(settings.IMAGELOC + "TWS_hovmuller_grace", times,
                             latitudes, data.T,
                             settings.COLOURMAP_DICT["hydrological"], bounds,
                             "Anomaly (cm)")

    #************************************************************************
    # Difference Map
    if True:
        cube = read_map_data(
            DATALOC + "tws_changes_{}-{}_2.txt".format(settings.YEAR,
                                                       int(settings.YEAR) - 1))

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "p2.1_TWS_{}_diffs".format(settings.YEAR),
            cube,
            settings.COLOURMAP_DICT["hydrological"],
            bounds,
            "Difference between {} and {} Equivalent Depth of Water (cm)".
            format(settings.YEAR,
                   int(settings.YEAR) - 1),
            figtext="(q) Terrestrial Water Storage")

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "TWS_{}_diffs".format(settings.YEAR), cube,
            settings.COLOURMAP_DICT["hydrological"], bounds,
            "Difference between {} and {} Equivalent Depth of Water (cm)".
            format(settings.YEAR,
                   int(settings.YEAR) - 1))

    return  # run_all_plots
Beispiel #15
0
def run_all_plots():

    #************************************************************************
    # Timeseries
    if True:

        IRdata = read_binary_ts(
            DATALOC +
            "TimeseriesBHRNIR_C7_poids_{}.bin".format(int(settings.YEAR) + 1))
        Vdata = read_binary_ts(
            DATALOC +
            "TimeseriesBHRV_C7_poids_{}.bin".format(int(settings.YEAR) + 1))

        fig, (ax1, ax2) = plt.subplots(2, figsize=(8, 6.5), sharex=True)
        COLOURS = settings.COLOURS["land_surface"]

        for dataset in Vdata:
            print(dataset.name)
            locs, = np.where(dataset.data != 0)
            ls = "--"
            lw = 1
            if dataset.name.split(" ")[-1] == "Smoothed":
                ls = "-"
                lw = 2
            ax1.plot(dataset.times[locs],
                     dataset.data[locs],
                     c=COLOURS[dataset.name],
                     ls=ls,
                     label=dataset.name,
                     lw=lw)

        ax1.axhline(0, c='0.5', ls='--')
        utils.thicken_panel_border(ax1)

        for dataset in IRdata:
            print(dataset.name)
            locs, = np.where(
                dataset.data != 0)  # remove zero bits (mainly for smoothed)
            ls = "--"
            lw = 1
            if dataset.name.split(" ")[-1] == "Smoothed":
                ls = "-"
                lw = 2
            ax2.plot(dataset.times[locs],
                     dataset.data[locs],
                     c=COLOURS[dataset.name],
                     ls=ls,
                     label=dataset.name,
                     lw=lw)

        ax2.legend(loc=LEGEND_LOC,
                   ncol=2,
                   frameon=False,
                   prop={'size': settings.LEGEND_FONTSIZE * 0.8},
                   labelspacing=0.1,
                   columnspacing=0.5)
        ax2.axhline(0, c='0.5', ls='--')
        utils.thicken_panel_border(ax2)

        #*******************
        # prettify

        fig.text(0.01,
                 0.5,
                 "Normalized Anomalies (%)",
                 va='center',
                 rotation='vertical',
                 fontsize=settings.FONTSIZE)

        plt.xlim([2002.5, int(settings.YEAR) + 1.5])
        ax2.set_ylim([-5.8, None])
        for ax in [ax1, ax2]:
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
            ax.xaxis.set_minor_locator(minorLocator)
            ax.set_yticks(ax.get_yticks()[1:-1])
            ax.yaxis.set_ticks_position('left')
        for tick in ax2.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        ax1.text(0.02,
                 0.9,
                 "(a) Visible",
                 transform=ax1.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax2.text(0.02,
                 0.9,
                 "(b) Near Infrared",
                 transform=ax2.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)

        fig.subplots_adjust(right=0.95, top=0.95, bottom=0.05, hspace=0.001)

        plt.savefig(settings.IMAGELOC + "ABD_ts{}".format(settings.OUTFMT))
        plt.close()

    #************************************************************************
    # Hovmullers
    if True:
        IRdata = read_binary(
            DATALOC +
            "HovMullerBHRNIR_C7_{}.bin".format(int(settings.YEAR) + 1))
        Vdata = read_binary(
            DATALOC + "HovMullerBHRV_C7_{}.bin".format(int(settings.YEAR) + 1))

        # reshape - from Readme
        IRdata = IRdata.reshape(360, DURATION)
        Vdata = Vdata.reshape(360, DURATION)

        IRdata = np.ma.masked_where(IRdata <= -100.,
                                    IRdata)  # * 100 # from readme
        Vdata = np.ma.masked_where(Vdata <= -100., Vdata)  # * 100

        lats = np.arange(-90, 90, 0.5)

        # curtail times
        locs, = np.where(times > int(settings.YEAR) + 1)
        IRdata.mask[:, locs] = True
        Vdata.mask[:, locs] = True
        times.mask[locs] = True

        # cant use "cmap.set_bad" for contour as ignored when contouring

        bounds = [-100, -20, -15, -10, -5, -1, 1, 5, 10, 15, 20, 100]
        utils.plot_hovmuller(settings.IMAGELOC + "ABD_NIR_hovmuller",
                             times,
                             lats,
                             IRdata,
                             settings.COLOURMAP_DICT["land_surface_r"],
                             bounds,
                             "Normalized Anomalies (%)",
                             figtext="(b)",
                             background="0.7")
        utils.plot_hovmuller(settings.IMAGELOC + "ABD_V_hovmuller",
                             times,
                             lats,
                             Vdata,
                             settings.COLOURMAP_DICT["land_surface_r"],
                             bounds,
                             "Normalized Anomalies (%)",
                             figtext="(a)",
                             background="0.7")

    #************************************************************************
    # Anomalies
    if True:
        IRdata = read_binary(
            DATALOC + "Annual_BHRNIR_C7_{}.bin".format(int(settings.YEAR) + 1))
        Vdata = read_binary(
            DATALOC + "Annual_BHRV_C7_{}.bin".format(int(settings.YEAR) + 1))

        # reshape - from Readme
        IRdata = IRdata.reshape(360, 720)
        Vdata = Vdata.reshape(360, 720)

        IRdata = np.ma.masked_where(IRdata <= -9999., IRdata)
        Vdata = np.ma.masked_where(Vdata <= -9999., Vdata)

        IRdata = np.ma.masked_where(IRdata == 0., IRdata)
        Vdata = np.ma.masked_where(Vdata == 0., Vdata)

        delta = 0.5
        lons = np.arange(-180 + (delta / 2.), 180, delta)
        lats = np.arange(-90 + (delta / 2.), 90, delta)

        ir_cube = utils.make_iris_cube_2d(IRdata, lats, lons, "IR Albedo", "%")
        v_cube = utils.make_iris_cube_2d(Vdata, lats, lons, "V Albedo", "%")

        bounds = [-100, -20, -15, -10, -5, 0, 5, 10, 15, 20, 100]

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "p2.1_ABD_V_{}".format(settings.YEAR),
            v_cube,
            settings.COLOURMAP_DICT["land_surface_r"],
            bounds,
            "Anomalies from 2003-{} (%)".format(2010),
            figtext="(ac) Land Surface Albedo in the Visible")
        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "ABD_V_{}".format(settings.YEAR), v_cube,
            settings.COLOURMAP_DICT["land_surface_r"], bounds,
            "Anomalies from 2003-{} (%)".format(2010))

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "p2.1_ABD_NIR_{}".format(settings.YEAR),
            ir_cube,
            settings.COLOURMAP_DICT["land_surface_r"],
            bounds,
            "Anomalies from 2003-{} (%)".format(2010),
            figtext="(ad) Land Surface Albedo in the Near Infrared")
        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "ABD_NIR_{}".format(settings.YEAR), ir_cube,
            settings.COLOURMAP_DICT["land_surface_r"], bounds,
            "Anomalies from 2003-{} (%)".format(2010))

    return  # run_all_plots
#***************
# Anomaly Scatter map

bounds = [-8, -2, -1.5, -1.0, -0.5, 0, 0.5, 1.0, 1.5, 2, 8]

lons = np.arange(-90, 120, 30)
lats = np.arange(-180, 210, 30)
dummy = np.ma.zeros((len(lats), len(lons)))
dummy.mask = np.ones(dummy.shape)

cube = utils.make_iris_cube_2d(dummy, lats, lons, "blank", "m")

utils.plot_smooth_map_iris(image_loc + "LKT_anomaly",
                           cube,
                           settings.COLOURMAP_DICT["temperature"],
                           bounds,
                           "Anomaly (" + r"$^{\circ}$" + "C)",
                           scatter=[anomalies[1], anomalies[0], anomalies[2]],
                           figtext="",
                           title="")
utils.plot_smooth_map_iris(image_loc + "p2.1_LKT_anomaly",
                           cube,
                           settings.COLOURMAP_DICT["temperature"],
                           bounds,
                           "Anomaly (" + r"$^{\circ}$" + "C)",
                           scatter=[anomalies[1], anomalies[0], anomalies[2]],
                           figtext="(b) Lake Temperatures",
                           title="")

#************************************************************************
#   END
#************************************************************************
Beispiel #17
0
def run_all_plots(download=False):

    if download:
        # download if required

        # AAO
        http("https://www.esrl.noaa.gov/", "psd/data/correlation", "aao.data", DATALOC, diagnostics=True)
        http("https://www.cpc.ncep.noaa.gov", "products/precip/CWlink/daily_ao_index/aao", "monthly.aao.index.b79.current.ascii", DATALOC, diagnostics=True)
        # AO
        http("https://www.cpc.ncep.noaa.gov", "products/precip/CWlink/daily_ao_index", "monthly.ao.index.b50.current.ascii", DATALOC, diagnostics=True)
        # NAO
        http("https://climatedataguide.ucar.edu", "sites/default/files", "nao_station_seasonal.txt", DATALOC, diagnostics=True)
        print("HadSLP2r & SOI likely to fail")
        # HadSLP2r
        http("http://www.metoffice.gov.uk", "hadobs/hadslp2/data", "hadslp2r.asc.gz", DATALOC, diagnostics=True)
        # SOI 
        doftp("ftp://ftp.bom.gov.au", "/anon/home/ncc/www/sco/soi/", "soiplaintext.html", DATALOC, diagnostics=True)

        print("Now check downloads")
        sys.exit()
    #************************************************************************
    # Timeseries figures - winter NAO
    #   initial run usually only Dec + Jan for recent year
    if True:
        # tried minor locator

        YEARS = ["2017", "2018", "2019"]
        plot_data, smoothed_data = read_winter_nao(DATALOC, YEARS)

        fig, (ax1, ax2, ax3) = plt.subplots(3, figsize=(8, 6.5))

        TEXTS = ["(d)", "(e)", "(f)"]
        for a, ax in enumerate([ax1, ax2, ax3]):
            year = int(YEARS[a])

            plt_bars(ax, plot_data[a], TEXTS[a], w=1, invert=False)
            utils.thicken_panel_border(ax)
            ax.xaxis.set_ticks([dt.datetime(year, 12, 1), dt.datetime(year+1, 1, 1), dt.datetime(year+1, 2, 1), dt.datetime(year+1, 3, 1)])

            ax.plot(plot_data[a].times+dt.timedelta(hours=12), smoothed_data[a], "k-", lw=LW)
            ax.set_xlim([dt.datetime(year, 11, 29), dt.datetime(year+1, 2, 1) + dt.timedelta(days=30)])

        ax3.xaxis.set_ticklabels(["Dec", "Jan", "Feb", "Mar"], fontsize=settings.FONTSIZE)
        ax2.set_ylabel("Winter NAO Index (hPa)", fontsize=settings.FONTSIZE)

        fig.subplots_adjust(right=0.98, top=0.98, bottom=0.05, hspace=0.001)
        plt.setp([a.get_xticklabels() for a in fig.axes[:-1]], visible=False)

        for ax in [ax1, ax2, ax3]:
            ax.set_ylim([-69, 99])
            ax.yaxis.set_ticks_position('left')

            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

        plt.savefig(settings.IMAGELOC+"SLP_ts_winter_nao{}".format(settings.OUTFMT))
        plt.close()

    #************************************************************************
    # Timeseries figures - different indices
    if True:
        SOI = read_soi(DATALOC + "soiplaintext.html")
        AO = read_a_ao(DATALOC + "monthly.ao.index.b50.current.ascii", "AO", 3)
        AAO = read_a_ao(DATALOC + "monthly.aao.index.b79.current.ascii", "AAO", 5)
    #    SNAO = read_snao(DATALOC + "JA STANDARDISED SNAO.txt") # from Chris Folland - unavailable in 2019
        NAO = read_nao(DATALOC + "nao_station_seasonal.txt")

        fig = plt.figure(figsize=(8, 6))

        # manually set up the 10 axes
        w = 0.42
        h = 0.23
        c = 0.51
        ax1 = plt.axes([c-w, 0.99-h, w, h])
        ax2 = plt.axes([c, 0.99-h, w, h])
        ax3 = plt.axes([c-w, 0.99-(2*h), w, h], sharex=ax1)
        ax4 = plt.axes([c, 0.99-(2*h), w, h], sharex=ax2)
        ax5 = plt.axes([c-w, 0.99-(3*h), w, h], sharex=ax1)
        ax6 = plt.axes([c, 0.99-(3*h), w, h], sharex=ax2)
        ax7 = plt.axes([c-w, 0.99-(4*h), w, h], sharex=ax1)
        ax8 = plt.axes([c, 0.99-(4*h), w, h], sharex=ax2)
    #    ax9 = plt.axes([c-w, 0.99-(5*h), w, h], sharex=ax1)
    #    ax10= plt.axes([c, 0.99-(5*h), w, h], sharex=ax2)

        plt_bars(ax1, SOI, "(a)", w=1./12, invert=True)
        plt_bars(ax3, AO, "(c)", w=1./12)
        plt_bars(ax5, AAO, "(e)", w=1./12)
        plt_bars(ax7, NAO, "(g)", w=1.)
    #    plt_bars(ax9, SNAO, "(i)", w=1.)

        ax1.set_xlim([1860, int(settings.YEAR)+1])

        plt_bars(ax2, SOI, "(b)", w=1./12, invert=True)
        plt_bars(ax4, AO, "(d)", w=1./12)
        plt_bars(ax6, AAO, "(f)", w=1./12)
        plt_bars(ax8, NAO, "(h)", w=0.9)
    #    plt_bars(ax10, SNAO, "(j)", w=0.9)

        ax2.set_xlim([2006, int(settings.YEAR)+2])
        for ax in [ax2, ax4, ax6, ax8]:#, ax10]:
            ax.yaxis.tick_right()

        # prettify
        for ax in [ax1, ax3, ax5, ax7]:#, ax9]:
            for tick in ax.xaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
            utils.thicken_panel_border(ax)
            ax.yaxis.set_ticks_position('left')

        for ax in [ax2, ax4, ax6, ax8]:#, ax10]:
            for tick in ax.xaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
            ax.yaxis.tick_right()
            for tick in ax.yaxis.get_major_ticks():
                tick.label2.set_fontsize(settings.FONTSIZE)
            utils.thicken_panel_border(ax)

        plt.setp([a.get_xticklabels() for a in fig.axes[:-2]], visible=False)

        ax1.xaxis.set_ticks([1880, 1920, 1960, 2000])
        ax2.xaxis.set_ticks([2007, 2010, 2013, 2016, 2019])
        ax1.yaxis.set_ticks([-40, 0, 40])
        ax2.yaxis.set_ticks([-40, 0, 40])
        ax3.yaxis.set_ticks([-4, 0, 4])
        ax4.yaxis.set_ticks([-4, 0, 4])
        ax5.yaxis.set_ticks([-2, 0, 2])
        ax6.yaxis.set_ticks([-2, 0, 2])
        ax7.yaxis.set_ticks([-4, 0, 4])
        ax8.yaxis.set_ticks([-4, 0, 4])
    #    ax9.yaxis.set_ticks([-2, 0, 2])
    #    ax10.yaxis.set_ticks([-2, 0, 2])

        minorLocator = MultipleLocator(1)
        ax2.xaxis.set_minor_locator(minorLocator)

        ax1.set_ylim([-40, 45])
        ax2.set_ylim([-40, 45])
        ax3.set_ylim([-4.5, 4.9])
        ax4.set_ylim([-4.5, 4.9])

        ax5.set_ylabel("Standard Units", fontsize=settings.FONTSIZE)

        plt.savefig(settings.IMAGELOC+"SLP_ts{}".format(settings.OUTFMT))

        plt.close()

    #************************************************************************
    # Global map
    if True:
        cube = read_hadslp(DATALOC + "hadslp2r.asc")

        # restrict to 1900 to last full year
        date_constraint = utils.periodConstraint(cube, dt.datetime(1900, 1, 1), dt.datetime(int(settings.YEAR)+1, 1, 1)) 
        cube = cube.extract(date_constraint)

        # convert to 1981-2010 climatology.
        clim_constraint = utils.periodConstraint(cube, dt.datetime(1981, 1, 1), dt.datetime(2011, 1, 1)) 
        clim_cube = cube.extract(clim_constraint)

        clim_data = clim_cube.data.reshape(-1, 12, clim_cube.data.shape[-2], clim_cube.data.shape[-1])

        # more than 15 years present
        climatology = np.ma.mean(clim_data, axis=0)
        nyears = np.ma.count(clim_data, axis=0)
        climatology = np.ma.masked_where(nyears <= 15, climatology) # Kate keeps GT 15.


        # extract final year
        final_year_constraint = utils.periodConstraint(cube, dt.datetime(int(settings.YEAR), 1, 1), dt.datetime(int(settings.YEAR)+1, 1, 1)) 
        final_year_cube = cube.extract(final_year_constraint)

        final_year_cube.data = final_year_cube.data - climatology

        # more than 6 months present
        annual_cube = final_year_cube.collapsed(['time'], iris.analysis.MEAN)
        nmonths = np.ma.count(final_year_cube.data, axis=0)
        annual_cube.data = np.ma.masked_where(nmonths <= 6, annual_cube.data)

        bounds = [-100, -8, -4, -2, -1, 0, 1, 2, 4, 8, 100]

        utils.plot_smooth_map_iris(settings.IMAGELOC + "SLP_{}_anoms_hadslp".format(settings.YEAR), annual_cube, settings.COLOURMAP_DICT["circulation"], bounds, "Anomalies from 1981-2010 (hPa)")
        utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_SLP_{}_anoms_hadslp".format(settings.YEAR), annual_cube, settings.COLOURMAP_DICT["circulation"], bounds, "Anomalies from 1981-2010 (hPa)", figtext="(u) Sea Level Pressure")

        plt.close()

        del annual_cube
        del final_year_cube
        gc.collect()

    #************************************************************************
    # Polar Figures (1x3)
    if True:
        # apply climatology - incomplete end year, so repeat climatology and then trunkate
        climatology = np.tile(climatology, ((cube.data.shape[0]//12)+1, 1, 1))
        anoms = iris.cube.Cube.copy(cube)

        anoms.data = anoms.data - climatology[0:anoms.data.shape[0], :, :]

        bounds = [-100, -8, -4, -2, -1, -0.5, 0.5, 1, 2, 4, 8, 100]

        # set up a 1 x 3 set of axes
        fig = plt.figure(figsize=(4, 9.5))
        plt.clf()

        # set up plot settings
        cmap = settings.COLOURMAP_DICT["circulation"]
        norm = mpl.cm.colors.BoundaryNorm(bounds, cmap.N)
        PLOTYEARS = [2017, 2018, 2019]
        PLOTLABELS = ["(a) 2017/18", "(b) 2018/19", "(c) 2019/20"]

        # boundary circle
        theta = np.linspace(0, 2*np.pi, 100)
        center, radius = [0.5, 0.5], 0.5
        verts = np.vstack([np.sin(theta), np.cos(theta)]).T
        circle = mpath.Path(verts * radius + center)


        # spin through axes
        for a in range(3):  

            ax = plt.subplot(3, 1, a+1, projection=cartopy.crs.NorthPolarStereo())

            plot_cube = iris.cube.Cube.copy(anoms)

            # extract 3 winter months
            date_constraint = utils.periodConstraint(anoms, dt.datetime(PLOTYEARS[a], 12, 1), dt.datetime(PLOTYEARS[a]+1, 3, 1)) 
            plot_cube = plot_cube.extract(date_constraint)

            # plot down to (almost) equator
            lat_constraint = utils.latConstraint([3, 80]) 
            plot_cube = plot_cube.extract(lat_constraint)

            # take the mean
            try:
                plot_cube = plot_cube.collapsed(['time'], iris.analysis.MEAN)
            except iris.exceptions.CoordinateCollapseError:
                pass

            ax.gridlines() #draw_labels=True)
            ax.add_feature(cartopy.feature.LAND, zorder=0, facecolor="0.9", edgecolor="k")
            ax.coastlines()
            ax.set_boundary(circle, transform=ax.transAxes)
            ax.set_extent([-180, 180, 0, 90], cartopy.crs.PlateCarree())

            ext = ax.get_extent() # save the original extent

            mesh = iris.plot.pcolormesh(plot_cube, cmap=cmap, norm=norm, axes=ax)

            ax.set_extent(ext, ax.projection) # fix the extent change from colormesh
            ax.text(0.0, 1.02, PLOTLABELS[a], fontsize=settings.FONTSIZE, transform=ax.transAxes)

        # add a colourbar for the figure
        cbar_ax = fig.add_axes([0.77, 0.07, 0.04, 0.9])
        cb = plt.colorbar(mesh, cax=cbar_ax, orientation='vertical', ticks=bounds[1:-1], drawedges=True)
        cb.ax.tick_params(axis='y', labelsize=settings.FONTSIZE, direction='in', size=0)
        cb.set_label(label="Anomaly (hPa)", fontsize=settings.FONTSIZE)

        # prettify
        cb.set_ticklabels(["{:g}".format(b) for b in bounds[1:-1]])
        cb.outline.set_linewidth(2)
        cb.dividers.set_color('k')
        cb.dividers.set_linewidth(2)


        fig.subplots_adjust(bottom=0.01, top=0.97, left=0.01, right=0.8, wspace=0.02)

        plt.title("")
        fig.text(0.03, 0.95, "", fontsize=settings.FONTSIZE * 0.8)

        plt.savefig(settings.IMAGELOC + "SLP_polar{}".format(settings.OUTFMT))
        plt.close()

        del plot_cube
        del climatology
        gc.collect()

        #************************************************************************
        # SNAO figures
        if False:
            date_constraint = utils.periodConstraint(anoms, dt.datetime(int(settings.YEAR), 7, 1), dt.datetime(int(settings.YEAR), 9, 1)) 
            ja_cube = anoms.extract(date_constraint)
            ja_cube = ja_cube.collapsed(['time'], iris.analysis.MEAN)

            bounds = [-100, -4, -3, -2, -1, 0, 1, 2, 3, 4, 100]
            cmap = settings.COLOURMAP_DICT["circulation"]
            norm = mpl.cm.colors.BoundaryNorm(bounds, cmap.N)
            PLOTLABEL = "(a) July - August"

            fig = plt.figure(figsize=(8, 10))
            plt.clf()
            # make axes by hand
            axes = ([0.05, 0.45, 0.9, 0.55], [0.1, 0.05, 0.88, 0.35])

            ax = plt.axes(axes[0], projection=cartopy.crs.Robinson())

            ax.gridlines() #draw_labels=True)
            ax.add_feature(cartopy.feature.LAND, zorder=0, facecolor="0.9", edgecolor="k")
            ax.coastlines()

            mesh = iris.plot.pcolormesh(ja_cube, cmap=cmap, norm=norm, axes=ax)

            ax.text(-0.05, 1.05, PLOTLABEL, fontsize=settings.FONTSIZE * 0.8, transform=ax.transAxes)

            # colorbar
            cb = plt.colorbar(mesh, orientation='horizontal', ticks=bounds[1:-1], label="Anomaly (hPa)", drawedges=True, pad=0.05)

            # prettify
            cb.set_ticklabels(["{:g}".format(b) for b in bounds[1:-1]])
            cb.outline.set_linewidth(2)
            cb.dividers.set_color('k')
            cb.dividers.set_linewidth(2)

            # and the timeseries
            ax = plt.axes(axes[1])

            snao = np.genfromtxt(DATALOC+"{} DAILY SNAO.txt".format(settings.YEAR), dtype=(float))

            data = snao[:, 1]
            times = np.array([dt.datetime(int(settings.YEAR), 7, 1) + dt.timedelta(days=i) for i in range(len(data))])

            SNAO = utils.Timeseries("Summer NAO Index", times, data)

            plt_bars(ax, SNAO, "", w=0.7, label=False)
            ax.text(-0.1, 1.05, "(b) Summer NAO Index", fontsize=settings.FONTSIZE * 0.8, transform=ax.transAxes)
            ax.yaxis.set_label("Summer NAO Index")
            # label every 14 days
            ticks = [dt.datetime(int(settings.YEAR), 7, 1) + dt.timedelta(days=i) for i in range(0, len(data), 14)]
            ax.xaxis.set_ticks(ticks)
            ax.xaxis.set_ticklabels([dt.datetime.strftime(t, "%d %b %Y") for t in ticks])
            minorLocator = MultipleLocator(1)
            ax.xaxis.set_minor_locator(minorLocator)

            utils.thicken_panel_border(ax3)

            plt.savefig(settings.IMAGELOC + "SLP_SNAO{}".format(settings.OUTFMT))
            plt.close()

            del ja_cube
            gc.collect()

        #************************************************************************
        # EU figure
        if False:
            contour = True

            date_constraint = utils.periodConstraint(anoms, dt.datetime(int(settings.YEAR), 7, 1), dt.datetime(int(settings.YEAR), 8, 1)) 
            jul_cube = anoms.extract(date_constraint)
            date_constraint = utils.periodConstraint(anoms, dt.datetime(int(settings.YEAR), 8, 1), dt.datetime(int(settings.YEAR), 9, 1)) 
            aug_cube = anoms.extract(date_constraint)

            bounds = [-100, -4, -3, -2, -1, 0, 1, 2, 3, 4, 100]
            cmap = settings.COLOURMAP_DICT["circulation"]
            norm = mpl.cm.colors.BoundaryNorm(bounds, cmap.N)
            PLOTLABELS = ["(a) July", "(b) August"]

            fig = plt.figure(figsize=(8, 14))
            plt.clf()
            # make axes by hand
            axes = ([0.1, 0.65, 0.8, 0.3], [0.1, 0.35, 0.8, 0.3], [0.1, 0.05, 0.8, 0.25])

            cube_list = [jul_cube, aug_cube]
            for a in range(2):
                ax = plt.axes(axes[a], projection=cartopy.crs.PlateCarree(central_longitude=-10))

                ax.gridlines() #draw_labels=True)
                ax.add_feature(cartopy.feature.LAND, zorder=0, facecolor="0.9", edgecolor="k")
                ax.coastlines()
                ax.set_extent([-70, 40, 30, 80], cartopy.crs.PlateCarree())

                if contour:
                    from scipy.ndimage.filters import gaussian_filter
                    sigma = 0.5
                    cube = cube_list[a]

                    cube.data = gaussian_filter(cube.data, sigma)
                    mesh = iris.plot.contourf(cube, bounds, cmap=cmap, norm=norm, axes=ax)

                else:
                    mesh = iris.plot.pcolormesh(cube_list[a], cmap=cmap, norm=norm, axes=ax)

                ax.text(-0.05, 1.05, PLOTLABELS[a], fontsize=settings.FONTSIZE * 0.8, transform=ax.transAxes)

            # colorbar
            cb = plt.colorbar(mesh, orientation='horizontal', ticks=bounds[1:-1], label="Anomaly (hPa)", drawedges=True)

            # prettify
            cb.set_ticklabels(["{:g}".format(b) for b in bounds[1:-1]])
            cb.outline.set_linewidth(2)
            cb.dividers.set_color('k')
            cb.dividers.set_linewidth(2)

            # and the timeseries
            ax3 = plt.axes(axes[2])

            snao = np.genfromtxt(DATALOC+"{} DAILY SNAO.txt".format(settings.YEAR), dtype=(float))

            data = snao[:, 1]
            times = np.array([dt.datetime(int(settings.YEAR), 7, 1) + dt.timedelta(days=i) for i in range(len(data))])

            SNAO = utils.Timeseries("Summer NAO Index", times, data)

            plt_bars(ax3, SNAO, "", w=0.7, label=False)
            ax3.text(-0.05, 1.05, "(c) Summer NAO Index", fontsize=settings.FONTSIZE * 0.8, transform=ax3.transAxes)
            ax3.yaxis.set_label("Summer NAO Index")
            # label every 14 days
            ticks = [dt.datetime(int(settings.YEAR), 7, 1) + dt.timedelta(days=i) for i in range(0, len(data), 14)]
            ax3.xaxis.set_ticks(ticks)
            ax3.xaxis.set_ticklabels([dt.datetime.strftime(t, "%d %b %Y") for t in ticks])
            minorLocator = MultipleLocator(1)
            ax3.xaxis.set_minor_locator(minorLocator)
            ax3.yaxis.set_ticks_position('left')

            utils.thicken_panel_border(ax3)

            plt.savefig(settings.IMAGELOC + "SLP_NAtlantic{}".format(settings.OUTFMT))
            plt.close()

            del cube
            del anoms
            gc.collect()


    return # run_all_plots
Beispiel #18
0
def run_all_plots():

    #************************************************************************
    # Timeseries
    if True:

        cube_list = np.array(
            iris.load(DATALOC +
                      "ESA_CCI_SM_COMBINED_monthAnomaliesPerHemisphere.nc"))

        names = np.array([c.var_name for c in cube_list])

        north_obs = cube_list[names == "nObs_north"][0]
        south_obs = cube_list[names == "nObs_south"][0]
        glob_obs = cube_list[names == "nObs_global"][0]
        north = cube_list[names == "Anomalies_north"][0]
        south = cube_list[names == "Anomalies_south"][0]
        glob = cube_list[names == "Anomalies_global"][0]

        # as date in days-from - let Iris do the heavy lifting and do this one manually

        fig = plt.figure(figsize=(8, 6))
        ax1 = plt.axes([0.14, 0.2, 0.84, 0.79])

        iris.plot.plot(south, 'b', label="S. Hemisphere", lw=LW)
        iris.plot.plot(north, "0.5", label="N. Hemisphere", lw=LW)
        iris.plot.plot(glob, "k", label="Global", lw=LW)
        ax1.text(0.02,
                 0.9,
                 "ESA CCI SM",
                 transform=ax1.transAxes,
                 fontsize=settings.FONTSIZE)

        # number of observations
        ax2 = plt.axes([0.14, 0.07, 0.84, 0.13], sharex=ax1)

        south_obs.data = 100 * south_obs.data / 244243.
        north_obs.data = 100 * north_obs.data / 244243.
        glob_obs.data = 100 * glob_obs.data / 244243.

        iris.plot.plot(south_obs, 'b', lw=LW)
        iris.plot.plot(north_obs, "0.5", lw=LW)
        iris.plot.plot(glob_obs, "k", lw=LW)

        #*******************
        # prettify
        ax1.set_ylim([-0.021, 0.021])
        ax1.set_ylabel("Anomaly (m" + r'$^{3}$' + "m" + r'$^{-3}$' + ")",
                       fontsize=settings.FONTSIZE)
        ax1.axhline(0, c='0.5', ls='--')

        ax1.set_yticks([-0.02, -0.01, 0, 0.01, 0.02])

        ax2.set_ylim([0, 100])
        ax2.set_ylabel("% \n obs.", fontsize=settings.FONTSIZE)
        ax2.set_yticks([0, 25, 50, 75])

        for tick in ax2.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for ax in [ax1, ax2]:
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
            ax.yaxis.set_ticks_position('left')

        ax1.legend(loc=LEGEND_LOC,
                   ncol=1,
                   frameon=False,
                   prop={'size': settings.LEGEND_FONTSIZE},
                   labelspacing=0.1,
                   columnspacing=0.5)

        utils.thicken_panel_border(ax1)
        utils.thicken_panel_border(ax2)

        minorLocator = MultipleLocator(365.242199)  # in days since
        ax1.xaxis.set_minor_locator(minorLocator)

        lims = ax1.get_xlim()
        ax1.set_xlim([lims[0] - 100, lims[1] + 100])
        #    ax2.set_xticklabels("")

        plt.savefig(settings.IMAGELOC +
                    "SMS_ts_esa_cci{}".format(settings.OUTFMT))
        plt.close()

    #************************************************************************
    # Annual Map
    if True:
        cube_list = iris.load(DATALOC +
                              "ESA_CCI_SM_COMBINED_anomalyMaps_yearly.nc")

        cube = cube_list[0]
        cube.coord('latitude').guess_bounds()
        cube.coord('longitude').guess_bounds()

        bounds = [
            -100, -0.04, -0.03, -0.02, -0.01, 0, 0.01, 0.02, 0.03, 0.04, 100
        ]

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "SMS_{}_esa_cci".format(settings.YEAR),
            cube[-1], settings.COLOURMAP_DICT["hydrological"], bounds,
            "Anomalies from 1991-2010 (m" + r'$^{3}$' + "m" + r'$^{-3}$' + ")")

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "p2.1_SMS_{}_esa_cci".format(settings.YEAR),
            cube[-1],
            settings.COLOURMAP_DICT["hydrological"],
            bounds,
            "Anomalies from 1991-2010 (m" + r'$^{3}$' + "m" + r'$^{-3}$' + ")",
            figtext="(r) Soil Moisture")

    #************************************************************************
    # Seasonal Map
    if True:

        cube_list = iris.load(DATALOC +
                              "ESA_CCI_SM_COMBINED_anomalyMaps_monthly.nc")

        cube = cube_list[0]
        cube.coord('latitude').guess_bounds()
        cube.coord('longitude').guess_bounds()

        month_list = [cube[i] for i in range(-12, 0, 1)]

        utils.plot_smooth_map_iris_multipanel(
            settings.IMAGELOC + "SMS_{}_anoms_seasons".format(settings.YEAR),
            month_list,
            settings.COLOURMAP_DICT["hydrological"],
            bounds,
            "Anomaly (m" + r'$^{3}$' + "m" + r'$^{-3}$' + ")",
            shape=(6, 2),
            title=MONTHS,
            figtext=[
                "(a)", "(b)", "(c)", "(d)", "(e)", "(f)", "(g)", "(h)", "(i)",
                "(j)", "(k)", "(l)"
            ])

    #************************************************************************
    # Hovmuller
    if True:

        cube_list = iris.load(
            DATALOC + "ESA_CCI_SM_COMBINED_anomaly_hovmoeller_diagram.nc")

        for cube in cube_list:
            if cube.name() == "hovmoeller": break

        print("issues with masking in 2018 - remove and reset")

        data = cube.data[:]
        data.mask = np.zeros(data.shape)

        data = np.ma.masked_where(data == data.fill_value, data)
        cube.data = data

        # to here

        latitudes = cube.coord("latitude").points
        anoms = cube.data * 0.01  # added for offset in 2017 report

        bounds = [
            -100, -0.04, -0.03, -0.02, -0.01, 0, 0.01, 0.02, 0.03, 0.04, 100
        ]

        # extract the time data
        timeUnits = cube.coord("time").units
        dt_time = timeUnits.num2date(cube.coord("time").points)

        times = np.array([(date.year + (date.month - 1) / 12.)
                          for date in dt_time])

        utils.plot_hovmuller(settings.IMAGELOC + "SMS_hovmuller", times,
                             latitudes, anoms,
                             settings.COLOURMAP_DICT["hydrological"], bounds,
                             "Anomaly (m" + r'$^{3}$' + "m" + r'$^{-3}$' + ")")

    return  # run_all_plots
Beispiel #19
0
def run_all_plots():

    #************************************************************************
    # Upper Tropospheric Humidity timeseries figure
    if True:
        HIRSSTART = 1979
        MWSTART = 1999
        ERASTART = 1979

        # smooth by 3 months
        hirs = read_ts(DATALOC + "hirs_data.aa", HIRSSTART, "HIRS", smooth=3)
        mw = read_ts(DATALOC + "mw_data.aa", MWSTART, "Microwave", smooth=3)
        era5 = read_ts(DATALOC + "era5_data.aa", ERASTART, "ERA5", smooth=3)

        fig = plt.figure(figsize=(8, 5))
        ax = plt.axes([0.11, 0.08, 0.86, 0.90])

        utils.plot_ts_panel(ax, [hirs, mw, era5],
                            "-",
                            "hydrological",
                            loc=LEGEND_LOC,
                            ncol=3)

        #*******************
        # prettify

        fig.text(0.01,
                 0.5,
                 "Anomalies (% rh)",
                 va='center',
                 rotation='vertical',
                 fontsize=settings.FONTSIZE)

        plt.ylim([-2.0, 2.0])
        plt.xlim([1979, int(settings.YEAR) + 1.5])

        for tick in ax.yaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        plt.savefig(settings.IMAGELOC + "UTH_ts{}".format(settings.OUTFMT))
        plt.close()

    #************************************************************************
    # HIRS map
    if True:
        cube = read_map(DATALOC, "hirs")

        bounds = [-100, -4, -2, -1, -0.5, 0, 0.5, 1, 2, 4, 100]

        #    utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_UTH_{}_anoms_hirs".format(settings.YEAR), cube, settings.COLOURMAP_DICT["hydrological"], bounds, "Anomalies from 2001-2010 (% rh)", figtext = "(n) Upper Tropospheric Humidity")
        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "UTH_{}_anoms_hirs".format(settings.YEAR),
            cube, settings.COLOURMAP_DICT["hydrological"], bounds,
            "Anomalies from 2001-2010 (% rh)")

    #************************************************************************
    # MW map
    if True:
        cube = read_map(DATALOC, "mw")

        bounds = [-100, -4, -2, -1, -0.5, 0, 0.5, 1, 2, 4, 100]

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "UTH_{}_anoms_mw".format(settings.YEAR), cube,
            settings.COLOURMAP_DICT["hydrological"], bounds,
            "Anomalies from 2001-2010 (% rh)")
        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "p2.1_UTH_{}_anoms_mw".format(settings.YEAR),
            cube,
            settings.COLOURMAP_DICT["hydrological"],
            bounds,
            "Anomalies from 2001-2010 (% rh)",
            figtext="(j) Upper Tropospheric Humidity")

    return  # run_all_plots
Beispiel #20
0
seasonal_list = []

cube_list = iris.load(data_loc +
                      "TCCO_ANO_YEAR_JAS_mean_{}.nc".format(settings.YEAR))
names = np.array([cube.var_name for cube in cube_list])

selected_cube, = np.where(names == "tcco_ano")

cube = cube_list[selected_cube[0]]
cube.coord('latitude').guess_bounds()
cube.coord('longitude').guess_bounds()

bounds = [-100, -20, -15, -10, -5, 0, 5, 10, 15, 20, 100]

utils.plot_smooth_map_iris(
    image_loc + "CMO_{}_anoms".format(settings.YEAR), cube,
    settings.COLOURMAP_DICT["composition"], bounds,
    "Anomalies from 2003-{} (%)".format(settings.YEAR[2:]))
utils.plot_smooth_map_iris(
    image_loc + "p2.1_CMO_{}_anoms".format(settings.YEAR),
    cube,
    settings.COLOURMAP_DICT["composition"],
    bounds,
    "Anomalies from 2003-{} (%)".format(settings.YEAR[2:]),
    figtext="(ab) Carbon Monoxide")

# # Global Map - Jan-Jun

# selected_cube, = np.where(names == "tcco_ano_jan_jun")

# cube = cube_list[selected_cube[0]]
# cube.coord('latitude').guess_bounds()
Beispiel #21
0
def run_all_plots():

    #************************************************************************
    # Global Anomaly map

    cube = read_map(
        DATALOC + "tco_omimls_anomaly_{}.txt".format(settings.YEAR),
        "TCO_anom", "DU")

    bounds = np.array([-100, -4, -3, -2, -1, 0, 1, 2, 3, 4, 100])
    bounds = np.array(
        [-100, -1, -0.75, -0.5, -0.25, 0, 0.25, 0.5, 0.75, 1.0, 100])

    utils.plot_smooth_map_iris(settings.IMAGELOC +
                               "TCO_anomaly_{}".format(settings.YEAR),
                               cube,
                               settings.COLOURMAP_DICT["composition"],
                               bounds,
                               "Anomalies from 2004-08 (DU)",
                               contour=True)
    utils.plot_smooth_map_iris(
        settings.IMAGELOC + "p2.1_TCO_anomaly_{}".format(settings.YEAR),
        cube,
        settings.COLOURMAP_DICT["composition"],
        bounds,
        "Anomalies from 2004-08 (DU)",
        figtext="(aa) OMI/MLS Tropospheric Column Ozone",
        contour=True)

    #************************************************************************
    # Global Trend map
    cube = read_map(DATALOC + "tco_omimls_trends_{}.txt".format(settings.YEAR),
                    "TCO_trend", "DU")

    bounds = np.array([-100, -3, -2, -1, -0.5, 0, 0.5, 1, 2, 3, 100])
    #    utils.plot_smooth_map_iris(settings.IMAGELOC + "TCO_trend_{}".format(settings.YEAR), cube, settings.COLOURMAP_DICT["composition"], bounds, "(DU per decade)")

    sig_lats, sig_lons, sig_data = read_significance(
        DATALOC + "tco_omimls_trends_{}.txt".format(settings.YEAR), DATALOC +
        "tco_omimls_trends_95pct_signficance_{}.txt".format(settings.YEAR))
    # use local adapted routine.
    plot_smooth_map_iris(settings.IMAGELOC +
                         "TCO_trend_significance_{}".format(settings.YEAR),
                         cube,
                         settings.COLOURMAP_DICT["composition"],
                         bounds,
                         "(DU per decade)",
                         scatter=(sig_lons, sig_lats, sig_data))

    #************************************************************************
    # Timeseries
    # monthly_global, annual_global, monthly_NH, annual_NH, monthly_SH, annual_SH = read_data(DATALOC + "OMI_MLS_trop_ozone_burden_2004_2015.txt")

    monthly_global = read_data(
        DATALOC + "BAMS_SOTC_TROPOSPHERIC_OZONE_TG_60Sto60N_{}.txt".format(
            settings.YEAR), "mg")
    monthly_SH = read_data(
        DATALOC +
        "BAMS_SOTC_TROPOSPHERIC_OZONE_TG_0to60S_{}.txt".format(settings.YEAR),
        "msh")
    monthly_NH = read_data(
        DATALOC +
        "BAMS_SOTC_TROPOSPHERIC_OZONE_TG_0to60N_{}.txt".format(settings.YEAR),
        "mnh")

    annual_global = read_data(
        DATALOC +
        "BAMS_SOTC_TROPOSPHERIC_OZONE_TG_RUNNING_MEAN_60Sto60N_{}.txt".format(
            settings.YEAR), "ag")
    annual_SH = read_data(
        DATALOC +
        "BAMS_SOTC_TROPOSPHERIC_OZONE_TG_RUNNING_MEAN_0to60S_{}.txt".format(
            settings.YEAR), "ash")
    annual_NH = read_data(
        DATALOC +
        "BAMS_SOTC_TROPOSPHERIC_OZONE_TG_RUNNING_MEAN_0to60N_{}.txt".format(
            settings.YEAR), "anh")

    minor_tick_interval = 1
    minorLocator = MultipleLocator(minor_tick_interval)
    COLOURS = settings.COLOURS["composition"]

    fig = plt.figure(figsize=(8, 6))
    ax = plt.axes([0.14, 0.07, 0.84, 0.90])

    plt.plot(monthly_global.times,
             monthly_global.data,
             'k',
             ls='-',
             label=r"1.79$\pm$0.47 Tg yr$^{-1}$",
             lw=LW)
    plt.plot(annual_global.times, annual_global.data, 'k', ls='--', lw=LW)
    plt.text(2004,
             250,
             "60" + r'$^{\circ}$' + "S - 60" + r'$^{\circ}$' + "N",
             va='center',
             color='k',
             fontsize=settings.FONTSIZE)

    plt.plot(monthly_NH.times,
             monthly_NH.data,
             'r',
             ls='-',
             label=r"0.89$\pm$0.39 Tg yr$^{-1}$",
             lw=LW)
    plt.plot(annual_NH.times, annual_NH.data, 'r', ls='--', lw=LW)
    plt.text(2004,
             180,
             "0" + r'$^{\circ}$' + " - 60" + r'$^{\circ}$' + "N",
             va='center',
             color='r',
             fontsize=settings.FONTSIZE)

    plt.plot(monthly_SH.times,
             monthly_SH.data,
             'c',
             ls='-',
             label=r"0.90$\pm$0.46 Tg yr$^{-1}$",
             lw=LW)
    plt.plot(annual_SH.times, annual_SH.data, 'c', ls='--', lw=LW)
    plt.text(2004,
             110,
             "60" + r'$^{\circ}$' + "S - 0" + r'$^{\circ}$' + "",
             va='center',
             color='c',
             fontsize=settings.FONTSIZE)

    ax.legend(loc=LEGEND_LOC,
              ncol=1,
              frameon=False,
              prop={'size': settings.LEGEND_FONTSIZE},
              labelspacing=0.1,
              columnspacing=0.5)

    # prettify
    ax.xaxis.set_minor_locator(minorLocator)
    utils.thicken_panel_border(ax)

    fig.text(0.04,
             0.5,
             "Tropospheric Ozone\n(Tg)",
             va='center',
             rotation='vertical',
             ha="center",
             fontsize=settings.FONTSIZE)

    plt.xlim([2003.5, int(settings.YEAR) + 1.5])
    plt.ylim([90, 340])
    for tick in ax.yaxis.get_major_ticks():
        tick.label.set_fontsize(settings.FONTSIZE)
    for tick in ax.xaxis.get_major_ticks():
        tick.label.set_fontsize(settings.FONTSIZE)

    plt.savefig(settings.IMAGELOC + "TCO_ts{}".format(settings.OUTFMT))
    plt.close()

    return  # run_all_plots
Beispiel #22
0
def run_all_plots():

    #************************************************************************
    # Timeseries plot
    if True:

        monthly = read_data(DATALOC + "monthlist", "AOD monthly")
        annual = read_data(DATALOC + "yearlist", "AOD annual")

        minor_tick_interval = 1
        minorLocator = MultipleLocator(minor_tick_interval)
        COLOURS = settings.COLOURS["composition"]

        fig = plt.figure(figsize=(8, 5))
        ax = plt.axes([0.13, 0.07, 0.85, 0.86])

        plt.plot(monthly.times,
                 monthly.data,
                 COLOURS[monthly.name],
                 ls='-',
                 label=monthly.name,
                 lw=LW)
        plt.plot(annual.times,
                 annual.data,
                 COLOURS[annual.name],
                 ls='-',
                 label=annual.name,
                 lw=LW)

        ax.legend(loc=LEGEND_LOC,
                  ncol=1,
                  frameon=False,
                  prop={'size': settings.LEGEND_FONTSIZE},
                  labelspacing=0.1,
                  columnspacing=0.5)

        # prettify
        ax.xaxis.set_minor_locator(minorLocator)
        utils.thicken_panel_border(ax)

        fig.text(0.03,
                 0.5,
                 "AOD",
                 va='center',
                 rotation='vertical',
                 fontsize=settings.FONTSIZE)

        plt.xlim([2002.5, int(settings.YEAR) + 1.5])
        plt.ylim([0.09, 0.21])
        for tick in ax.yaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        plt.savefig(settings.IMAGELOC + "ASL_ts{}".format(settings.OUTFMT))
        plt.close()

    #************************************************************************
    # Global maps

    # total
    if True:
        total = iris.load(DATALOC + "diffAOD.nc")  #.format(settings.YEAR))
        bounds = np.array([
            -10, -0.15, -0.10, -0.05, -0.025, -0.01, 0.01, 0.025, 0.05, 0.10,
            0.15, 10
        ])

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "ASL_total_anomalies_{}".format(settings.YEAR),
            total[0][0], settings.COLOURMAP_DICT["composition"], bounds,
            "Anomalies from 2003-{} (AOD)".format(settings.YEAR[2:]))
        utils.plot_smooth_map_iris(
            settings.IMAGELOC +
            "p2.1_ASL_total_anomalies_{}".format(settings.YEAR),
            total[0][0],
            settings.COLOURMAP_DICT["composition"],
            bounds,
            "Anomalies from 2003-20{} (AOD)".format(
                int(settings.YEAR[2:]) - 1),
            figtext="(x) Total Aerosol")

    # extreme AOD
    if True:
        extreme = iris.load(DATALOC + "NB999.nc")  #.format(settings.YEAR))
        bounds = np.array([0, 2.5, 5, 10, 20, 30, 40, 90])

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "ASL_extreme_days_{}".format(settings.YEAR),
            extreme[0][0], plt.cm.YlOrBr, bounds,
            "Number of days with AOD above the 99.9th percentile (days)")
        utils.plot_smooth_map_iris(
            settings.IMAGELOC +
            "p2.1_ASL_extreme_days_{}".format(settings.YEAR),
            extreme[0][0],
            plt.cm.YlOrBr,
            bounds,
            "Number of days with AOD above the 99.9th percentile (days)",
            figtext="(y) Extreme Aerosol Days")

    # Biomass Burning
    if False:
        BB = iris.load(DATALOC + "diffBB.nc")  #.format(settings.YEAR))

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "ASL_BB_anomalies_{}".format(settings.YEAR),
            BB[0], settings.COLOURMAP_DICT["composition"], bounds,
            "Anomalies from 2003-20{} (AOD)".format(
                int(settings.YEAR[2:]) - 1))
        utils.plot_smooth_map_iris(
            settings.IMAGELOC +
            "p2.1_ASL_BB_anomalies_{}".format(settings.YEAR),
            BB[0],
            settings.COLOURMAP_DICT["composition"],
            bounds,
            "Anomalies from 2003-20{} (AOD)".format(
                int(settings.YEAR[2:]) - 1),
            figtext="(y) Black Carbon & Organic Matter Aerosol")

    # Dust
    if False:
        dust = iris.load(DATALOC + "diffDU.nc")  #.format(settings.YEAR))

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "ASL_dust_anomalies_{}".format(settings.YEAR),
            dust[0], settings.COLOURMAP_DICT["composition"], bounds,
            "Anomalies from 2003-20{} (AOD)".format(
                int(settings.YEAR[2:]) - 1))
        utils.plot_smooth_map_iris(
            settings.IMAGELOC +
            "p2.1_ASL_dust_anomalies_{}".format(settings.YEAR),
            dust[0],
            settings.COLOURMAP_DICT["composition"],
            bounds,
            "Anomalies from 2003-20{} (AOD)".format(
                int(settings.YEAR[2:]) - 1),
            figtext="(z) Dust Aerosol")

    #************************************************************************
    # Total, Trend and Event map
    if False:

        # as one colorbar per map, don't use the utils Iris routine

        fig = plt.figure(figsize=(8, 15))

        #total = iris.load(DATALOC + "Aerosol_Fig2a_Total_Averages.nc")
        #trend = iris.load(DATALOC + "Aerosol_Fig2b_Total_Trends.nc")
        #event = iris.load(DATALOC + "Aerosol_Fig2c_ExtremeDayCounts_{}.nc".format(settings.YEAR))

        total = iris.load(DATALOC + "meanAOD.nc")
        trend = iris.load(DATALOC + "trend.nc")
        number = iris.load(DATALOC + "numbermonth.nc")

        bounds_a = np.array(
            [0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.4, 0.5, 0.6, 0.7, 1.0])
        bounds_b = np.array([
            -10, -0.010, -0.005, -0.003, -0.002, -0.001, 0.001, 0.002, 0.003,
            0.005, 0.010, 10
        ])
        bounds_c = np.array([0, 1, 2, 3, 4, 5, 6, 7, 10])

        all_cubes = [total, trend, number]
        all_bounds = [bounds_a, bounds_b, bounds_c]

        # do colourmaps by hand
        cmap = [
            plt.cm.YlOrBr, settings.COLOURMAP_DICT["composition"],
            plt.cm.YlOrBr
        ]
        PLOTLABELS = ["(a)", "(b)", "(c)"]
        cb_label = ["AOD", "AOD yr" + r'$^{-1}$', "Months"]

        # spin through axes
        for a in range(3):

            norm = mpl.cm.colors.BoundaryNorm(all_bounds[a], cmap[a].N)

            ax = plt.subplot(3, 1, a + 1, projection=cartopy.crs.Robinson())

            ax.gridlines()  #draw_labels=True)
            ax.add_feature(cartopy.feature.LAND,
                           zorder=0,
                           facecolor="0.9",
                           edgecolor="k")
            ax.coastlines()

            ext = ax.get_extent()  # save the original extent

            mesh = iris.plot.pcolormesh(all_cubes[a][0],
                                        cmap=cmap[a],
                                        norm=norm,
                                        axes=ax)

            ax.set_extent(
                ext, ax.projection)  # fix the extent change from colormesh
            ax.text(0.0,
                    1.0,
                    PLOTLABELS[a],
                    fontsize=settings.FONTSIZE * 0.8,
                    transform=ax.transAxes)

            # sort the colourbar
            cb = fig.colorbar(mesh, ax=ax, orientation='horizontal', \
                                  ticks=all_bounds[a][1:-1], label=cb_label[a], drawedges=True, pad=0.05, fraction=0.07, aspect=30)
            if a == 1:
                cb.set_ticklabels(
                    ["{:6.3f}".format(b) for b in all_bounds[a][1:-1]])
            else:
                cb.set_ticklabels(
                    ["{:g}".format(b) for b in all_bounds[a][1:-1]])

            cb.outline.set_linewidth(2)
            cb.dividers.set_color('k')
            cb.dividers.set_linewidth(2)

        fig.subplots_adjust(bottom=0.05,
                            top=0.95,
                            left=0.04,
                            right=0.95,
                            wspace=0.02)

        plt.savefig(settings.IMAGELOC + "ASL_Trends{}".format(settings.OUTFMT))

        plt.close()

    #************************************************************************
    # Total, and two trends maps
    if True:

        # as one colorbar per map, don't use the utils Iris routine

        fig = plt.figure(figsize=(8, 15))

        total = iris.load(DATALOC + "AOD2003-2009.nc")[0]
        trend1 = iris.load(DATALOC + "trend2003-2019.nc")[0]
        trend1.data = np.ma.masked_where(trend1.data == -99, trend1.data)
        trend2 = iris.load(DATALOC + "medianaod12-19sig.nc")[0]
        trend2.data = np.ma.masked_where(trend2.data == -99, trend2.data)

        bounds_a = np.array(
            [0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.4, 0.5, 0.6, 0.7, 1.0])
        bounds_b = np.array([
            -10, -0.020, -0.010, -0.006, -0.004, -0.002, 0.002, 0.004, 0.006,
            0.010, 0.020, 10
        ])
        bounds_c = np.array([
            -10, -0.020, -0.010, -0.006, -0.004, -0.002, 0.002, 0.004, 0.006,
            0.010, 0.020, 10
        ])

        all_cubes = [total, trend1, trend2]
        all_bounds = [bounds_a, bounds_b, bounds_c]

        # do colourmaps by hand
        cmap = [
            plt.cm.YlOrBr, settings.COLOURMAP_DICT["composition"],
            settings.COLOURMAP_DICT["composition"]
        ]
        PLOTLABELS = [
            "(a) Mean 2003-19", "(b) Trend 2003-19", "(c) Trend 2012-19"
        ]
        cb_label = ["AOD", "AOD yr" + r'$^{-1}$', "AOD yr" + r'$^{-1}$']

        # spin through axes
        for a in range(3):

            norm = mpl.cm.colors.BoundaryNorm(all_bounds[a], cmap[a].N)

            ax = plt.subplot(3, 1, a + 1, projection=cartopy.crs.Robinson())

            ax.gridlines()  #draw_labels=True)
            ax.add_feature(cartopy.feature.LAND,
                           zorder=0,
                           facecolor="0.9",
                           edgecolor="k")
            ax.coastlines()

            ext = ax.get_extent()  # save the original extent

            cube = all_cubes[a][0]
            if settings.OUTFMT in [".eps", ".pdf"]:
                if cube.coord("latitude").points.shape[0] > 180 or cube.coord(
                        "longitude").points.shape[0] > 360:
                    regrid_size = 1.0
                    print(
                        "Regridding cube for {} output to {} degree resolution"
                        .format(settings.OUTFMT, regrid_size))
                    print("Old Shape {}".format(cube.data.shape))
                    plot_cube = utils.regrid_cube(cube, regrid_size,
                                                  regrid_size)
                    print("New Shape {}".format(plot_cube.data.shape))
                else:
                    plot_cube = copy.deepcopy(cube)
            else:
                plot_cube = copy.deepcopy(cube)

            mesh = iris.plot.pcolormesh(plot_cube,
                                        cmap=cmap[a],
                                        norm=norm,
                                        axes=ax)

            ax.set_extent(
                ext, ax.projection)  # fix the extent change from colormesh
            ax.text(0.0,
                    1.0,
                    PLOTLABELS[a],
                    fontsize=settings.FONTSIZE * 0.8,
                    transform=ax.transAxes)

            # sort the colourbar
            cb = fig.colorbar(mesh, ax=ax, orientation='horizontal', \
                                  ticks=all_bounds[a][1:-1], label=cb_label[a], drawedges=True, pad=0.05, fraction=0.07, aspect=30)
            if a == 1:
                cb.set_ticklabels(
                    ["{:6.3f}".format(b) for b in all_bounds[a][1:-1]])
            else:
                cb.set_ticklabels(
                    ["{:g}".format(b) for b in all_bounds[a][1:-1]])

            cb.outline.set_linewidth(2)
            cb.dividers.set_color('k')
            cb.dividers.set_linewidth(2)

        fig.subplots_adjust(bottom=0.05,
                            top=0.95,
                            left=0.04,
                            right=0.95,
                            wspace=0.02)

        plt.savefig(settings.IMAGELOC + "ASL_Trends{}".format(settings.OUTFMT))

        plt.close()

    #************************************************************************
    # Forcing map
    if True:

        bounds = np.array([
            -10, -1.4, -1.0, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 1.0, 1.4, 10
        ])

        RFari = iris.load(
            DATALOC + "aerorf_camsra_rfari_2003-{}.nc".format(settings.YEAR))

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "ASL_RFari_anomalies_{}".format(settings.YEAR),
            RFari[0][0],
            settings.COLOURMAP_DICT["composition"],
            bounds,
            "Anomalies from 2003-{}".format(settings.YEAR),
            figtext="(a) CAMSRA: RFari (SW). Mean -0.56" + r'$\pm$' +
            "0.16 Wm" + r'$^{-1}$')

        RFaci = iris.load(
            DATALOC + "aerorf_camsra_rfaci_2003-{}.nc".format(settings.YEAR))

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "ASL_RFaci_anomalies_{}".format(settings.YEAR),
            RFaci[0][0],
            settings.COLOURMAP_DICT["composition"],
            bounds,
            "Anomalies from 2003-{}".format(settings.YEAR),
            figtext="(c) CAMSRA: RFaci (SW). Mean -0.80" + r'$\pm$' +
            "0.53 Wm" + r'$^{-1}$')

        # and timeseries
        cubelist = iris.load(
            DATALOC +
            "aerorf_camsra_timeseries_2003-{}.nc".format(settings.YEAR))

        LABELS = {"RFari": "(b)", "RFaci": "(d)"}
        ERRORS = {"RFari": 0.286, "RFaci": 0.667}

        for cube in cubelist:

            name = str(cube.var_name)
            name = name[:2].upper() + name[2:]

            fig = plt.figure(figsize=(8, 6))
            ax = plt.axes([0.13, 0.10, 0.8, 0.86])
            iris.plot.plot(cube, 'k', label=cube.var_name, lw=LW)

            timeUnits = cube.coord("time").units
            dt_time = timeUnits.num2date(cube.coord("time").points)
            upper = cube.data * (1 + ERRORS[name])
            lower = cube.data * (1 - ERRORS[name])
            ax.fill_between(dt_time, upper, lower, color="0.7", label=None)

            # prettify
            ax.set_ylabel("{} (W m".format(name) + r'$^{-2}$' + ")",
                          fontsize=settings.FONTSIZE)

            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
            for tick in ax.xaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
            ax.yaxis.set_ticks_position('left')
            utils.thicken_panel_border(ax)

            minorLocator = MultipleLocator(365.242199)  # in days since
            ax.xaxis.set_minor_locator(minorLocator)
            utils.thicken_panel_border(ax)

            # set labels
            if cube.var_name == "rfari":
                ax.text(0.02, 0.9, "(b)")
                ax.set_ylim([-0.8, -0.3])
            else:
                ax.text(0.02, 0.9, "(d")
                ax.set_ylim([-1.6, -0.2])

            ax.text(0.02,
                    0.9,
                    LABELS[name],
                    transform=ax.transAxes,
                    fontsize=settings.FONTSIZE)

            plt.savefig(settings.IMAGELOC +
                        "ASL_ts_{}{}".format(cube.var_name, settings.OUTFMT))
            plt.close()

    return  # run_all_plots
Beispiel #23
0
def run_all_plots():

    #************************************************************************
    # Timeseries figure (2 panels)
    if True:
        for region in ["global"]:

            if region == "global":
                raobcore, rich, ratpac, UAH, rss, era5, merra, jra = \
                    read_csv(DATALOC + "SotC_AnnTemps_2020_0520_LTTGL.csv")

            plt.clf()
            fig, (ax1, ax2, ax3) = plt.subplots(3, figsize=(8, 10), sharex=True)

            # sondes
            utils.plot_ts_panel(ax1, [raobcore, rich, ratpac], "-", "temperature", loc=LEGEND_LOC)

            # satellites
            utils.plot_ts_panel(ax2, [UAH, rss], "-", "temperature", loc=LEGEND_LOC)

            ax2.set_ylabel("Anomaly ("+r'$^\circ$'+"C)", fontsize=settings.FONTSIZE)


            # reanalyses
            if region == "global":
    #            jra_actuals, jra_anoms = utils.read_jra55(settings.REANALYSISLOC + "JRA-55_MSUch2LT_global_ts.txt", "temperature")
    #            merra_actuals, merra_anoms = utils.read_merra_LT_LS(settings.REANALYSISLOC + "MERRA2_MSU_Tanom_ann_{}.dat".format(settings.YEAR), LT=True)
    #            utils.plot_ts_panel(ax3, [erai, era5, jra_anoms, merra_anoms], "-", "temperature", loc=LEGEND_LOC)
                twenty_cr_actuals = utils.read_20cr(settings.REANALYSISLOC + "tlt.global.txt", "temperature")
                dummy, twenty_cr_anoms = utils.calculate_climatology_and_anomalies_1d(twenty_cr_actuals, 1981, 2010)


                utils.plot_ts_panel(ax3, [era5, jra, merra], "-", "temperature", loc=LEGEND_LOC)
            else:
                utils.plot_ts_panel(ax3, [era5], "-", "temperature", loc=LEGEND_LOC)


            # sort formatting
            plt.xlim([raobcore.times[0]-1, raobcore.times[-1]+1])
            ax1.set_ylim([-0.89, 0.89])
            ax2.set_ylim([-0.89, 0.89])
            ax3.set_ylim([-0.89, 0.89])

            for tick in ax3.xaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

            for tick in ax1.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
            for tick in ax2.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
            for tick in ax3.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

            # sort labelling
            ax1.text(0.02, 0.9, "(a) Radiosondes", transform=ax1.transAxes, fontsize=settings.LABEL_FONTSIZE)
            ax2.text(0.02, 0.9, "(b) Satellites", transform=ax2.transAxes, fontsize=settings.LABEL_FONTSIZE)
            ax3.text(0.02, 0.9, "(c) Reanalyses", transform=ax3.transAxes, fontsize=settings.LABEL_FONTSIZE)

            fig.subplots_adjust(right=0.98, top=0.98, bottom=0.05, hspace=0.001)

            plt.savefig(settings.IMAGELOC+"LTT_ts_{}{}".format(region, settings.OUTFMT))

            plt.close()

    # #************************************************************************
    # # Land Fraction - 2018

    # high, low = read_hilo(DATALOC + "high_low.dat")
    # fig, ax1 = plt.subplots(1, figsize=(8, 5))

    # ax1.plot(high.times, high.data, c="r", ls="-", lw=2, label=high.name)
    # ax1.plot(low.times, low.data, c="b", ls="-", lw=2, label=low.name)
    
    # ax1.legend(loc="upper right", ncol=2, frameon=False, prop={'size':settings.FONTSIZE})
    # ax1.set_xlim([1978, int(settings.YEAR)+2])
    # ax1.set_ylabel("Percentage of Global Area (%)", fontsize=settings.FONTSIZE)

    # for tick in ax1.yaxis.get_major_ticks():
    #     tick.label.set_fontsize(settings.FONTSIZE)
    # for tick in ax1.xaxis.get_major_ticks():
    #     tick.label.set_fontsize(settings.FONTSIZE)
    # utils.thicken_panel_border(ax1)

    # plt.savefig(settings.IMAGELOC+"LTT_land_area_ts{}".format(settings.OUTFMT))

    # plt.close()

    #************************************************************************
    # Read in ERA5 anomalies
    if False:
        cube_list = iris.load(DATALOC + "2019TLTAnom.nc")
        names = np.array([c.var_name for c in cube_list])

        loc, = np.where(names == "tltAnnualAnom")[0]

        cube = cube_list[loc]

        bounds = np.array([-100, -4, -2, -1, -0.5, 0, 0.5, 1, 2, 4, 100])
        bounds = np.array([-100, -1.6, -1.2, -0.8, -0.4, 0, 0.4, 0.8, 1.2, 1.6, 100])
        bounds = np.array([-100, -2.0, -1.5, -1.0, -0.5, 0, 0.5, 1.0, 1.5, 2.0, 100])

        cmap = settings.COLOURMAP_DICT["temperature"]
        utils.plot_smooth_map_iris(settings.IMAGELOC + "LTT_{}_anoms_era5".format(settings.YEAR), cube, cmap, \
                                       bounds, "Anomalies from 1981-2010 ("+r'$^{\circ}$'+"C)", title="ERA5")
        utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_LTT_{}_anoms_era5".format(settings.YEAR), cube, \
                                       cmap, bounds, "Anomalies from 1981-2010 ("+r'$^{\circ}$'+"C)", \
                                       figtext="(e) Lower Tropospheric Temperature")


    #************************************************************************
    # Read in ERA5 anomalies with record pixels
    if True:
        cube_list = iris.load(DATALOC + "2019TLTAnom_warmest.nc")
        names = np.array([c.var_name for c in cube_list])

        loc, = np.where(names == "tltAnnualAnom")[0]

        cube = cube_list[loc]

        loc, = np.where(names == "recordMask")[0]
        record = cube_list[loc]
        record.coord("latitude").guess_bounds()
        record.coord("longitude").guess_bounds()

        lats, lons, data = [], [], []
        for t, lat in enumerate(record.coord("latitude").points):
            for n, lon in enumerate(record.coord("longitude").points):
                if record.data[t, n] == 1:
                    data += [cube.data[t, n]]
                    lats += [np.mean(record.coord("latitude").bounds[t])]
                    lons += [np.mean(record.coord("longitude").bounds[n])]
        
        bounds = np.array([-100, -2.0, -1.5, -1.0, -0.5, 0, 0.5, 1.0, 1.5, 2.0, 100])

        cmap = settings.COLOURMAP_DICT["temperature"]
        utils.plot_smooth_map_iris(settings.IMAGELOC + "LTT_{}_anoms_era5".format(settings.YEAR), cube, cmap, \
                                       bounds, "Anomalies from 1981-2010 ("+r'$^{\circ}$'+"C)", title="ERA5", \
                                   scatter=(lons, lats, data), smarker="dots")
        utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_LTT_{}_anoms_era5".format(settings.YEAR), cube, \
                                       cmap, bounds, "Anomalies from 1981-2010 ("+r'$^{\circ}$'+"C)", \
                                       figtext="(e) Lower Tropospheric Temperature", \
                                   scatter=(lons, lats, data), smarker="dots")

    #************************************************************************
    # ERA-I Hovmuller

    # times, latitudes, data = utils.erai_2dts_read(settings.REANALYSISLOC, "ltt")

    # bounds = np.array([-100, -4, -2, -1, -0.5, 0, 0.5, 1, 2, 4, 100])
    # bounds = np.array([-100, -1.6, -1.2, -0.8, -0.4, 0, 0.4, 0.8, 1.2, 1.6, 100])

    # # sort the time axis
    # start = (times[0] - 101)/10000.
    # end = (times[-1] - 1201)/10000.

    # year = start
    # new_times = []

    # months = (np.arange(12))/12.

    # while year <= end:
    #     new_times += [np.array([year for i in range(12)]) + months]
    #     year += 1

    # new_times = np.array(new_times).reshape(-1)
    # # sort the climatology to 1981-2010 (monthly!)

    # # reshape to deal with monthly
    # data = data.reshape(-1, 12, data.shape[-1])
    # new_times = new_times.reshape(-1, 12)

    # # extract climatology period
    # start_loc, = np.where(new_times[:, 0] == CLIMSTART)
    # end_loc, = np.where(new_times[:, 0] == CLIMEND)
    # clim_data = data[start_loc[0]:end_loc[0] + 1, :, :]
    # climatology = np.mean(clim_data, axis=0)

    # # make anomalies
    # data = np.array([data[i, :, :] - climatology for i in range(data.shape[0])])

    # # return to original shapes
    # data = data.reshape(-1, data.shape[-1])
    # new_times = new_times.reshape(-1)

    # utils.plot_hovmuller(settings.IMAGELOC + "LTT_hovmuller_erai", new_times, latitudes, data.T, \
    #                          settings.COLOURMAP_DICT["temperature"], bounds, \
    #                          "Anomaly ("+r'$^{\circ}$'+"C)", cosine=True)


    # version with MEI on top
    # mei = read_mei(os.path.join(DATALOC, "MEI.dat"))


    # utils.plot_hovmuller(settings.IMAGELOC + "LTT_hovmuller_era_MEI", new_times, latitudes, data.T, \
    #                          settings.COLOURMAP_DICT["temperature"], bounds, \
    #                          "Anomaly ("+r'$^{\circ}$'+"C)", cosine=True, extra_ts=mei)


    return # run_all_plots
Beispiel #24
0
def run_all_plots():

    if False:
        #************************************************************************
        # Filled Timeseries
        #************************************************************************

        moderate, severe, extreme = read_data(DATALOC +
                                              "dry_areas_bams_2018_series.csv")

        plt.clf()

        # main panel
        ax1 = plt.axes([0.1, 0.1, 0.85, 0.8])

        ax1.fill_between(moderate.times,
                         0,
                         moderate.data,
                         color="yellow",
                         label="Moderate (<-2)")
        ax1.fill_between(severe.times,
                         0,
                         severe.data,
                         color="orange",
                         label="Severe (<-3)")
        ax1.fill_between(extreme.times,
                         0,
                         extreme.data,
                         color="red",
                         label="Extreme (<-4)")

        ax1.set_ylabel("% Area", fontsize=settings.FONTSIZE)

        ax1.legend(loc="upper left",
                   ncol=1,
                   frameon=False,
                   prop={'size': settings.LEGEND_FONTSIZE},
                   labelspacing=0.1,
                   columnspacing=0.5)

        utils.thicken_panel_border(ax1)
        for tick in ax1.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax1.yaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        minor_tick_interval = 1
        minorLocator = MultipleLocator(minor_tick_interval)
        ax1.xaxis.set_minor_locator(minorLocator)
        ax1.set_xlim([1950, int(settings.YEAR) + 2])
        ax1.set_ylim([None, 44])

        # inset panel
        ax2 = plt.axes([0.7, 0.7, 0.29, 0.29])

        ax2.fill_between(moderate.times[-12:],
                         0,
                         moderate.data[-12:],
                         color="yellow",
                         label="Moderate (<-2)")
        ax2.fill_between(severe.times[-12:],
                         0,
                         severe.data[-12:],
                         color="orange",
                         label="Severe (<-3)")
        ax2.fill_between(extreme.times[-12:],
                         0,
                         extreme.data[-12:],
                         color="red",
                         label="Extreme (<-4)")

        utils.thicken_panel_border(ax2)
        for tick in ax2.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE * 0.7)
        for tick in ax2.yaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE * 0.7)

        ax2.set_xlim([int(settings.YEAR), int(settings.YEAR) + 1])
        ax2.set_xticks(np.arange(2017, 2018, 1. / 12.))
        ax2.set_xticklabels(
            ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"])
        ax2.set_ylim([None, 34])
        ax2.set_xlim(
            [float(settings.YEAR) - 0.09,
             float(settings.YEAR) + 0.99])
        ax2.text(int(settings.YEAR) + 0.1, 27, settings.YEAR)

        plt.savefig(settings.IMAGELOC + "DGT_ts{}".format(settings.OUTFMT))
        plt.close()

    #************************************************************************
    # Anomaly Map
    #************************************************************************
    # Maps for selected years

    if True:

        cube_list = iris.load(
            DATALOC +
            "BAMS.scPDSI.cru.4.04.2020.early.GLOBAL.annual.mean.2018.2019.nc")

        cube = cube_list[0]
        cube.coord('latitude').guess_bounds()
        cube.coord('longitude').guess_bounds()

        bounds = [-100, -4, -3, -2, -1, 0, 1, 2, 3, 4, 100]

        # select the year - plot 2019 (cube[1])

        utils.plot_smooth_map_iris(
            settings.IMAGELOC +
            "DGT_{}_rel_1901-{}".format(settings.YEAR, settings.YEAR),
            cube[1],
            settings.COLOURMAP_DICT["hydrological"],
            bounds,
            "Categories relative to 1901-{} (self-calibrating PDSI)".format(
                settings.YEAR),
            cb_extra=["Dry", "Wet"],
            contour=True)
        utils.plot_smooth_map_iris(
            settings.IMAGELOC +
            "p2.1_DGT_{}_rel_1901-{}".format(settings.YEAR, settings.YEAR),
            cube[1],
            settings.COLOURMAP_DICT["hydrological"],
            bounds,
            "Categories relative to 1901-{} (self-calibrating PDSI)".format(
                settings.YEAR),
            figtext="(t) Drought (self-calibrating PDSI)",
            cb_extra=["Dry", "Wet"],
            contour=True,
            save_netcdf_filename="{}DGT_for_NOAA_{}.nc".format(
                DATALOC, dt.datetime.strftime(dt.datetime.now(), "%d-%b-%Y")))

        # plot 2019-2018

        newcube = cube[1] - cube[0]
        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "DGT_{}-{}_rel_1901-{}".format(
                settings.YEAR,
                int(settings.YEAR) - 1, settings.YEAR),
            newcube,
            settings.COLOURMAP_DICT["hydrological"],
            bounds,
            "Change in Categories from {} to {} (self-calibrating PDSI)".
            format(int(settings.YEAR) - 1, settings.YEAR),
            cb_extra=["Dry", "Wet"])

    if False:
        # from 2015 report

        # select the last year
        cube_list = []
        YEARS = [1982, 1997]
        for year in YEARS:

            loc, = np.where(cube.coord("time").points == year)
            cube_list += [cube[loc][0]]

        utils.plot_smooth_map_iris_multipanel(
            settings.IMAGELOC +
            "DGR_{}_{}_{}".format(settings.YEAR, YEARS[0], YEARS[1]),
            cube_list,
            settings.COLOURMAP_DICT["hydrological"],
            bounds,
            "Categories relative to 1901-2015 (self-calibrating PSDI)",
            shape=(2, 1),
            title=[str(y) for y in YEARS],
            figtext=["(a)", "(b)"])

        # select the last year
        cube_list = []
        YEARS = [1985, 1987]
        for year in YEARS:

            loc, = np.where(cube.coord("time").points == year)
            cube_list += [cube[loc][0]]

        utils.plot_smooth_map_iris_multipanel(
            settings.IMAGELOC +
            "DGR_{}_{}_{}".format(settings.YEAR, YEARS[0], YEARS[1]),
            cube_list,
            settings.COLOURMAP_DICT["hydrological"],
            bounds,
            "Categories relative to 1901-2015 (self-calibrating PSDI)",
            shape=(2, 1),
            title=[str(y) for y in YEARS],
            figtext=["(a)", "(b)"])

    return  # run_all_plots
Beispiel #25
0
def run_all_plots():

    #************************************************************************
    # Read in Australian # Data
    #     aus_lat, aus_lon, aus_anom_8110, aus_trend_79_pres, aus_years, aus_anomalies, aus_clim_8110 = \
    #         read_australia("{}/u_Extracted_ANN_{}_v2.csv".format(DATALOC, settings.YEAR), start_year = 1979)
    # #        read_australia("{}/u_Extracted_ANN_1974_{}_RD.csv".format(DATALOC, settings.YEAR))

    # Timeseries figure
    if True:

        # ERA data
        era5_globe, era5_ocean, era5_land, era5tropics = utils.era5_ts_read(
            settings.REANALYSISLOC, "wnd", annual=True)

        land_era5_clim, land_era5_anoms = utils.calculate_climatology_and_anomalies_1d(
            era5_land, CLIMSTART, 2010)

        land_merra_anoms = utils.read_merra(settings.REANALYSISLOC + "MERRA-2_SfcAnom{}.dat".format(settings.YEAR), \
                                            "wind", "L", anomalies=True)

        jra_actuals, jra_anoms = utils.read_jra55(
            settings.REANALYSISLOC + "JRA-55_ws10m_globalland_ts.txt",
            "windspeed")

        twenty_cr_actuals = utils.read_20cr(
            settings.REANALYSISLOC + "wspd10m.land.txt", "wind speed")
        dummy, twenty_cr_anoms = utils.calculate_climatology_and_anomalies_1d(
            twenty_cr_actuals, CLIMSTART, 2010)

        # Plot timeseries figure
        fig, (ax1, ax2, ax3, ax4) = plt.subplots(4,
                                                 figsize=(8, 13),
                                                 sharex=True)

        print("{} {} {} {} {}".format("name", "mean", "anomaly", "trend/dec",
                                      "N station"))
        for region in all_regions:

            if region.name == "Australia":
                # use the Australian data

                years = aus_years
                anomalies = aus_anomalies

                print(anomalies)

                region.nstat = len(aus_lat)
                region.slope = np.mean(
                    aus_trend_79_pres
                )  # just do the mean of all station slopes
                region.mean = np.mean(aus_clim_8110)

            else:
                # Read in the HadISD annual anomalies
                years, anomalies, m3, m10 = read_hadisd_annual_anomalies(
                    region)

            # Print data for table
            print("{} {} {} {} {}".format(region.name, region.mean,
                                          anomalies[-1], region.slope * 10.,
                                          region.nstat))

            order = anomalies.argsort()
            ranks = order.argsort() + 1

            print("{} highest {} lowest".format(
                len(ranks) - ranks[-1], ranks[-1]))

            # plot data
            if region.fname == "GlobalNoOz":
                ax1.plot(years,
                         anomalies,
                         c=region.color,
                         label=region.name,
                         lw=3,
                         zorder=10)
            else:
                ax1.plot(years,
                         anomalies,
                         c=region.color,
                         label=region.name,
                         lw=2)

            if region.fname == "GlobalNoOz":
                ax3.plot(years, m3, c=region.color, lw=3, zorder=10)
                ax4.plot(years, m10, c=region.color, lw=3)
            elif region.name != "Australia":
                ax3.plot(years, m3, c=region.color, lw=2)
                ax4.plot(years, m10, c=region.color, lw=2)

        # plot reanalyses separately
        ax2.plot(land_era5_anoms.times, land_era5_anoms.data, c=settings.COLOURS["circulation"]["ERA5"], \
                     label="ERA5 (land only)", lw=2)
        ax2.plot(land_merra_anoms.times, land_merra_anoms.data, c=settings.COLOURS["circulation"]["MERRA-2"], \
                     label="MERRA-2 (land only)", lw=2)
        #        ax2.plot(jra_anoms.times, jra_anoms.data, c=settings.COLOURS["circulation"]["JRA-55"], \
        #                             label="JRA-55 (land only)", lw=2)
        ax2.plot(twenty_cr_anoms.times, twenty_cr_anoms.data, c=settings.COLOURS["circulation"]["20CRv3"], \
                     label="20CRv3 (land only)", lw=2)

        # finish off plot
        ax1.axhline(0, c='0.5', ls='--')
        ax2.axhline(0, c='0.5', ls='--')

        ax1.text(0.02,
                 0.9,
                 "(a) In Situ - all Speeds",
                 transform=ax1.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax2.text(0.02,
                 0.9,
                 "(b) Reanalyses - all Speeds",
                 transform=ax2.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        ax3.text(0.02, 0.9, "(c) In Situ >3 m s"+r'$^{-1}$'+" Winds", transform=ax3.transAxes, \
                     fontsize=settings.LABEL_FONTSIZE)
        ax4.text(0.02, 0.9, "(d) In Situ >10 m s"+r'$^{-1}$'+" Winds", transform=ax4.transAxes, \
                     fontsize=settings.LABEL_FONTSIZE)

        fig.text(0.02, 0.72, "Wind Anomaly (m s"+r'$^{-1}$'+")", va='center', rotation='vertical', \
                     fontsize=settings.LABEL_FONTSIZE)
        fig.text(0.02, 0.3, "Wind Frequency (% yr"+r'$^{-1}$'+")", va='center', rotation='vertical', \
                     fontsize=settings.LABEL_FONTSIZE)

        ax1.legend(loc="upper right", ncol=2, frameon=False, prop={'size':settings.LEGEND_FONTSIZE}, \
                       labelspacing=0.1, columnspacing=0.5, bbox_to_anchor=(1.0, 0.9))
        ax2.legend(loc="upper right", ncol=2, frameon=False, prop={'size':settings.LEGEND_FONTSIZE}, \
                       labelspacing=0.1, columnspacing=0.5, bbox_to_anchor=(1.0, 0.9))

        plt.setp([a.get_xticklabels() for a in fig.axes[:-1]], visible=False)

        fig.subplots_adjust(right=0.96, top=0.99, bottom=0.03, hspace=0.001)

        for tick in ax4.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        plt.xlim([1970, int(settings.YEAR) + 1])
        ax1.set_ylim([-0.39, 1.0])
        ax2.set_ylim([-0.39, 1.0])
        ax3.set_ylim([23, 68])
        ax4.set_ylim([0, 6.5])

        minorLocator = MultipleLocator(1)
        for ax in [ax1, ax2, ax3, ax4]:
            utils.thicken_panel_border(ax)
            ax.set_yticks(ax.get_yticks()[1:])
            ax.xaxis.set_minor_locator(minorLocator)
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
            ax.yaxis.set_ticks_position('left')

        plt.savefig(settings.IMAGELOC +
                    "WND_land_ts{}".format(settings.OUTFMT))
        plt.close()

    #************************************************************************
    # HadISD Anomaly figure
    if True:

        # Read in HadISD station anomalies
        stn_id, hadisd_lons, hadisd_lats, mean8110, hadisd_anomaly_8110, hadisd_trend_79_pres = read_hadisd_global_summary(
        )

        # combine together
        lats = hadisd_lats
        lons = hadisd_lons
        anom = hadisd_anomaly_8110
        trend = hadisd_trend_79_pres * 10

        # lats = np.append(hadisd_lats, aus_lat)
        # lons = np.append(hadisd_lons, aus_lon)
        # anom = combine_arrays((hadisd_anomaly_8110, aus_anom_8110))
        # trend = combine_arrays((hadisd_trend_79_pres, aus_trend_79_pres)) * 10.

        #    bounds = [-100, -0.8, -0.4, -0.2, -0.1, 0, 0.1, 0.2, 0.4, 0.8, 100]
        bounds = [-100, -0.4, -0.2, -0.1, -0.05, 0, 0.05, 0.1, 0.2, 0.4, 100]
        utils.scatter_plot_map(settings.IMAGELOC + "WND_{}_obs_trend".format(settings.YEAR), trend, \
                                   lons, lats, settings.COLOURMAP_DICT["circulation_r"], bounds, "Trend from {}-{} (m s".format(TRENDSTART, settings.YEAR)+r'$^{-1}$'+" decade"+r'$^{-1}$)')

        bounds = [-100, -1.2, -0.8, -0.4, -0.2, 0, 0.2, 0.4, 0.8, 1.2, 100]
        utils.scatter_plot_map(settings.IMAGELOC + "WND_{}_obs_anomaly".format(settings.YEAR), anom, \
                               lons, lats, settings.COLOURMAP_DICT["circulation_r"], bounds, "Anomalies from {}-2010 (m s".format(CLIMSTART)+r'$^{-1}$)')

        total = float(len(anom.compressed()))
        pos, = np.ma.where(anom > 0)
        neg, = np.ma.where(anom < 0)
        print("Anomalies: positive {:5.3f} negative {:5.3f}".format(
            len(pos) / total,
            len(neg) / total))
        pos, = np.ma.where(anom > 0.5)
        neg, = np.ma.where(anom < -0.5)
        print("Anomalies: positive {:5.3f} negative {:5.3f} (than 0.5)".format(
            len(pos) / total,
            len(neg) / total))
        pos, = np.ma.where(anom > 1.0)
        neg, = np.ma.where(anom < -1.0)
        print("Anomalies: positive {:5.3f} negative {:5.3f} (than 1.0)".format(
            len(pos) / total,
            len(neg) / total))

        total = float(len(trend.compressed()))
        pos, = np.ma.where(trend > 0)
        neg, = np.ma.where(trend < 0)
        print("Trends: positive {:5.3f} negative {:5.3f}".format(
            len(pos) / total,
            len(neg) / total))

    #************************************************************************
    # ERA5 + HadISD Anomaly figure
    if True:
        # Read in ERA anomalies

        cube_list = iris.load(settings.REANALYSISLOC +
                              "era5_ws10_{}01-{}12_ann_ano.nc".format(
                                  settings.YEAR, settings.YEAR))

        cube = cube_list[0]
        cube.coord('latitude').guess_bounds()
        cube.coord('longitude').guess_bounds()

        bounds = [-4, -1.2, -0.8, -0.4, -0.2, 0, 0.2, 0.4, 0.8, 1.2, 4]

        utils.plot_smooth_map_iris(settings.IMAGELOC + "WND_{}_era5_obs_anomaly".format(settings.YEAR), cube[0], \
            settings.COLOURMAP_DICT["circulation_r"], bounds, "Anomalies from {}-2010 (m s".format(CLIMSTART)+r'$^{-1}$)', scatter = (lons, lats, anom))
        utils.plot_smooth_map_iris(settings.IMAGELOC + "WND_{}_era5_anomaly".format(settings.YEAR), cube[0], \
            settings.COLOURMAP_DICT["circulation_r"], bounds, "Anomalies from {}-2010 (m s".format(CLIMSTART)+r'$^{-1}$)')

    #************************************************************************
    # MERRA Anomaly figure
    if True:
        anoms = read_ocean_ncdf(
            DATALOC +
            "rss_wind_trend_anomaly_SOTC_{}_updated.nc".format(settings.YEAR),
            "MERRA2_wind_anomaly_map_{}".format(settings.YEAR))

        bounds = [-40, -1.2, -0.8, -0.4, -0.2, 0, 0.2, 0.4, 0.8, 1.2, 40]

        utils.plot_smooth_map_iris(settings.IMAGELOC + "WND_merra2_anomaly", anoms, settings.COLOURMAP_DICT["circulation_r"], bounds,\
                                       "Anomalies from 1981-2010 (m s"+r'$^{-1}$'+")")

    #************************************************************************
    # MERRA + HadISD Anomaly figure

    if True:
        # Read in MERRA anomalies

        cube_list = iris.load(
            settings.REANALYSISLOC +
            "MERRA-2_SfcAnom_{}.nc".format(settings.YEAR),
            "10m Wind Speed Anomaly (1981-2010)")

        cube = cube_list[0]
        cube.coord('latitude').guess_bounds()
        cube.coord('longitude').guess_bounds()

        bounds = [-4, -1.2, -0.8, -0.4, -0.2, 0, 0.2, 0.4, 0.8, 1.2, 4]

        utils.plot_smooth_map_iris(settings.IMAGELOC + "WND_{}_merra_obs_anomaly".format(settings.YEAR), cube[0], \
                                       settings.COLOURMAP_DICT["circulation_r"], bounds, \
                                       "Anomalies from {}-2010 (m s".format(CLIMSTART)+r'$^{-1}$)', scatter=(lons, lats, anom))
        utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_WND_{}_merra_obs_anomaly".format(settings.YEAR), cube[0], \
                                       settings.COLOURMAP_DICT["circulation_r"], bounds, \
                                       "Anomalies from {}-2010 (m s".format(CLIMSTART)+r'$^{-1}$)', figtext="(v) Surface Winds", scatter=(lons, lats, anom))
        utils.plot_smooth_map_iris(settings.IMAGELOC + "WND_{}_merra_anomaly".format(settings.YEAR), cube[0], \
                                       settings.COLOURMAP_DICT["circulation_r"], bounds, \
                                       "Anomalies from {}-2010 (m s".format(CLIMSTART)+r'$^{-1}$)')

    #************************************************************************
    # MERRA/RSS ocean + HadISD Anomaly figure
    if True:
        # Read in MERRA/RSS trends
        anomalies = read_ocean_ncdf(
            DATALOC +
            "rss_wind_trend_anomaly_SOTC_{}_updated.nc".format(settings.YEAR),
            "Merged_wind_anomaly_map_{}".format(settings.YEAR))

        bounds = [-4, -1.2, -0.8, -0.4, -0.2, 0, 0.2, 0.4, 0.8, 1.2, 4]
        utils.plot_smooth_map_iris(settings.IMAGELOC + "WND_{}_merra-rss_anomaly".format(settings.YEAR), \
                                       anomalies, settings.COLOURMAP_DICT["circulation_r"], bounds, \
                                       "Anomalies from 1981-2010 (m s"+r'$^{-1}$)')
        utils.plot_smooth_map_iris(settings.IMAGELOC + "WND_{}_merra-rss_obs_anomaly".format(settings.YEAR), \
                                       anomalies, settings.COLOURMAP_DICT["circulation_r"], bounds, \
                                       "Anomalies from 1981-2010 (m s"+r'$^{-1}$)',
                                   scatter=(lons, lats, anom))
        utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_WND_{}_merra-rss_obs_anomaly".format(settings.YEAR), \
                                       anomalies, settings.COLOURMAP_DICT["circulation_r"], bounds, \
                                       "Anomalies from 1981-2010 (m s"+r'$^{-1}$)', figtext="(v) Surface Winds", scatter=(lons, lats, anom))

    #************************************************************************
    # Ocean timeseries
    if True:

        satellite = read_ts_cube(
            DATALOC +
            "rss_wind_trend_anomaly_SOTC_{}.nc".format(settings.YEAR),
            "RSS_wind_global_annual_anom_ts", "Satellite MW Radiometers")
        satellite_clim, satellite_anom = utils.calculate_climatology_and_anomalies_1d(
            satellite, 1988, 2010)

        #    print("NO IN SITU OCEAN DATA FOR 2016, using 2015 data")
        #    nocs = read_ts_cube(DATALOC + "NOCSv2.0_oceanW_5by5_8110anoms_areaTS_FEB2016.nc", "Globally Average 70S-70N", "NOCSv2.0")
        #    WASwind = read_ts_cube(DATALOC + "waswind_v1_0_1.monthly_areaTS_19502011.nc","Globally Averaged Anomalies 70S-70N", "WASwind")
        #    print("FIXING WASWIND TIMES - DATAFILE HAS WRONG DESCRIPTOR")
        #    WASwind.times = WASwind.times - (1973-1950)

        jra_actuals, jra_anoms = utils.read_jra55(
            settings.REANALYSISLOC + "JRA-55_ws10m_globalocean_ts.txt", "wind")

        era5_globe, era5_ocean, era5_land, era5tropics = utils.era5_ts_read(
            settings.REANALYSISLOC, "wnd", annual=True)
        ocean_era5_clim, ocean_era5_anoms = utils.calculate_climatology_and_anomalies_1d(
            era5_ocean, 1988, 2010)

        merra_anoms = utils.read_merra(
            settings.REANALYSISLOC +
            "MERRA-2_SfcAnom{}.dat".format(settings.YEAR),
            "wind",
            "O",
            anomalies=True)

        twenty_cr_actuals = utils.read_20cr(
            settings.REANALYSISLOC + "wspd10m.ocean.txt", "wind speed")
        dummy, twenty_cr_anoms = utils.calculate_climatology_and_anomalies_1d(
            twenty_cr_actuals, 1988, 2010)

        fig, (ax1) = plt.subplots(1, figsize=(8, 5), sharex=True)

        # Satellite
        #    utils.plot_ts_panel(ax1, [satellite_anom], "-", "circulation", loc=LEGEND_LOC, bbox=BBOX)

        # In Situ
        #    utils.plot_ts_panel(ax2, [nocs, WASwind], "-", "circulation", loc=LEGEND_LOC, bbox=BBOX)
        #    ax2.set_ylabel("Anomaly (m s"+r'$^{-1}$'+")", fontsize = settings.FONTSIZE)

        # Reanalyses & Satellite single panel
        satellite_anom.lw = 4
        satellite_anom.zorder = 10
        utils.plot_ts_panel(
            ax1,
            [satellite_anom, ocean_era5_anoms, merra_anoms, twenty_cr_anoms],
            "-",
            "circulation",
            loc=LEGEND_LOC,
            bbox=BBOX)

        #*******************
        # prettify
        ax1.axhline(0, c='0.5', ls='--')
        plt.ylabel("Wind Anomaly (m s" + r'$^{-1}$' + ")",
                   fontsize=settings.LABEL_FONTSIZE)
        ax1.legend(loc="upper right", ncol=1, frameon=False, prop={'size':settings.LEGEND_FONTSIZE}, \
                       labelspacing=0.1, columnspacing=0.5, bbox_to_anchor=(1.0, 0.99))

        # sort formatting
        plt.xlim([1970, int(settings.YEAR) + 1])

        for tick in ax1.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
    #    for ax in [ax1, ax2, ax3]:
        for ax in [ax1]:
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
            ax.set_ylim([-0.28, 0.45])
            ax.yaxis.set_ticks([-0.2, 0.0, 0.2, 0.4])
            ax.yaxis.set_ticks_position('left')

        # sort labelling
        ax1.text(0.03,
                 0.9,
                 "Satellites & Reanalyses",
                 transform=ax1.transAxes,
                 fontsize=settings.LABEL_FONTSIZE)
        #    ax2.text(0.03, 0.9, "(b) In Situ", transform=ax2.transAxes, fontsize=settings.LABEL_FONTSIZE)
        #    ax3.text(0.03, 0.9, "(b) Reanalyses", transform=ax3.transAxes, fontsize=settings.LABEL_FONTSIZE

        fig.subplots_adjust(right=0.95, top=0.95, hspace=0.001)

        plt.savefig(settings.IMAGELOC +
                    "WND_ocean_ts{}".format(settings.OUTFMT))

        plt.close()

    #************************************************************************
    # Ocean maps
    if True:
        anoms = read_ocean_ncdf(
            DATALOC +
            "rss_wind_trend_anomaly_SOTC_{}_updated.nc".format(settings.YEAR),
            "RSS_wind_anomaly_map_{}".format(settings.YEAR))

        bounds = [-40, -1.2, -0.8, -0.4, -0.2, 0, 0.2, 0.4, 0.8, 1.2, 40]

        utils.plot_smooth_map_iris(settings.IMAGELOC + "WND_{}_rss_anomaly".format(settings.YEAR), anoms, settings.COLOURMAP_DICT["circulation_r"], bounds,\
                                       "Anomalies from 1981-2010 (m s"+r'$^{-1}$'+")")

    #************************************************************************
    # MERRA/RSS ocean + HadISD Trend figure
    if True:
        # Read in MERRA/RSS trends
        trends = read_ocean_ncdf(
            DATALOC +
            "rss_wind_trend_anomaly_SOTC_{}_updated.nc".format(settings.YEAR),
            "Wind_trend_map")

        bounds = [-4, -0.8, -0.4, -0.2, -0.1, 0, 0.1, 0.2, 0.4, 0.8, 4]
        bounds = [-100, -0.4, -0.2, -0.1, -0.05, 0, 0.05, 0.1, 0.2, 0.4, 100]
        utils.plot_smooth_map_iris(settings.IMAGELOC + "WND_{}_merra-rss_trend".format(settings.YEAR), \
                                       trends, settings.COLOURMAP_DICT["circulation_r"], bounds, \
                                       "Trend from {}-{} (m s".format(TRENDSTART, settings.YEAR)+r'$^{-1}$'+" decade"+r'$^{-1}$)')
        utils.plot_smooth_map_iris(settings.IMAGELOC + "WND_{}_merra-rss_obs_trend".format(settings.YEAR), \
                                       trends, settings.COLOURMAP_DICT["circulation_r"], bounds, \
                                       "Trend from {}-{} (m s".format(TRENDSTART, settings.YEAR)+r'$^{-1}$'+" decade"+r'$^{-1}$)',
                                   scatter=(lons, lats, trend))

    return  # run_all_plots
Beispiel #26
0
def run_all_plots():

    #***************
    # Anomaly Scatter map
    anomalies = read_lakes(DATALOC +
                           "DATA_StateOfTheClimate_WaterLevelsAnom_v2.csv")

    bounds = [-2, -1, -0.75, -0.50, -0.25, 0, 0.25, 0.50, 0.75, 1, 2]

    lons = np.arange(-90, 120, 30)
    lats = np.arange(-180, 210, 30)
    dummy = np.ma.zeros((len(lats), len(lons)))
    dummy.mask = np.ones(dummy.shape)

    cube = utils.make_iris_cube_2d(dummy, lats, lons, "blank", "m")

    utils.plot_smooth_map_iris(settings.IMAGELOC + "LWL_anomaly", cube, settings.COLOURMAP_DICT["hydrological"], \
                                   bounds, "Anomalies from 1992-2002 (m)", \
                                   scatter=[anomalies[1], anomalies[0], anomalies[2]], figtext="", title="")
    utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_LWL_{}_anomaly".format(settings.YEAR), cube, settings.COLOURMAP_DICT["hydrological"], \
                                   bounds, "Anomalies from 1992-2002 (m)", \
                                   scatter=[anomalies[1], anomalies[0], anomalies[2]], figtext="(m) Lake Water Level", title="")

    #***************
    # multi-panel time series
    indata = read_continuous_csv(
        os.path.join(
            DATALOC,
            "DATA_StateOfTheLakes_WaterLevelAnomTimeSeries_sub_v1.csv"))
    names = np.array([d.name for d in indata])

    lake_order = [
        "Huron", "Superior", "Balkhash", "Tanganyika", "Caspian Sea",
        "Large Aral Sea", "Urmia", "Rukwa"
    ]

    # match HUM plot size

    fig, axes = plt.subplots(nrows=2, ncols=4, figsize=(16, 8), sharex=True)

    counter = 0
    for row in axes:
        for ax in row:

            lake, = np.where(names == lake_order[counter])[0]
            lake = indata[lake]

            utils.thicken_panel_border(ax)
            ax.plot(lake.times, lake.data, "k-")

            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
            for tick in ax.xaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

            ax.xaxis.set_major_locator(mdates.YearLocator(10))
            ax.xaxis.set_minor_locator(mdates.YearLocator(1))

            ax.text(0.1,
                    0.9,
                    lake.name,
                    fontsize=settings.FONTSIZE,
                    transform=ax.transAxes)

            ylim = ax.get_ylim()
            ax.set_ylim([ylim[0], ylim[1] * 1.2])

            counter += 1

    fig.text(0.01,
             0.5,
             "Lake Level (m)",
             rotation="vertical",
             va="center",
             fontsize=settings.FONTSIZE)
    fig.subplots_adjust(left=0.07,
                        right=0.99,
                        bottom=0.05,
                        top=0.99,
                        hspace=0.001)
    plt.savefig(settings.IMAGELOC +
                "LWL_ts_{}{}".format(settings.YEAR, settings.OUTFMT))

    #***************
    # Lake Cutouts

    EXTENTS = {
        "GL": (86, 45, [-93, -78, 41, 49]),
        "RU": (62, 42, [43, 81, 35, 48]),
        "AF": (31, -6, [28.5, 33, -10, -3])
    }

    for region in ["GL", "RU", "AF"]:
        if region == "AF":
            fig = plt.figure(figsize=(6, 8))
        elif region == "RU":
            fig = plt.figure(figsize=(18, 8))
        elif region == "GL":
            fig = plt.figure(figsize=(12, 8))

        plt.clf()
        ax = plt.axes([0.05, 0.05, 0.9, 0.9],
                      projection=cartopy.crs.PlateCarree(
                          central_longitude=EXTENTS[region][0]))

        ax.set_extent(EXTENTS[region][2], cartopy.crs.PlateCarree())

        ax.add_feature(cartopy.feature.LAND.with_scale('10m'),
                       zorder=0,
                       facecolor="0.75",
                       edgecolor="k")
        ax.add_feature(cartopy.feature.OCEAN.with_scale('10m'),
                       zorder=0,
                       facecolor="#e0ffff",
                       edgecolor="k")
        ax.add_feature(cartopy.feature.LAKES.with_scale('10m'),
                       zorder=0,
                       facecolor="#e0ffff",
                       edgecolor="k")
        ax.add_feature(cartopy.feature.RIVERS.with_scale('10m'),
                       zorder=0,
                       edgecolor="#e0ffff")
        ax.coastlines(resolution="10m", linewidth=0.5)

        # add other features
        gl = ax.gridlines(draw_labels=True)
        gl.xlabel_style = {'size': settings.FONTSIZE}
        gl.ylabel_style = {'size': settings.FONTSIZE}

        # add labels
        if region == "AF":
            ax.text(30,
                    -5,
                    "Tanganyika",
                    fontsize=settings.FONTSIZE,
                    transform=cartopy.crs.Geodetic())
            ax.text(32,
                    -7.5,
                    "Rukwa",
                    fontsize=settings.FONTSIZE,
                    transform=cartopy.crs.Geodetic())
        elif region == "RU":
            ax.text(46,
                    38,
                    "Urmia",
                    fontsize=settings.FONTSIZE,
                    transform=cartopy.crs.Geodetic())
            ax.text(52,
                    44,
                    "Caspian Sea",
                    fontsize=settings.FONTSIZE,
                    transform=cartopy.crs.Geodetic())
            ax.text(60.5,
                    45,
                    "Large Aral Sea",
                    fontsize=settings.FONTSIZE,
                    transform=cartopy.crs.Geodetic())
            ax.text(75,
                    45.5,
                    "Balkhash",
                    fontsize=settings.FONTSIZE,
                    transform=cartopy.crs.Geodetic())
        elif region == "GL":
            ax.text(-91,
                    46.2,
                    "Superior",
                    fontsize=settings.FONTSIZE,
                    transform=cartopy.crs.Geodetic())
            ax.text(-89,
                    42,
                    "Michigan",
                    fontsize=settings.FONTSIZE,
                    transform=cartopy.crs.Geodetic())
            ax.text(-84.5,
                    44.5,
                    "Huron",
                    fontsize=settings.FONTSIZE,
                    transform=cartopy.crs.Geodetic())

        plt.savefig(settings.IMAGELOC + "LWL_map_{}".format(region) +
                    settings.OUTFMT)
        plt.close()

    return  # run_all_plots
Beispiel #27
0
def run_all_plots():

    #************************************************************************
    # Timeseries figures
    if True:

        fig, (ax1, ax2, ax3) = plt.subplots(3, figsize=(8, 10), sharex=True)

        UAH, rss, ratpac, raobcore, rich, noaa, jra, merra = read_csv(
            DATALOC + "SotC_AnnTemps_2020_0220_LSTGL.csv")
        #        ssu2, ncar = read_ssu_csv(DATALOC + "2018_LTT_LST_SSU_date0401_SSU.csv")

        eral, erao, eralo = read_era5(DATALOC + "ERA5_TLS_GLOBAL")
        eralo_ann = utils.Timeseries("ERA5",
                                     np.reshape(eralo.times, [-1, 12])[:, 0],
                                     utils.annual_average(eralo.data))

        # Sondes [no RATPAC for 2019]
        utils.plot_ts_panel(ax1, [raobcore, rich],
                            "-",
                            "temperature",
                            loc=LEGEND_LOC)

        # satellites
        utils.plot_ts_panel(ax2, [UAH, noaa, rss],
                            "-",
                            "temperature",
                            loc=LEGEND_LOC)

        # reanalyses
        jra_actuals, jra_anoms = utils.read_jra55(
            settings.REANALYSISLOC + "JRA-55_MSUch4_global_ts.txt",
            "temperature")
        merra_actuals, merra_anoms = utils.read_merra_LT_LS(
            settings.REANALYSISLOC +
            "MERRA2_MSU_Tanom_ann_{}.dat".format(settings.YEAR),
            LS=True)
        utils.plot_ts_panel(ax3, [eralo_ann, jra_anoms, merra_anoms],
                            "-",
                            "temperature",
                            loc=LEGEND_LOC)

        #    ax3.set_ylabel("Anomaly ("+r'$^\circ$'+"C)", fontsize=settings.FONTSIZE)

        # Upper Stratosphere
        #        utils.plot_ts_panel(ax4, [ssu2, ncar], "-", "temperature", loc=LEGEND_LOC)

        # sort formatting
        plt.xlim([1957, raobcore.times[-1] + 1])

        for tick in ax3.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for ax in [ax1, ax2, ax3]:
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

            ax.set_ylim([-1.2, 2.2])

        # sort labelling
        ax1.text(0.02, 0.88, "(a) Radiosondes", transform=ax1.transAxes, \
                     fontsize=settings.LABEL_FONTSIZE)
        ax2.text(0.02, 0.88, "(b) Satellites", transform=ax2.transAxes, \
                     fontsize=settings.LABEL_FONTSIZE)
        ax3.text(0.02, 0.88, "(c) Reanalyses", transform=ax3.transAxes, \
                     fontsize=settings.LABEL_FONTSIZE)

        fig.text(0.01,
                 0.45,
                 "Anomaly (" + r'$^\circ$' + "C)",
                 fontsize=settings.FONTSIZE,
                 rotation="vertical")
        fig.subplots_adjust(right=0.98, top=0.98, bottom=0.04, hspace=0.001)

        plt.savefig(settings.IMAGELOC + "LST_ts{}".format(settings.OUTFMT))

        plt.close()

    #************************************************************************
    # Timeseries figures
    if True:

        fig, (ax1, ax2, ax3) = plt.subplots(3, figsize=(8, 10), sharex=True)

        ssu1, ssu1_2, ssu2, ssu2_2, ssu3, ssu3_2 = read_ssu(DATALOC +
                                                            "SSU.dat")

        # SSU3
        utils.plot_ts_panel(ax1, [ssu3, ssu3_2], "-", "temperature", loc="")
        # SSU2
        utils.plot_ts_panel(ax2, [ssu2, ssu2_2], "-", "temperature", loc="")
        # SSU1
        utils.plot_ts_panel(ax3, [ssu1, ssu1_2],
                            "-",
                            "temperature",
                            loc=LEGEND_LOC)

        # sort formatting
        plt.xlim([1957, ssu1.times[-1] + 2])

        for tick in ax3.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for ax in [ax1, ax2, ax3]:
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

            ax.set_ylim([-1.3, 2.2])

        # sort labelling
        ax1.text(0.02, 0.88, "(a) SSU3", transform=ax1.transAxes, \
                     fontsize=settings.LABEL_FONTSIZE)
        ax2.text(0.02, 0.88, "(b) SSU2", transform=ax2.transAxes, \
                     fontsize=settings.LABEL_FONTSIZE)
        ax3.text(0.02, 0.88, "(c) SSU1", transform=ax3.transAxes, \
                     fontsize=settings.LABEL_FONTSIZE)

        fig.text(0.01,
                 0.45,
                 "Anomaly (" + r'$^\circ$' + "C)",
                 fontsize=settings.FONTSIZE,
                 rotation="vertical")
        fig.subplots_adjust(right=0.98, top=0.98, bottom=0.04, hspace=0.001)

        plt.savefig(settings.IMAGELOC + "LST_SSU_ts{}".format(settings.OUTFMT))

        plt.close()

    #************************************************************************
    # Combined Timeseries figures
    if True:

        fig = plt.figure(figsize=(12, 8))

        # manually set up the 10 axes
        w = 0.42
        h = 0.31
        c = 0.51
        ax1 = plt.axes([c - w, 0.99 - h, w, h])
        ax2 = plt.axes([c, 0.99 - h, w, h])
        ax3 = plt.axes([c - w, 0.99 - (2 * h), w, h], sharex=ax1)
        ax4 = plt.axes([c, 0.99 - (2 * h), w, h], sharex=ax2)
        ax5 = plt.axes([c - w, 0.99 - (3 * h), w, h], sharex=ax1)
        ax6 = plt.axes([c, 0.99 - (3 * h), w, h], sharex=ax2)

        UAH, rss, ratpac, raobcore, rich, noaa, jra, merra = read_csv(
            DATALOC + "SotC_AnnTemps_2020_0220_LSTGL.csv")
        #        ssu2, ncar = read_ssu_csv(DATALOC + "2018_LTT_LST_SSU_date0401_SSU.csv")

        eral, erao, eralo = read_era5(DATALOC + "ERA5_TLS_GLOBAL")
        eralo_ann = utils.Timeseries("ERA5",
                                     np.reshape(eralo.times, [-1, 12])[:, 0],
                                     utils.annual_average(eralo.data))

        # update to ERA5.1 during revisions for SotC2019
        era51 = np.genfromtxt(DATALOC + "ERA5_1_update.dat")
        eralo_ann = utils.Timeseries("ERA5", era51[:, 0], era51[:, 1])

        # Sondes [no RATPAC for 2019]
        utils.plot_ts_panel(ax2, [raobcore, rich, ratpac],
                            "-",
                            "temperature",
                            loc=LEGEND_LOC)

        # satellites
        utils.plot_ts_panel(ax4, [UAH, noaa, rss],
                            "-",
                            "temperature",
                            loc=LEGEND_LOC)

        # reanalyses
        jra_actuals, jra_anoms = utils.read_jra55(
            settings.REANALYSISLOC + "JRA-55_MSUch4_global_ts.txt",
            "temperature")
        merra_actuals, merra_anoms = utils.read_merra_LT_LS(
            settings.REANALYSISLOC +
            "MERRA2_MSU_Tanom_ann_{}.dat".format(settings.YEAR),
            LS=True)
        utils.plot_ts_panel(ax6, [eralo_ann, jra_anoms, merra_anoms],
                            "-",
                            "temperature",
                            loc=LEGEND_LOC)

        ssu1, ssu1_2, ssu2, ssu2_2, ssu3, ssu3_2 = read_ssu(DATALOC +
                                                            "SSU.dat")

        # SSU3
        utils.plot_ts_panel(ax1, [ssu3, ssu3_2], "-", "temperature", loc="")
        # SSU2
        utils.plot_ts_panel(ax3, [ssu2, ssu2_2], "-", "temperature", loc="")
        # SSU1
        utils.plot_ts_panel(ax5, [ssu1, ssu1_2],
                            "-",
                            "temperature",
                            loc=LEGEND_LOC)

        # sort labelling
        for ax in [ax2, ax4, ax6]:
            ax.yaxis.tick_right()
            for tick in ax.yaxis.get_major_ticks():
                tick.label2.set_fontsize(settings.FONTSIZE)
        for ax in [ax1, ax3, ax5]:
            ax.yaxis.tick_right()
            ax.yaxis.set_ticks_position('left')

        ax2.text(0.02, 0.88, "(d) Radiosondes", transform=ax2.transAxes, \
                     fontsize=settings.LABEL_FONTSIZE)
        ax4.text(0.02, 0.88, "(e) Satellites", transform=ax4.transAxes, \
                     fontsize=settings.LABEL_FONTSIZE)
        ax6.text(0.02, 0.88, "(f) Reanalyses", transform=ax6.transAxes, \
                     fontsize=settings.LABEL_FONTSIZE)

        ax1.text(0.02, 0.88, "(a) SSU3", transform=ax1.transAxes, \
                     fontsize=settings.LABEL_FONTSIZE)
        ax3.text(0.02, 0.88, "(b) SSU2", transform=ax3.transAxes, \
                     fontsize=settings.LABEL_FONTSIZE)
        ax5.text(0.02, 0.88, "(c) SSU1", transform=ax5.transAxes, \
                     fontsize=settings.LABEL_FONTSIZE)

        plt.setp([a.get_xticklabels() for a in fig.axes[:-2]], visible=False)

        # sort formatting
        ax1.set_xlim([1957, raobcore.times[-1] + 3])
        ax2.set_xlim([1957, raobcore.times[-1] + 3])

        for ax in [ax5, ax6]:
            for tick in ax.xaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)
        for ax in [ax1, ax2, ax3, ax4, ax5, ax6]:
            for tick in ax.yaxis.get_major_ticks():
                tick.label.set_fontsize(settings.FONTSIZE)

            ax.set_ylim([-1.2, 2.2])

        fig.text(0.01,
                 0.55,
                 "Anomaly (" + r'$^\circ$' + "C)",
                 fontsize=settings.FONTSIZE,
                 rotation="vertical")
        fig.subplots_adjust(right=0.98, top=0.98, bottom=0.04, hspace=0.001)

        plt.savefig(settings.IMAGELOC +
                    "LST_combined_ts{}".format(settings.OUTFMT))

        plt.close()

    #************************************************************************
    # Polar Figure
    if False:
        fig, ax1 = plt.subplots(figsize=(8, 5))

        north, south = read_polar(DATALOC +
                                  "polar_data_{}.dat".format(settings.YEAR))

        ax1.plot(north.times, north.data, c="b", ls="-", label=north.name)
        ax1.plot(south.times, south.data, c="r", ls="-", label=south.name)

        ax1.legend(loc=LEGEND_LOC,
                   frameon=False,
                   prop={'size': settings.FONTSIZE})
        ax1.set_xlim([1978, 2018 + 2])
        ax1.set_ylabel("Anomaly (" + r'$^\circ$' + "C)",
                       fontsize=settings.FONTSIZE)

        utils.thicken_panel_border(ax1)

        plt.savefig(settings.IMAGELOC +
                    "LST_polar_ts{}".format(settings.OUTFMT))

        for tick in ax1.yaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)
        for tick in ax1.xaxis.get_major_ticks():
            tick.label.set_fontsize(settings.FONTSIZE)

        plt.close()

    #************************************************************************
    # Polar and QBO Timeseries figures

    # fig, (ax1, ax2, ax3) = plt.subplots(3, figsize=(8, 10), sharex=True)

    # north, south, qbo = read_qbo_csv(DATALOC + "SOC_Strat_Data_QBO.csv")

    # noaa_qbo = read_qbo_ncdf(DATALOC + "qbo_noaa.nc", "NOAA v4.0")
    # uah_qbo = read_qbo_ncdf(DATALOC + "qbo_uah.nc", "UAH v6.0")
    # rss_qbo = read_qbo_ncdf(DATALOC + "qbo_rss.nc", "RSS v3.3")

    # utils.plot_ts_panel(ax1, [north], "-", "temperature", loc="")
    # utils.plot_ts_panel(ax2, [south], "-", "temperature", loc="")
    # utils.plot_ts_panel(ax3, [noaa_qbo, uah_qbo, rss_qbo], "-", "temperature", loc="", lw=1)

    # lines3, labels3 = ax3.get_legend_handles_labels()

    # plt.figlegend(lines3, labels3, "lower center", frameon=False, ncol=3, fontsize=settings.FONTSIZE)

    # ax1.set_ylabel("Anomaly ("+r'$^\circ$'+"C)", fontsize=settings.FONTSIZE)
    # ax2.set_ylabel("Anomaly ("+r'$^\circ$'+"C)", fontsize=settings.FONTSIZE)
    # ax3.set_ylabel("QBO Index", fontsize=settings.FONTSIZE)

    # ax1.text(0.02, 0.88, "(a) North Polar Pentad Anomalies", transform=ax1.transAxes, \
    #              fontsize=settings.LABEL_FONTSIZE)
    # ax2.text(0.02, 0.88, "(b) South Polar Pentad Anomalies", transform=ax2.transAxes, \
    #              fontsize=settings.LABEL_FONTSIZE)
    # ax3.text(0.02, 0.88, "(c) QBO from Lower Stratospheric Temperature", transform=ax3.transAxes, \
    #              fontsize=settings.LABEL_FONTSIZE)

    # ax3.text(-0.15, 0.88, "West", transform=ax3.transAxes, fontsize=settings.LABEL_FONTSIZE)
    # ax3.text(-0.15, 0.01, "East", transform=ax3.transAxes, fontsize=settings.LABEL_FONTSIZE)

    # # sort formatting
    # plt.xlim([1978, int(settings.YEAR)+1])

    # for tick in ax3.xaxis.get_major_ticks():
    #     tick.label.set_fontsize(settings.FONTSIZE)
    # for ax in [ax1, ax2, ax3]:
    #     for tick in ax.yaxis.get_major_ticks():
    #         tick.label.set_fontsize(settings.FONTSIZE)

    # ax1.set_ylim([-10, 19])
    # ax2.set_ylim([-10, 23])
    # ax3.set_ylim([-1.1, 1.4])

    # fig.subplots_adjust(right=0.95, top=0.95, hspace=0.001)

    # plt.savefig(settings.IMAGELOC+"LST_qbo_ts{}".format(settings.OUTFMT))

    # plt.close()

    #************************************************************************
    # MERRA Trop and Strat Timeseries figures

    # fourh, threeh, twofiveh, twoh, onefiveh, fourtwoav, oneh, seventy, fifty, thirty, twenty, ten, seventytwentyav = read_merra_monthly(DATALOC + "MERRA2_400_20_temp_anom_1980-{}.txt".format(settings.YEAR))

    # fourtwoav.data = np.ma.masked_where(fourtwoav.times < 1994, fourtwoav.data)
    # seventytwentyav.data = np.ma.masked_where(seventytwentyav.times < 1994, seventytwentyav.data)
    # fourtwoav.times = np.ma.masked_where(fourtwoav.times < 1994, fourtwoav.times)
    # seventytwentyav.times = np.ma.masked_where(seventytwentyav.times < 1994, seventytwentyav.times)

    # fig, (ax1, ax2) = plt.subplots(2, figsize = (8, 8), sharex=True)

    # # trop
    # fit = utils.fit_plot_points(0.025, -50.01, fourtwoav.times)
    # ax1.plot(fourh.times, fit, c="0.5", lw = 2, ls = "-", label = "fit", zorder = 10)
    # utils.plot_ts_panel(ax1, [fourh, threeh, twofiveh, twoh, fourtwoav], "-", "lst", loc = LEGEND_LOC)
    # # strat
    # fit = utils.fit_plot_points(-0.0014, 2.4527, seventytwentyav.times)
    # ax2.plot(fourh.times, fit, c="0.5", lw = 2, ls = "-", label = "fit", zorder = 10)
    # utils.plot_ts_panel(ax2, [seventy, fifty, thirty, twenty, seventytwentyav], "-", "lst", loc = LEGEND_LOC)

    # # sort formatting
    # plt.xlim([1978, fourh.times[-1]+1])
    # ax1.set_ylim([-1.7,1.5])
    # ax2.set_ylim([-2.0,2.7])

    # for tick in ax2.xaxis.get_major_ticks():
    #     tick.label.set_fontsize(settings.FONTSIZE)
    # for ax in [ax1, ax2]:
    #     for tick in ax.yaxis.get_major_ticks():
    #         tick.label.set_fontsize(settings.FONTSIZE)

    # # sort labelling
    # ax1.text(0.02, 0.9, "(a) MERRA-2 Troposphere", transform = ax1.transAxes, fontsize = settings.LABEL_FONTSIZE)
    # ax2.text(0.02, 0.9, "(b) MERRA-2 Stratosphere", transform = ax2.transAxes, fontsize = settings.LABEL_FONTSIZE)

    # ax1.text(0.7, 0.9, "y=0.025x - 50.01", transform = ax1.transAxes, fontsize = settings.LABEL_FONTSIZE*0.8)
    # ax2.text(0.7, 0.9, "y=-0.0014x + 2.4527", transform = ax2.transAxes, fontsize = settings.LABEL_FONTSIZE*0.8)

    # ax1.set_ylabel("Anomaly ("+r'$^\circ$'+"C)", fontsize = settings.FONTSIZE)
    # ax2.set_ylabel("Anomaly ("+r'$^\circ$'+"C)", fontsize = settings.FONTSIZE)

    # fig.subplots_adjust(right = 0.95, top = 0.95, hspace = 0.001)

    # plt.savefig(settings.IMAGELOC+"LST_merra_ts{}".format(settings.OUTFMT))

    # plt.close()

    #************************************************************************
    # Zonal figures

    # fig, (ax1, ax2) = plt.subplots(1, 2, figsize = (8, 6.5), sharey=True)

    # cfsr, merra, era, jra = read_zonal(DATALOC + "TLS_Reanal_zonal_trends_1994-{}.txt".format(settings.YEAR), "R")
    # star, uah, rss = read_zonal(DATALOC + "TLS_Satellite_zonal_trends_1994-{}.txt".format(settings.YEAR), "S")

    # # Reanalyses
    # utils.plot_ts_panel(ax1, [cfsr, merra, era, jra], "--", "temperature", loc = "lower left", ncol = 1)

    # # Satellite
    # utils.plot_ts_panel(ax2, [star, uah, rss], "--", "temperature", loc = "center right", ncol = 1)

    # ax1.axvline(0,color = "0.5", ls = "--")
    # ax2.axvline(0,color = "0.5", ls = "--")

    # # sort formatting
    # plt.ylim([-90,90])
    # ax1.set_ylabel("Latitude", fontsize = settings.LABEL_FONTSIZE)
    # ax1.set_xlabel("Trend ("+r'$^\circ$'+"C decade"+r'$^{-1}$'+")", fontsize = settings.FONTSIZE)
    # ax2.set_xlabel("Trend ("+r'$^\circ$'+"C decade"+r'$^{-1}$'+")", fontsize = settings.FONTSIZE)

    # for tick in ax1.yaxis.get_major_ticks():
    #     tick.label.set_fontsize(settings.FONTSIZE)
    # for ax in [ax1, ax2]:
    #     ax.set_xlim([-0.3,0.6])
    #     ax.set_xticks(np.arange(-0.2,0.8,0.2))
    #     ax.set_yticks(np.arange(-90,120,30))
    #     for tick in ax.xaxis.get_major_ticks():
    #         tick.label.set_fontsize(settings.FONTSIZE)

    # # sort labelling
    # ax1.text(0.02, 0.9, "(a) Radiosondes", transform = ax1.transAxes, fontsize = settings.LABEL_FONTSIZE)
    # ax2.text(0.02, 0.9, "(b) Satellites", transform = ax2.transAxes, fontsize = settings.LABEL_FONTSIZE)

    # fig.subplots_adjust(right = 0.95, top = 0.95, hspace = 0.001)

    # plt.savefig(settings.IMAGELOC+"LST_profiles{}".format(settings.OUTFMT))

    # plt.close()

    #************************************************************************
    # ERA5 Anomaly figure
    if True:
        # Read in ERA anomalies

        cube_list = iris.load(settings.REANALYSISLOC +
                              "era5_tls_{}01-{}12_ann_ano.nc".format(
                                  settings.YEAR, settings.YEAR))

        cube = cube_list[0]
        cube.coord('latitude').guess_bounds()
        cube.coord('longitude').guess_bounds()

        bounds = [-4, -1.2, -0.8, -0.4, -0.2, 0, 0.2, 0.4, 0.8, 1.2, 4]

        utils.plot_smooth_map_iris(settings.IMAGELOC + "LST_{}_anoms_era5".format(settings.YEAR), cube[0], \
                                   settings.COLOURMAP_DICT["temperature"], bounds, "Anomalies from 1981-2010 ("+r'$^{\circ}$'+"C)", title="ERA5")
        utils.plot_smooth_map_iris(settings.IMAGELOC + "p2.1_LST_{}_anoms_era5".format(settings.YEAR), cube[0], \
                                   settings.COLOURMAP_DICT["temperature"], bounds, "Anomalies from 1981-2010 ("+r'$^{\circ}$'+"C)", \
                                   figtext="(f) Lower Stratosphere Temperature")

    #************************************************************************
    # merra Anomaly figure
    if False:
        import netCDF4 as ncdf

        ncfile = ncdf.Dataset(settings.REANALYSISLOC +
                              "merra2_tls_ANNUAL_anom.nc")

        var = ncfile.variables["TLS ANOM"][:]  # this is a masked array
        nlons = ncfile.variables["LONGITUDES"][:]
        nlats = ncfile.variables["LATITUDES"][:]

        cube = utils.make_iris_cube_2d(var, nlats, nlons, "LST", "C")

        utils.plot_smooth_map_iris(
            settings.IMAGELOC + "LST_{}_anoms_merra".format(settings.YEAR),
            cube, settings.COLOURMAP_DICT["temperature"], bounds,
            "Anomalies from 1981-2010 (" + r'$^{\circ}$' + "C)")

    #************************************************************************
    # 2015 MERRA seasonal figure

    # import netCDF4 as ncdf

    # month_list = []

    # for month in MONTHS:
    #     print month

    #     # IRIS doesn't like the whitespace in the "TLS ANOM"
    #     ncfile=ncdf.Dataset(settings.REANALYSISLOC + "merra2_tls_{}_anom.nc".format(month.upper()),'r')

    #     var=ncfile.variables["TLS ANOM"][:] # this is a masked array
    #     lons = ncfile.variables["LONGITUDES"][:]
    #     lats = ncfile.variables["LATITUDES"][:]

    #     ncfile.close()

    #     cube = utils.make_iris_cube_2d(var, lats, lons, "TLS_ANOM", "C")

    #     month_list += [cube]

    # # pass to plotting routine
    # utils.plot_smooth_map_iris_multipanel(settings.IMAGELOC + "LST_{}_monthly_merra".format(settings.YEAR), month_list, \
    #                                           settings.COLOURMAP_DICT["temperature"], bounds, \
    #                                           "Anomaly ("+r'$^{\circ}$'+"C)", shape = (6,2), \
    #                                           title = MONTHS, \
    #                                           figtext = ["(a)","(b)","(c)","(d)", "(e)","(f)","(g)","(h)","(i)","(j)","(k)","(l)"])

    return  # run_all_plots