Esempio n. 1
0
def plot(reference, test, diff, metrics_dict, parameter):

    # Create figure, projection
    fig = plt.figure(figsize=[8.5, 11.0])
    proj = ccrs.PlateCarree(central_longitude=180)

    # First two panels
    min1  = metrics_dict['test']['min']
    mean1 = metrics_dict['test']['mean']
    max1  = metrics_dict['test']['max']

    plot_panel(0, fig, proj, test, parameter.contour_levels, 'viridis', (parameter.test_name,parameter.test_title,test.units),stats=(max1,mean1,min1))

    min2  = metrics_dict['ref']['min']
    mean2 = metrics_dict['ref']['mean']
    max2  = metrics_dict['ref']['max']
    plot_panel(1, fig, proj, reference, parameter.contour_levels, 'viridis', (parameter.reference_name,parameter.reference_title,reference.units),stats=(max2,mean2,min2))

    # Third panel
    min3  = metrics_dict['diff']['min']
    mean3 = metrics_dict['diff']['mean']
    max3  = metrics_dict['diff']['max']
    r = metrics_dict['misc']['rmse']
    c = metrics_dict['misc']['corr']
    plot_panel(2, fig, proj, diff, parameter.diff_levels, 'RdBu_r', (None,parameter.diff_title,None), stats=(max3,mean3,min3,r,c))

    # Figure title
    fig.suptitle(parameter.main_title, x=0.5, y=0.96, fontsize=18)

    # Save figure
    for f in parameter.output_format:
        f = f.lower().split('.')[-1]
        fnm = os.path.join(get_output_dir('5', parameter), parameter.output_file)
        plt.savefig(fnm + '.' + f)
        print('Plot saved in: ' + fnm + '.' + f)
Esempio n. 2
0
def plot(reference, test, diff, metrics_dict, parameter):

    # Create figure, projection
    fig = plt.figure(figsize=[8.5, 11.0])
    #    proj = ccrs.PlateCarree(central_longitude=180)
    proj = None
    ax = fig.add_axes(panel[0])
    ax.plot(test.getLatitude()[:], ma.squeeze(test.asma()), 'k', linewidth=2)

    ax.plot(reference.getLatitude()[:],
            ma.squeeze(reference.asma()),
            'r',
            linewidth=2)
    ax1 = fig.add_axes(panel[1])
    ax1.plot(diff.getLatitude()[:], ma.squeeze(diff.asma()), 'k', linewidth=2)
    fig.text(panel[0][0],
             panel[0][2] + 0.095,
             "Test: " + parameter.test_name,
             ha='left',
             fontdict=plotSideTitle,
             color='black')
    fig.text(panel[0][0],
             panel[0][2] + 0.07,
             "Reference: " + parameter.reference_name,
             ha='left',
             fontdict=plotSideTitle,
             color='red')
    fig.text(panel[1][0],
             panel[0][2] - 0.3,
             "Test-Reference",
             ha='left',
             fontdict=plotSideTitle)
    ax.set_xticks([-90, -60, -30, 0, 30, 60, 90])  #crs=ccrs.PlateCarree())
    ax.set_xlim(-90, 90)
    ax1.set_xticks([-90, -60, -30, 0, 30, 60, 90])  #crs=ccrs.PlateCarree())
    ax1.set_xlim(-90, 90)
    ##    lon_formatter = LongitudeFormatter(zero_direction_label=True, number_format='.0f')
    lat_formatter = LatitudeFormatter()
    #    ax.xaxis.set_major_formatter(lon_formatter)
    #ax.xaxis.set_major_formatter(lat_formatter)
    #ax1.xaxis.set_major_formatter(lat_formatter)
    ax.tick_params(labelsize=11.0, direction='out', pad=-2, width=1)
    ax1.tick_params(labelsize=11.0, direction='out', pad=-2, width=1)
    ax.xaxis.set_ticks_position('bottom')
    ax1.xaxis.set_ticks_position('bottom')
    ax.set_ylabel(test.long_name + ' (' + test.units + ')')
    ax1.set_ylabel(test.long_name + ' (' + test.units + ')')
    #    ax.yaxis.set_ticks_position('left')
    #
    fig.suptitle(parameter.main_title, x=0.5, y=0.95, fontsize=18)
    #    plt.show()
    #
    # Save figure
    for f in parameter.output_format:
        f = f.lower().split('.')[-1]
        fnm = os.path.join(get_output_dir('3', parameter),
                           parameter.output_file)
        plt.savefig(fnm + '.' + f)
        print('Plot saved in: ' + fnm + '.' + f)
Esempio n. 3
0
def plot(reference, test, diff, metrics_dict, parameter):

    # Create figure, projection
    fig = plt.figure(figsize=parameter.figsize, dpi=parameter.dpi)
    # proj = ccrs.PlateCarree(central_longitude=180)
    ax = fig.add_axes(panel[0])
    ax.plot(test.getLatitude()[:], ma.squeeze(test.asma()), 'k', linewidth=2)

    ax.plot(reference.getLatitude()[:], ma.squeeze(
        reference.asma()), 'r', linewidth=2)
    ax1 = fig.add_axes(panel[1])
    ax1.plot(diff.getLatitude()[:], ma.squeeze(diff.asma()), 'k', linewidth=2)
    ax1.axhline(y=0, color='0.5')

    test_title = "Test" if parameter.test_title == '' else parameter.test_title
    test_title += ' : {}'.format(parameter.test_name_yrs)
    fig.text(panel[0][0], panel[0][2] + 0.095, test_title,
             ha='left', fontdict=plotSideTitle, color='black')

    ref_title = "Reference" if parameter.reference_title == '' else parameter.reference_title
    ref_title += ' : {}'.format(parameter.reference_name)
    fig.text(panel[0][0], panel[0][2] + 0.07, ref_title,
             ha='left', fontdict=plotSideTitle, color='red')
    fig.text(panel[1][0], panel[0][2] - 0.3, parameter.diff_title,
             ha='left', fontdict=plotSideTitle)
    ax.set_xticks([-90, -60, -30, 0, 30, 60, 90])  # crs=ccrs.PlateCarree())
    ax.set_xlim(-90, 90)
    ax1.set_xticks([-90, -60, -30, 0, 30, 60, 90])  # crs=ccrs.PlateCarree())
    ax1.set_xlim(-90, 90)
    # lon_formatter = LongitudeFormatter(zero_direction_label=True, number_format='.0f')
    LatitudeFormatter()
    # ax.xaxis.set_major_formatter(lon_formatter)
    # ax.xaxis.set_major_formatter(lat_formatter)
    # ax1.xaxis.set_major_formatter(lat_formatter)
    ax.tick_params(labelsize=11.0, direction='out', width=1)
    ax1.tick_params(labelsize=11.0, direction='out', width=1)
    ax.xaxis.set_ticks_position('bottom')
    ax1.xaxis.set_ticks_position('bottom')
    ax.set_ylabel(test.long_name + ' (' + test.units + ')')
    ax1.set_ylabel(test.long_name + ' (' + test.units + ')')
    # ax.yaxis.set_ticks_position('left')

    fig.suptitle(parameter.main_title, x=0.5, y=0.95, fontsize=18)

    # Save figure
    for f in parameter.output_format:
        f = f.lower().split('.')[-1]
        fnm = os.path.join(get_output_dir(
            parameter.current_set, parameter), parameter.output_file)
        plt.savefig(fnm + '.' + f)
        _chown(fnm + '.' + f, parameter.user)
        print('Plot saved in: ' + fnm + '.' + f)
Esempio n. 4
0
def plot(reference, test, diff, metrics_dict, parameter):

    # Create figure, projection
    fig = plt.figure(figsize=[8.5, 11.0])

    # Create projection
    print parameter.var_region
    if parameter.var_region.find('N') !=-1:
        pole = 'N'
        proj = ccrs.NorthPolarStereo(central_longitude=0)
    elif parameter.var_region.find('S') !=-1:
        pole = 'S'
        proj = ccrs.SouthPolarStereo(central_longitude=0)

    # First two panels
    min1  = metrics_dict['test']['min']
    mean1 = metrics_dict['test']['mean']
    max1  = metrics_dict['test']['max']
    if test.count() >1: 
        plot_panel(0, fig, proj, pole, test, parameter.contour_levels, 'viridis', (parameter.test_name,parameter.test_title,test.units),stats=(max1,mean1,min1))

    min2  = metrics_dict['ref']['min']
    mean2 = metrics_dict['ref']['mean']
    max2  = metrics_dict['ref']['max']

    if reference.count() >1: 
        plot_panel(1, fig, proj, pole, reference, parameter.contour_levels, 'viridis', (parameter.reference_name,parameter.reference_title,reference.units),stats=(max2,mean2,min2))

    # Third panel
    min3  = metrics_dict['diff']['min']
    mean3 = metrics_dict['diff']['mean']
    max3  = metrics_dict['diff']['max']
    r = metrics_dict['misc']['rmse']
    c = metrics_dict['misc']['corr']

    if diff.count() >1: 
        plot_panel(2, fig, proj, pole, diff, parameter.diff_levels, 'RdBu_r', (None,parameter.diff_title,None), stats=(max3,mean3,min3,r,c))

    # Figure title
    fig.suptitle(parameter.main_title, x=0.5, y=0.97, fontsize=18)

    # Save figure
    for f in parameter.output_format:
        f = f.lower().split('.')[-1]
        fnm = os.path.join(get_output_dir('7', parameter), parameter.output_file)
        plt.savefig(fnm + '.' + f)
        print('Plot saved in: ' + fnm + '.' + f)
def plot(reference, test, diff, _, parameter):

    # Create figure, projection
    projection = 'None'
    fig = plt.figure(figsize=[8.5, 11.0])

    plot_panel(0, fig, _, test, parameter.contour_levels, 'rainbow',
               (parameter.test_name, parameter.test_title, test.units),
               parameter)
    plot_panel(
        1, fig, _, reference, parameter.contour_levels, 'rainbow',
        (parameter.reference_name, parameter.reference_title, test.units),
        parameter)
    plot_panel(2, fig, _, diff, parameter.diff_levels, parameter.diff_colormap,
               (parameter.diff_name, parameter.diff_title, test.units),
               parameter)

    #    min2  = metrics_dict['ref']['min']
    #    mean2 = metrics_dict['ref']['mean']
    #    max2  = metrics_dict['ref']['max']
    #    plot_panel(1, fig, proj, reference, parameter.contour_levels, 'viridis', (parameter.reference_name,parameter.reference_title,reference.units),stats=(max2,mean2,min2))
    #
    #    # Third panel
    #    min3  = metrics_dict['diff']['min']
    #    mean3 = metrics_dict['diff']['mean']
    #    max3  = metrics_dict['diff']['max']
    #    r = metrics_dict['misc']['rmse']
    #    c = metrics_dict['misc']['corr']
    #    plot_panel(2, fig, proj, diff, parameter.diff_levels, 'RdBu_r', (None,parameter.diff_title,None), stats=(max3,mean3,min3,r,c))
    #

    # Figure title
    fig.suptitle(parameter.main_title, x=0.5, y=0.96, fontsize=18)

    # Save figure
    for f in parameter.output_format:
        f = f.lower().split('.')[-1]
        fnm = os.path.join(get_output_dir(parameter.current_set, parameter),
                           parameter.output_file)
        plt.savefig(fnm + '.' + f)
        _chown(fnm + '.' + f, parameter.user)
        print('Plot saved in: ' + fnm + '.' + f)
Esempio n. 6
0
def plot(reference, test, diff, metrics_dict, parameter):

    # Create figure
    fig = plt.figure(figsize=parameter.figsize, dpi=parameter.dpi)

    # Top panel
    ax1 = fig.add_axes(panel[0])
    ax1.plot(test.getLatitude()[:], ma.squeeze(test.asma()), 'k', linewidth=2)
    ax1.plot(reference.getLatitude()[:],
             ma.squeeze(reference.asma()),
             'r',
             linewidth=2)
    ax1.set_xticks([-90, -60, -30, 0, 30, 60, 90])
    ax1.set_xlim(-90, 90)
    ax1.tick_params(labelsize=11.0, direction='out', width=1)
    ax1.xaxis.set_ticks_position('bottom')
    ax1.set_ylabel(test.long_name + ' (' + test.units + ')')

    test_title = "Test" if parameter.test_title == '' else parameter.test_title
    test_title += ' : {}'.format(parameter.test_name_yrs)
    ref_title = "Reference" if parameter.reference_title == '' else parameter.reference_title
    ref_title += ' : {}'.format(parameter.reference_name)
    fig.text(panel[0][0],
             panel[0][1] + panel[0][3] + 0.03,
             test_title,
             ha='left',
             fontdict=plotSideTitle,
             color='black')
    fig.text(panel[0][0],
             panel[0][1] + panel[0][3] + 0.01,
             ref_title,
             ha='left',
             fontdict=plotSideTitle,
             color='red')

    # Bottom panel
    ax2 = fig.add_axes(panel[1])
    ax2.plot(diff.getLatitude()[:], ma.squeeze(diff.asma()), 'k', linewidth=2)
    ax2.axhline(y=0, color='0.5')
    ax2.set_title(parameter.diff_title, fontdict=plotSideTitle, loc='center')
    ax2.set_xticks([-90, -60, -30, 0, 30, 60, 90])
    ax2.set_xlim(-90, 90)
    ax2.tick_params(labelsize=11.0, direction='out', width=1)
    ax2.xaxis.set_ticks_position('bottom')
    ax2.set_ylabel(test.long_name + ' (' + test.units + ')')

    # Figure title
    fig.suptitle(parameter.main_title, x=0.5, y=0.95, fontsize=18)

    # Save figure
    for f in parameter.output_format:
        f = f.lower().split('.')[-1]
        fnm = os.path.join(get_output_dir(parameter.current_set, parameter),
                           parameter.output_file + '.' + f)
        plt.savefig(fnm)
        # Get the filename that the user has passed in and display that.
        # When running in a container, the paths are modified.
        fnm = os.path.join(
            get_output_dir(parameter.current_set,
                           parameter,
                           ignore_container=True),
            parameter.output_file + '.' + f)
        print('Plot saved in: ' + fnm)

    # Save individual subplots
    for f in parameter.output_format_subplot:
        fnm = os.path.join(get_output_dir(parameter.current_set, parameter),
                           parameter.output_file)
        page = fig.get_size_inches()
        i = 0
        for p in panel:
            # Extent of subplot
            subpage = np.array(p).reshape(2, 2)
            subpage[1, :] = subpage[0, :] + subpage[1, :]
            subpage = subpage + np.array(border).reshape(2, 2)
            subpage = list(((subpage) * page).flatten())
            extent = matplotlib.transforms.Bbox.from_extents(*subpage)
            # Save subplot
            fname = fnm + '.%i.' % (i) + f
            plt.savefig(fname, bbox_inches=extent)

            orig_fnm = os.path.join(
                get_output_dir(parameter.current_set,
                               parameter,
                               ignore_container=True), parameter.output_file)
            fname = orig_fnm + '.%i.' % (i) + f
            print('Sub-plot saved in: ' + fname)

            i += 1

    plt.close()
Esempio n. 7
0
def plot(reference, test, diff, metrics_dict, parameter):
    vcs_canvas = vcs.init(bg=True,
                          geometry=(parameter.canvas_size_w,
                                    parameter.canvas_size_h))
    parameter.case_id

    file_path = os.path.join(acme_diags.INSTALL_PATH, 'polar')
    vcs_canvas.scriptrun(os.path.join(file_path, 'plot_set_7.json'))
    vcs_canvas.scriptrun(os.path.join(file_path, 'plot_set_7_new.json'))

    template_test = vcs_canvas.gettemplate('plotset7_0_x_0')
    template_ref = vcs_canvas.gettemplate('plotset7_0_x_1')
    template_diff = vcs_canvas.gettemplate('plotset7_0_x_2')

    template_test.title.x = 0.01
    template_test.dataname.x = 0.01
    template_test.dataname.y = template_test.title.y - 0.02
    template_test.data.y1 -= 0.025
    template_test.data.y2 -= 0.02

    template_ref.title.x = 0.01
    template_ref.dataname.x = 0.01
    template_ref.dataname.y = template_ref.title.y - 0.02
    template_ref.data.y1 -= 0.025
    template_ref.data.y2 -= 0.025

    template_diff.title.x = 0.01
    template_diff.dataname.x = 0.01
    template_diff.dataname.y = template_diff.title.y - 0.02
    template_diff.data.y1 -= 0.025
    template_diff.data.y2 -= 0.025

    utils.set_units(test, parameter.test_units)
    utils.set_units(reference, parameter.reference_units)
    utils.set_units(diff, parameter.diff_units)

    test.long_name = parameter.test_title
    reference.long_name = parameter.reference_title
    diff.long_name = parameter.diff_title

    test.id = parameter.test_name_yrs
    reference.id = parameter.reference_name
    diff.id = parameter.diff_name

    # model and observation graph
    utils.plot_min_max_mean(textcombined_objs, vcs_canvas, metrics_dict,
                            'test')
    utils.plot_min_max_mean(textcombined_objs, vcs_canvas, metrics_dict, 'ref')
    utils.plot_min_max_mean(textcombined_objs, vcs_canvas, metrics_dict,
                            'diff')

    reference_isofill = vcs.getisofill('reference_isofill')
    reference_isofill.missing = 'grey'
    reference_isofill.xticlabels1 = {
        0: "0",
        30: "30$^\circ$E",
        60: "60$^\circ$E",
        90: "90$^\circ$E",
        120: "120$^\circ$E",
        150: "150$^\circ$E",
        180: "180$^\circ$W",
        210: "150$^\circ$W",
        240: "120$^\circ$W",
        270: "90$^\circ$W",
        300: "60$^\circ$W",
        330: "30$^\circ$W"
    }

    test_isofill = vcs.getisofill('test_isofill')
    test_isofill.missing = 'grey'
    test_isofill.xticlabels1 = {
        0: "0",
        30: "30$^\circ$E",
        60: "60$^\circ$E",
        90: "90$^\circ$E",
        120: "120$^\circ$E",
        150: "150$^\circ$E",
        180: "180$^\circ$W",
        210: "150$^\circ$W",
        240: "120$^\circ$W",
        270: "90$^\circ$W",
        300: "60$^\circ$W",
        330: "30$^\circ$W"
    }

    diff_isofill = vcs.getisofill('diff_isofill')
    diff_isofill.missing = 'grey'
    diff_isofill.xticlabels1 = {
        0: "0",
        30: "30$^\circ$E",
        60: "60$^\circ$E",
        90: "90$^\circ$E",
        120: "120$^\circ$E",
        150: "150$^\circ$E",
        180: "180$^\circ$W",
        210: "150$^\circ$W",
        240: "120$^\circ$W",
        270: "90$^\circ$W",
        300: "60$^\circ$W",
        330: "30$^\circ$W"
    }

    if parameter.var_region.lower().find('polar') != -1:
        reference_isofill.projection = 'polar'
        test_isofill.projection = 'polar'
        diff_isofill.projection = 'polar'
        if parameter.var_region.find('S') != -1:
            lat_y1 = -90
            lat_y2 = -55
        elif parameter.var_region.find('N') != -1:
            lat_y1 = 90
            lat_y2 = 50

        # this should extracted from selected domain
        reference_isofill.datawc_y1 = lat_y1
        reference_isofill.datawc_y2 = lat_y2
        test_isofill.datawc_y1 = lat_y1  # this should extracted from selected domain
        test_isofill.datawc_y2 = lat_y2
        diff_isofill.datawc_y1 = lat_y1  # this should extracted from selected domain
        diff_isofill.datawc_y2 = lat_y2

    utils.set_levels_of_graphics_method(reference_isofill,
                                        parameter.contour_levels, reference,
                                        test)
    utils.set_levels_of_graphics_method(test_isofill, parameter.contour_levels,
                                        test, reference)
    utils.set_levels_of_graphics_method(diff_isofill, parameter.diff_levels,
                                        diff)

    if parameter.arrows:
        reference_isofill.ext_1 = True
        reference_isofill.ext_2 = True
        test_isofill.ext_1 = True
        test_isofill.ext_2 = True
        diff_isofill.ext_1 = True
        diff_isofill.ext_2 = True

    utils.set_colormap_of_graphics_method(vcs_canvas,
                                          parameter.reference_colormap,
                                          reference_isofill, parameter)
    utils.set_colormap_of_graphics_method(vcs_canvas, parameter.test_colormap,
                                          test_isofill, parameter)
    utils.set_colormap_of_graphics_method(vcs_canvas, parameter.diff_colormap,
                                          diff_isofill, parameter)

    vcs_canvas.plot(utils.add_cyclic(test), template_test, test_isofill)
    vcs_canvas.plot(utils.add_cyclic(reference), template_ref,
                    reference_isofill)
    vcs_canvas.plot(utils.add_cyclic(diff), template_diff, diff_isofill)

    utils.plot_rmse_and_corr(textcombined_objs, vcs_canvas, metrics_dict)

    # Plotting the main title
    main_title = utils.managetextcombined(textcombined_objs, 'main_title',
                                          'main_title', vcs_canvas)
    main_title.string = parameter.main_title
    main_title.y = [0.985]
    # for some reason, this needs to be before a call to vcs_canvas.plot()
    vcs_canvas.portrait()
    vcs_canvas.plot(main_title)

    if not parameter.logo:
        vcs_canvas.drawlogooff()

    fnm = os.path.join(get_output_dir(parameter.current_set, parameter),
                       parameter.output_file)
    for f in parameter.output_format:
        f = f.lower().split('.')[-1]
        if f == 'png':
            vcs_canvas.png(fnm)
            _chown(fnm + '.png', parameter.user)
        elif f == 'pdf':
            vcs_canvas.pdf(fnm)
            _chown(fnm + '.pdf', parameter.user)
        elif f == 'svg':
            vcs_canvas.svg(fnm)
            _chown(fnm + '.svg', parameter.user)
        print('Plot saved in: ' + fnm + '.' + f)
    vcs_canvas.clear()
Esempio n. 8
0
def plot(reference, test, diff, _, parameter):

    # Create figure, projection
    fig = plt.figure(figsize=parameter.figsize, dpi=parameter.dpi)

    plot_panel(0, fig, _, test, parameter.contour_levels, 'rainbow',
               (parameter.test_name_yrs, parameter.test_title, test.units),
               parameter)
    plot_panel(
        1, fig, _, reference, parameter.contour_levels, 'rainbow',
        (parameter.reference_name, parameter.reference_title, test.units),
        parameter)
    plot_panel(2, fig, _, diff, parameter.diff_levels, parameter.diff_colormap,
               (parameter.diff_name, parameter.diff_title, test.units),
               parameter)

    #    min2  = metrics_dict['ref']['min']
    #    mean2 = metrics_dict['ref']['mean']
    #    max2  = metrics_dict['ref']['max']
    #    plot_panel(1, fig, proj, reference, parameter.contour_levels, 'viridis',
    #              (parameter.reference_name,parameter.reference_title,reference.units),stats=(max2,mean2,min2))
    #
    #    # Third panel
    #    min3  = metrics_dict['diff']['min']
    #    mean3 = metrics_dict['diff']['mean']
    #    max3  = metrics_dict['diff']['max']
    #    r = metrics_dict['misc']['rmse']
    #    c = metrics_dict['misc']['corr']
    #    plot_panel(2, fig, proj, diff, parameter.diff_levels, 'RdBu_r', (None,parameter.diff_title,None), stats=(max3,mean3,min3,r,c))
    #

    # Figure title
    fig.suptitle(parameter.main_title, x=0.5, y=0.96, fontsize=18)

    # Save figure
    for f in parameter.output_format:
        f = f.lower().split('.')[-1]
        fnm = os.path.join(get_output_dir(parameter.current_set, parameter),
                           parameter.output_file + '.' + f)
        plt.savefig(fnm)
        # Get the filename that the user has passed in and display that.
        # When running in a container, the paths are modified.
        fnm = os.path.join(
            get_output_dir(parameter.current_set,
                           parameter,
                           ignore_container=True),
            parameter.output_file + '.' + f)
        print('Plot saved in: ' + fnm)

    # Save individual subplots
    for f in parameter.output_format_subplot:
        fnm = os.path.join(get_output_dir(parameter.current_set, parameter),
                           parameter.output_file)
        page = fig.get_size_inches()
        i = 0
        for p in panel:
            # Extent of subplot
            subpage = np.array(p).reshape(2, 2)
            subpage[1, :] = subpage[0, :] + subpage[1, :]
            subpage = subpage + np.array(border).reshape(2, 2)
            subpage = list(((subpage) * page).flatten())
            extent = matplotlib.transforms.Bbox.from_extents(*subpage)
            # Save subplot
            fname = fnm + '.%i.' % (i) + f
            plt.savefig(fname, bbox_inches=extent)

            orig_fnm = os.path.join(
                get_output_dir(parameter.current_set,
                               parameter,
                               ignore_container=True), parameter.output_file)
            fname = orig_fnm + '.%i.' % (i) + f
            print('Sub-plot saved in: ' + fname)

            i += 1

    plt.close()
Esempio n. 9
0
def plot(reference, test, diff, metrics_dict, parameter):
    vcs_canvas = vcs.init(bg=True,
                          geometry=(parameter.canvas_size_w,
                                    parameter.canvas_size_h))
    parameter.case_id

    file_path = os.path.join(acme_diags.INSTALL_PATH, 'lat_lon')
    vcs_canvas.scriptrun(os.path.join(file_path, 'plot_set_5.json'))
    vcs_canvas.scriptrun(os.path.join(file_path, 'plot_set_5_new.json'))

    template_test = vcs_canvas.gettemplate('plotset5_0_x_0')
    template_ref = vcs_canvas.gettemplate('plotset5_0_x_1')
    template_diff = vcs_canvas.gettemplate('plotset5_0_x_2')

    utils.set_units(test, parameter.test_units)
    utils.set_units(reference, parameter.reference_units)
    utils.set_units(diff, parameter.diff_units)

    test.long_name = parameter.test_title
    reference.long_name = parameter.reference_title
    diff.long_name = parameter.diff_title

    test.id = parameter.test_name_yrs
    reference.id = parameter.reference_name
    diff.id = parameter.diff_name

    # model and observation graph
    utils.plot_min_max_mean(textcombined_objs, vcs_canvas, metrics_dict,
                            'test')
    utils.plot_min_max_mean(textcombined_objs, vcs_canvas, metrics_dict, 'ref')
    utils.plot_min_max_mean(textcombined_objs, vcs_canvas, metrics_dict,
                            'diff')

    reference_isofill = vcs.getisofill('reference_isofill')
    reference_isofill.missing = 'grey'
    reference_isofill.yticlabels1 = {
        -90: "90$^\circ$S",
        -60: "60$^\circ$S",
        -30: "30$^\circ$S",
        0: "0$^\circ$",
        30: "30$^\circ$N",
        60: "60$^\circ$N",
        90: "90$^\circ$N"
    }
    test_isofill = vcs.getisofill('test_isofill')
    test_isofill.missing = 'grey'
    test_isofill.yticlabels1 = {
        -90: "90$^\circ$S",
        -60: "60$^\circ$S",
        -30: "30$^\circ$S",
        0: "0$^\circ$",
        30: "30$^\circ$N",
        60: "60$^\circ$N",
        90: "90$^\circ$N"
    }
    diff_isofill = vcs.getisofill('diff_isofill')
    diff_isofill.missing = 'grey'
    diff_isofill.yticlabels1 = {
        -90: "90$^\circ$S",
        -60: "60$^\circ$S",
        -30: "30$^\circ$S",
        0: "0$^\circ$",
        30: "30$^\circ$N",
        60: "60$^\circ$N",
        90: "90$^\circ$N"
    }

    utils.set_levels_of_graphics_method(reference_isofill,
                                        parameter.contour_levels, reference,
                                        test)
    utils.set_levels_of_graphics_method(test_isofill, parameter.contour_levels,
                                        test, reference)
    utils.set_levels_of_graphics_method(diff_isofill, parameter.diff_levels,
                                        diff)

    if parameter.arrows:
        reference_isofill.ext_1 = True
        reference_isofill.ext_2 = True
        test_isofill.ext_1 = True
        test_isofill.ext_2 = True
        diff_isofill.ext_1 = True
        diff_isofill.ext_2 = True

    utils.set_colormap_of_graphics_method(vcs_canvas,
                                          parameter.reference_colormap,
                                          reference_isofill, parameter)
    utils.set_colormap_of_graphics_method(vcs_canvas, parameter.test_colormap,
                                          test_isofill, parameter)
    utils.set_colormap_of_graphics_method(vcs_canvas, parameter.diff_colormap,
                                          diff_isofill, parameter)

    vcs_canvas.plot(utils.add_cyclic(test), template_test, test_isofill)
    vcs_canvas.plot(utils.add_cyclic(reference), template_ref,
                    reference_isofill)
    vcs_canvas.plot(utils.add_cyclic(diff), template_diff, diff_isofill)

    utils.plot_rmse_and_corr(textcombined_objs, vcs_canvas, metrics_dict)
    # for some reason, this needs to be before a call to vcs_canvas.plot()
    vcs_canvas.portrait()

    # Plotting the main title
    main_title = utils.managetextcombined(textcombined_objs, 'main_title',
                                          'main_title', vcs_canvas)
    main_title.string = parameter.main_title
    vcs_canvas.plot(main_title)

    if not parameter.logo:
        vcs_canvas.drawlogooff()

    fnm = os.path.join(get_output_dir(parameter.current_set, parameter),
                       parameter.output_file)
    for f in parameter.output_format:
        f = f.lower().split('.')[-1]
        if f == 'png':
            vcs_canvas.png(fnm)
            _chown(fnm + '.png', parameter.user)
        elif f == 'pdf':
            vcs_canvas.pdf(fnm)
            _chown(fnm + '.pdf', parameter.user)
        elif f == 'svg':
            vcs_canvas.svg(fnm)
            _chown(fnm + '.svg', parameter.user)
        print('Plot saved in: ' + fnm + '.' + f)
    vcs_canvas.clear()
Esempio n. 10
0
def run_diag(parameter):
    parameter.reference_data_path
    parameter.test_data_path

    variables = parameter.variables
    seasons = parameter.seasons
    ref_name = parameter.ref_name
    regions = parameter.regions

    for season in seasons:
        try:
            filename1 = utils.get_test_filename(parameter, season)
            filename2 = utils.get_ref_filename(parameter, season)
        except IOError as e:
            print(e)
            # the file for the current parameters wasn't found, move to next
            # parameters
            continue

        print('test file: {}'.format(filename1))
        print('reference file: {}'.format(filename2))

        f_mod = cdms2.open(filename1)
        f_obs = cdms2.open(filename2)

        if parameter.short_test_name:
            parameter.test_name_yrs = parameter.short_test_name
        else:
            parameter.test_name_yrs = parameter.test_name

        try:
            yrs_averaged = f_mod.getglobal('yrs_averaged')
            parameter.test_name_yrs = parameter.test_name_yrs + ' (' + yrs_averaged + ')'

        except:
            print('No yrs_averaged exists in global attributes')
            parameter.test_name_yrs = parameter.test_name_yrs

        # save land/ocean fraction for masking
        try:
            land_frac = f_mod('LANDFRAC')
            ocean_frac = f_mod('OCNFRAC')
        except BaseException:
            mask_path = os.path.join(acme_diags.INSTALL_PATH,
                                     'acme_ne30_ocean_land_mask.nc')
            f0 = cdms2.open(mask_path)
            land_frac = f0('LANDFRAC')
            ocean_frac = f0('OCNFRAC')
            f0.close()

        for var in variables:
            print('Variable: {}'.format(var))
            parameter.var_id = var
            mv1 = acme.process_derived_var(var, acme.derived_variables, f_mod,
                                           parameter)
            mv2 = acme.process_derived_var(var, acme.derived_variables, f_obs,
                                           parameter)

            parameter.viewer_descr[var] = mv1.long_name if hasattr(
                mv1, 'long_name') else 'No long_name attr in test data.'

            # special case, cdms didn't properly convert mask with fill value
            # -999.0, filed issue with denise
            if ref_name == 'WARREN':
                # this is cdms2 for bad mask, denise's fix should fix
                mv2 = MV2.masked_where(mv2 == -0.9, mv2)
                # following should move to derived variable
            if ref_name == 'AIRS':
                # mv2=MV2.masked_where(mv2==mv2.fill_value,mv2)
                # this is cdms2 for bad mask, denise's fix should fix
                mv2 = MV2.masked_where(mv2 > 1e+20, mv2)
            if ref_name == 'WILLMOTT' or ref_name == 'CLOUDSAT':
                print(mv2.fill_value)
                # mv2=MV2.masked_where(mv2==mv2.fill_value,mv2)
                # this is cdms2 for bad mask, denise's fix should fix
                mv2 = MV2.masked_where(mv2 == -999., mv2)
                print(mv2.fill_value)

                # following should move to derived variable
                if var == 'PRECT_LAND':
                    days_season = {
                        'ANN': 365,
                        'DJF': 90,
                        'MAM': 92,
                        'JJA': 92,
                        'SON': 91
                    }
                    # mv1 = mv1 * days_season[season] * 0.1 #following AMWG
                    # approximate way to convert to seasonal cumulative
                    # precipitation, need to have solution in derived variable,
                    # unit convert from mm/day to cm
                    mv2 = mv2 / days_season[season] / \
                        0.1  # convert cm to mm/day instead
                    mv2.units = 'mm/day'

            if mv1.getLevel() and mv2.getLevel():  # for variables with z axis:
                plev = parameter.plevs
                print('Selected pressure level: {}'.format(plev))
                f_ins = [f_mod, f_obs]
                for f_ind, mv in enumerate([mv1, mv2]):
                    mv_plv = mv.getLevel()
                    # var(time,lev,lon,lat) convert from hybrid level to
                    # pressure
                    if mv_plv.long_name.lower().find('hybrid') != -1:
                        f_in = f_ins[f_ind]
                        hyam = f_in('hyam')
                        hybm = f_in('hybm')
                        ps = f_in('PS')  # Pa

                        mv_p = utils.hybrid_to_plevs(mv, hyam, hybm, ps, plev)

                    # levels are presure levels
                    elif mv_plv.long_name.lower().find(
                            'pressure') != -1 or mv_plv.long_name.lower().find(
                                'isobaric') != -1:
                        mv_p = utils.pressure_to_plevs(mv, plev)

                    else:
                        raise RuntimeError(
                            "Vertical level is neither hybrid nor pressure. Abort"
                        )
                    if f_ind == 0:
                        mv1_p = mv_p
                    if f_ind == 1:
                        mv2_p = mv_p
                # select plev
                for ilev in range(len(plev)):
                    mv1 = mv1_p[ilev, ]
                    mv2 = mv2_p[ilev, ]

                    # select region
                    if len(regions) == 0:
                        regions = ['global']

                    for region in regions:
                        print("Selected region: {}".format(region))

                        mv1_domain, mv2_domain = utils.select_region(
                            region, mv1, mv2, land_frac, ocean_frac, parameter)

                        parameter.output_file = '-'.join([
                            ref_name, var,
                            str(int(plev[ilev])), season, region
                        ])
                        parameter.main_title = str(' '.join(
                            [var,
                             str(int(plev[ilev])), 'mb', season, region]))

                        # Regrid towards lower resolution of two variables for
                        # calculating difference
                        mv1_reg, mv2_reg = utils.regrid_to_lower_res(
                            mv1_domain, mv2_domain, parameter.regrid_tool,
                            parameter.regrid_method)

                        # Plotting
                        diff = mv1_reg - mv2_reg
                        metrics_dict = create_metrics(mv2_domain, mv1_domain,
                                                      mv2_reg, mv1_reg, diff)

                        metrics_dict['unit'] = mv1_reg.units

                        fnm = os.path.join(
                            get_output_dir(parameter.current_set, parameter),
                            parameter.output_file + '.json')
                        with open(fnm, 'w') as outfile:
                            json.dump(metrics_dict, outfile)
                        # Get the filename that the user has passed in and display that.
                        # When running in a container, the paths are modified.
                        fnm = os.path.join(
                            get_output_dir(parameter.current_set,
                                           parameter,
                                           ignore_container=True),
                            parameter.output_file + '.json')
                        print('Metrics saved in: ' + fnm)

                        parameter.var_region = region
                        plot(parameter.current_set, mv2_domain, mv1_domain,
                             diff, metrics_dict, parameter)
                        utils.save_ncfiles(parameter.current_set, mv1_domain,
                                           mv2_domain, diff, parameter)

                # f_in.close()

            # for variables without z axis:
            elif mv1.getLevel() is None and mv2.getLevel() is None:

                # select region
                if len(regions) == 0:
                    regions = ['global']

                for region in regions:
                    print("Selected region: {}".format(region))

                    mv1_domain, mv2_domain = utils.select_region(
                        region, mv1, mv2, land_frac, ocean_frac, parameter)

                    parameter.output_file = '-'.join(
                        [ref_name, var, season, region])
                    parameter.main_title = str(' '.join([var, season, region]))

                    # regrid towards lower resolution of two variables for
                    # calculating difference
                    mv1_reg, mv2_reg = utils.regrid_to_lower_res(
                        mv1_domain, mv2_domain, parameter.regrid_tool,
                        parameter.regrid_method)

                    # if var is 'SST' or var is 'TREFHT_LAND': #special case

                    if var == 'TREFHT_LAND' or var == 'SST':  # use "==" instead of "is"
                        if ref_name == 'WILLMOTT':
                            mv2_reg = MV2.masked_where(
                                mv2_reg == mv2_reg.fill_value, mv2_reg)
                            print(ref_name)

                            # if mv.mask is False:
                            #    mv = MV2.masked_less_equal(mv, mv._FillValue)
                            #    print("*************",mv.count())
                        land_mask = MV2.logical_or(mv1_reg.mask, mv2_reg.mask)
                        mv1_reg = MV2.masked_where(land_mask, mv1_reg)
                        mv2_reg = MV2.masked_where(land_mask, mv2_reg)

                    diff = mv1_reg - mv2_reg
                    metrics_dict = create_metrics(mv2_domain, mv1_domain,
                                                  mv2_reg, mv1_reg, diff)

                    metrics_dict['unit'] = mv1_reg.units

                    fnm = os.path.join(
                        get_output_dir(parameter.current_set, parameter),
                        parameter.output_file + '.json')
                    with open(fnm, 'w') as outfile:
                        json.dump(metrics_dict, outfile)
                    # Get the filename that the user has passed in and display that.
                    # When running in a container, the paths are modified.
                    fnm = os.path.join(
                        get_output_dir(parameter.current_set,
                                       parameter,
                                       ignore_container=True),
                        parameter.output_file + '.json')
                    print('Metrics saved in: ' + fnm)

                    parameter.var_region = region
                    plot(parameter.current_set, mv2_domain, mv1_domain, diff,
                         metrics_dict, parameter)
                    utils.save_ncfiles(parameter.current_set, mv1_domain,
                                       mv2_domain, diff, parameter)

            else:
                raise RuntimeError(
                    "Dimensions of two variables are difference. Abort")
        f_obs.close()
        f_mod.close()
    return parameter
Esempio n. 11
0
def create_viewer(root_dir, parameters, ext):
    """Based of the parameters, find the files with
    extension ext and create the viewer in root_dir."""

    viewer = OutputViewer(path=root_dir, index_name='ACME Diagnostics')
    _add_pages_and_top_row(viewer, parameters)

    for parameter in parameters:
        for set_num in parameter.sets:
            set_num = get_set_name(set_num)

            # Add all of the files with extension ext from the case_id/ folder'
            pth = get_output_dir(set_num, parameter)  # ex: myresults/lat_lon

            # Filenames are like:
            # ref_name-variable-season-region
            # or
            # ref_name-variable-plev'mb'-season-region
            ref_name = parameter.ref_name
            for var in parameter.variables:
                for season in parameter.seasons:
                    for region in parameter.regions:
                        row_name_and_fnm = [
                        ]  # because some parameters have plevs, there might be more than one row_name, fnm pair

                        if parameter.plevs == []:  # 2d variables
                            row_name = '{} {}'.format(var, region)
                            fnm = '{}-{}-{}-{}'.format(ref_name, var, season,
                                                       region)
                            row_name_and_fnm.append((row_name, fnm))
                        else:  # 3d variables
                            for plev in parameter.plevs:
                                row_name = '{} {} {}'.format(
                                    var,
                                    str(int(plev)) + ' mb', region)
                                fnm = '{}-{}-{}-{}-{}'.format(
                                    ref_name, var, int(plev), season, region)
                                row_name_and_fnm.append((row_name, fnm))

                        for row_name, fnm in row_name_and_fnm:
                            if parameter.case_id not in ROW_INFO[set_num]:
                                ROW_INFO[set_num][
                                    parameter.
                                    case_id] = collections.OrderedDict()
                            if row_name not in ROW_INFO[set_num][
                                    parameter.case_id]:
                                ROW_INFO[set_num][parameter.case_id][
                                    row_name] = collections.OrderedDict()
                                ROW_INFO[set_num][parameter.case_id][row_name][
                                    'descr'] = _get_description(
                                        var, parameter)
                            # format fnm to support relative paths
                            ROW_INFO[set_num][parameter.case_id][row_name][
                                season] = os.path.join('..',
                                                       '{}'.format(set_num),
                                                       parameter.case_id, fnm)

    # add all of the files in from the case_id/ folder in ANN, DJF, MAM, JJA, SON order
    for set_num in ROW_INFO:
        viewer.set_page("{}".format(_better_page_name(set_num)))

        for group in ROW_INFO[set_num]:
            try:
                viewer.set_group(group)
            except RuntimeError:
                viewer.add_group(group)

            for row_name in ROW_INFO[set_num][group]:
                try:
                    viewer.set_row(row_name)
                except RuntimeError:
                    # row of row_name wasn't in the viewer, so add it
                    viewer.add_row(row_name)
                    viewer.add_col(
                        ROW_INFO[set_num][group][row_name]
                        ['descr'])  # the description, currently the var

                for col_season in viewer.page.columns[
                        1:]:  # [1:] is to ignore 'Description' col
                    fnm = ROW_INFO[set_num][group][row_name][col_season]
                    formatted_files = []
                    if parameters[0].save_netcdf:
                        nc_files = [
                            fnm + nc_ext
                            for nc_ext in ['_test.nc', '_ref.nc', '_diff.nc']
                        ]
                        formatted_files = [{
                            'url': f,
                            'title': f
                        } for f in nc_files]
                    viewer.add_col(fnm + '.' + ext,
                                   is_file=True,
                                   title=col_season,
                                   other_files=formatted_files)

    viewer.generate_viewer(prompt_user=False)
    _extras(root_dir, parameters)
Esempio n. 12
0
def plot(ref, test, diff, metrics_dict, parameters):
    vcs_canvas = vcs.init(bg=True,
                          geometry=(parameters.canvas_size_w,
                                    parameters.canvas_size_h))

    # Line options, see here: https://uvcdat.llnl.gov/documentation/vcs/vcs-10.html
    # Other options not in the above link: https://uvcdat.llnl.gov/docs/vcs/graphics/unified1D.html
    ref_plot_linetype = 0
    ref_plot_color = 215  # 6 to 239
    ref_plot_width = 3  # 1 to 100
    ref_plot_marker = 1
    ref_plot_markersize = 1
    ref_plot_markercolor = 215

    test_plot_linetype = 0
    test_plot_color = 1
    test_plot_width = 3
    test_plot_marker = 1
    test_plot_markersize = 1
    test_plot_markercolor = 1

    diff_plot_linetype = 0
    diff_plot_color = 1
    diff_plot_width = 3
    diff_plot_marker = 1
    diff_plot_markersize = 1
    diff_plot_markercolor = 1

    file_path = os.path.join(sys.prefix, 'share', 'acme_diags', 'set3')
    vcs_canvas.scriptrun(os.path.join(file_path, 'plot_set_3.json'))

    set_units(test, parameters.test_units)
    set_units(ref, parameters.reference_units)
    set_units(diff, parameters.diff_units)

    if hasattr(test, 'long_name'):
        test.long_name = parameters.test_title if parameters.test_title is not '' else test.long_name
    if hasattr(ref, 'long_name'):
        ref.long_name = parameters.reference_title if parameters.reference_title is not '' else ref.long_name
    if hasattr(diff, 'long_name'):
        diff.long_name = parameters.diff_title if parameters.diff_title is not '' else diff.long_name

    test.id = str(
        parameters.test_name) if parameters.test_name is not '' else test.id
    ref.id = str(parameters.reference_name
                 ) if parameters.reference_name is not '' else ref.id
    diff.id = str(
        parameters.diff_name) if parameters.diff_name is not '' else diff.id

    # use vcs_canvas.show('colormap') to view all colormaps
    vcs_canvas.setcolormap(
        'rainbow')  # 6 to 239 are purple to red in rainbow order

    ref_test_template = vcs.gettemplate('ref_test_template')

    ref_test_yaxis_title = managetextcombined('ref_test_yaxis_title',
                                              'ref_test_yaxis_title',
                                              vcs_canvas)
    ref_test_yaxis_title.angle = 270
    ref_test_yaxis_title.halign = 'center'
    ref_test_yaxis_title.y = (ref_test_template.data.y1 +
                              ref_test_template.data.y2) / 2
    ref_test_yaxis_title.x = ref_test_template.data.x1 - 0.08
    ref_test_yaxis_title.string = test.long_name + ' (' + test.units + ')'
    vcs_canvas.plot(ref_test_yaxis_title)

    ref_test_template.legend.priority = 0
    ref_test_template.title.priority = 0

    # make all of the elements listed have priority = 0
    # ref_test_template.blank(["mean", "max", "min", "zvalue", "crtime", "ytic2", "xtic2"])

    # the actual box around the plot
    ref_test_template.box1.x1 = 0.1223
    ref_test_template.box1.x2 = 0.96
    ref_test_template.box1.y1 = 0.55
    ref_test_template.box1.y2 = 0.90

    # data (the lines) need to be offset accordingly
    ref_test_template.data.x1 = 0.1223
    ref_test_template.data.x2 = 0.96
    ref_test_template.data.y1 = 0.55
    ref_test_template.data.y2 = 0.90

    # ref_test_template.legend.x1 = 0.88
    # ref_test_template.legend.x2 = 0.98
    # ref_test_template.legend.y1 = 0.96
    # ref_test_template.legend.y2 = 0.88
    # ref_test_template.legend.textorientation = 'defright'

    # ref_test_template.title.x = 0.5
    # ref_test_template.title.textorientation = 'defcenter'

    ref_test_template.units.textorientation = 'defright'
    ref_test_template.units.x = 0.96
    ref_test_template.units.y = 0.91

    # labels on xaxis
    ref_test_template.xlabel1.y = (0.55) - 0.02  # no xlabel1.x attribute

    # actual ticks on xaxis
    ref_test_template.xtic1.y1 = (0.55 - 0.005) + 0.01
    ref_test_template.xtic1.y2 = (0.55 - 0.005)

    # name of xaxis
    # ref_test_template.xname.y += 0.29

    # labels on yaxis
    ref_test_template.ylabel1.x = 0.11  # no ylabel1.y attribute

    # actual ticks on yaxis
    ref_test_template.ytic1.x1 = (0.1223 - 0.006) + 0.01
    ref_test_template.ytic1.x2 = (0.1223 - 0.006)

    diff_template = vcs.gettemplate('diff_template')

    diff_yaxis_title = managetextcombined('diff_yaxis_title',
                                          'diff_yaxis_title', vcs_canvas)
    diff_yaxis_title.angle = 270
    diff_yaxis_title.halign = 'center'
    diff_yaxis_title.y = (diff_template.data.y1 + diff_template.data.y2) / 2
    diff_yaxis_title.x = diff_template.data.x1 - 0.08
    diff_yaxis_title.string = test.long_name + ' (' + test.units + ')'
    vcs_canvas.plot(diff_yaxis_title)

    diff_template.units.textorientation = 'defright'
    diff_template.units.x += 0.01
    diff_template.legend.priority = 0

    diff_template.ytic1.x1 = (0.1223 - 0.006) + 0.01
    diff_template.ytic1.x2 = (0.1223 - 0.006)
    diff_template.ylabel1.x = 0.11  # no ylabel1.y attribute
    diff_template.units.textorientation = 'defright'
    diff_template.units.x = 0.96
    '''
    diff_template.box1.y1 -= 0.47
    diff_template.box1.y2 -= 0.47

    diff_template.data.y1 -= 0.47
    diff_template.data.y2 -= 0.47

    diff_template.legend.y1 -= 0.47
    diff_template.legend.y2 -= 0.47

    diff_template.title.y -= 0.47
    diff_template.units.y -= 0.47

    diff_template.xlabel1.y -= 0.47

    diff_template.xtic1.y1 -= 0.47
    diff_template.xtic1.y2 -= 0.47

    diff_template.xname.y -= 0.47
    diff_template.yname.y -= 0.47
    '''

    ref_line = vcs_canvas.getxvsy('ref_plot')
    ref_line.datawc_y1 = min(ref.min(), test.min())
    ref_line.datawc_y2 = max(ref.max(), test.max())
    ref_line.datawc_x1 = -90
    ref_line.datawc_x2 = 90
    ref_line.xticlabels1 = {
        -90: "90S",
        -60: "60S",
        -30: "30S",
        0: "Eq",
        30: "30N",
        60: "60N",
        90: "90N"
    }

    test_line = vcs_canvas.getxvsy('test_plot')
    test_line.datawc_y1 = min(ref.min(), test.min())
    test_line.datawc_y2 = max(ref.max(), test.max())
    test_line.datawc_x1 = -90
    test_line.datawc_x2 = 90

    diff_line = vcs_canvas.getxvsy('diff_plot')
    diff_line.datawc_y1 = diff.min()
    diff_line.datawc_y2 = diff.max()
    diff_line.datawc_x1 = -90
    diff_line.datawc_x2 = 90
    diff_line.xticlabels1 = {
        -90: "90S",
        -60: "60S",
        -30: "30S",
        0: "Eq",
        30: "30N",
        60: "60N",
        90: "90N"
    }

    #ref_line.line = ref_plot_linetype
    ref_line.linetype = ref_plot_linetype
    ref_line.linecolor = ref_plot_color
    ref_line.linewidth = ref_plot_width
    ref_line.marker = ref_plot_marker
    ref_line.markersize = ref_plot_markersize
    ref_line.markercolor = ref_plot_markercolor

    #test_line.line = test_plot_linetype
    test_line.linetype = test_plot_linetype
    test_line.linecolor = test_plot_color
    test_line.linewidth = test_plot_width
    test_line.marker = test_plot_marker
    test_line.markersize = test_plot_markersize
    test_line.markercolor = test_plot_markercolor
    # test_line.smooth = 1

    #diff_line.line = diff_plot_linetype
    diff_line.linetype = diff_plot_linetype
    diff_line.linecolor = diff_plot_color
    diff_line.linewidth = diff_plot_width
    diff_line.marker = diff_plot_marker
    diff_line.markersize = diff_plot_markersize
    diff_line.markercolor = diff_plot_markercolor

    blank_template = vcs_canvas.gettemplate('blank_template')
    blank_template.legend.priority = 0
    #blank_template.blank()
    #blank_template.legend.priority = 1
    #blank_template.legend.y1 -= 0.05
    #blank_template.legend.y2 -= 0.05

    # vcs_canvas.plot(ref, ref_line, ref_test_template, xname='Latitude')
    vcs_canvas.plot(ref, ref_line, ref_test_template)
    vcs_canvas.plot(test, test_line, blank_template)
    # vcs_canvas.plot(diff, diff_line, diff_template, xname='Latitude')
    vcs_canvas.plot(diff, diff_line, diff_template)

    # Plot the main title
    main_title = managetextcombined('main_title', 'main_title', vcs_canvas)
    main_title.string = parameters.main_title
    vcs_canvas.portrait(
    )  # for some reason, this needs to be before a call to vcs_canvas.plot()
    vcs_canvas.plot(main_title)

    test_title = managetextcombined('test_title', 'test_title', vcs_canvas)
    test_title.string = "Test: " + str(parameters.test_name)
    test_title.color = 1
    test_title.x = ref_test_template.data.x1 - 0.05
    test_title.y = ref_test_template.data.y2 + 0.045
    test_title.height = 12
    vcs_canvas.plot(test_title)

    ref_title = managetextcombined('ref_title', 'ref_title', vcs_canvas)
    ref_title.string = "Reference: " + str(parameters.reference_name)
    ref_title.color = 215
    ref_title.x = ref_test_template.data.x1 - 0.05
    ref_title.y = ref_test_template.data.y2 + 0.025
    ref_title.height = 12
    vcs_canvas.plot(ref_title)

    if not parameters.logo:
        vcs_canvas.drawlogooff()

    # ref_test_template.script('plot_set_3.json')
    # blank_template.script('plot_set_3.json')
    # diff_template.script('plot_set_3.json')
    # ref_line.script('plot_set_3.json')
    # test_line.script('plot_set_3.json')
    # diff_line.script('plot_set_3.json')
    # main_title.script('plot_set_3.json')
    # ref_test_yaxis_title.script('plot_set_3.json')
    # diff_yaxis_title.script('plot_set_3.json')
    # test_title.script('plot_set_3.json')
    # ref_title.script('plot_set_3.json')

    fnm = os.path.join(get_output_dir('3', parameters), parameters.output_file)
    for f in parameters.output_format:
        f = f.lower().split('.')[-1]
        if f == 'png':
            vcs_canvas.png(fnm)
        elif f == 'pdf':
            vcs_canvas.pdf(fnm)
        elif f == 'svg':
            vcs_canvas.svg(fnm)

        print('Plot saved in: ' + fnm + '.' + f)
    vcs_canvas.clear()
Esempio n. 13
0
def plot(reference, test, diff, metrics_dict, parameter):
    vcs_canvas = vcs.init(bg=True, geometry=(parameter.canvas_size_w, parameter.canvas_size_h))
    case_id = parameter.case_id

    file_path = os.path.join(sys.prefix, 'share', 'acme_diags', 'set7')
    vcs_canvas.scriptrun(os.path.join(file_path, 'plot_set_7.json'))
    vcs_canvas.scriptrun(os.path.join(file_path, 'plot_set_7_new.json'))
    
    template_test = vcs_canvas.gettemplate('plotset7_0_x_0')
    template_ref = vcs_canvas.gettemplate('plotset7_0_x_1')
    template_diff = vcs_canvas.gettemplate('plotset7_0_x_2')

    template_test.title.x = 0.01
    template_test.dataname.x = 0.01
    template_test.dataname.y = template_test.title.y - 0.02
    template_test.data.y1 -= 0.025
    template_test.data.y2 -= 0.02

    template_ref.title.x = 0.01
    template_ref.dataname.x = 0.01
    template_ref.dataname.y = template_ref.title.y - 0.02
    template_ref.data.y1 -= 0.025
    template_ref.data.y2 -= 0.025

    template_diff.title.x = 0.01
    template_diff.dataname.x = 0.01
    template_diff.dataname.y = template_diff.title.y - 0.02
    template_diff.data.y1 -= 0.025
    template_diff.data.y2 -= 0.025

    set_units(test, parameter.test_units)
    set_units(reference, parameter.reference_units)
    set_units(diff, parameter.diff_units)

    test.long_name = parameter.test_title
    reference.long_name = parameter.reference_title
    diff.long_name = parameter.diff_title

    test.id = parameter.test_name
    reference.id = parameter.reference_name
    diff.id = parameter.diff_name

    # model and observation graph
    plot_min_max_mean(vcs_canvas, metrics_dict, 'test')
    plot_min_max_mean(vcs_canvas, metrics_dict, 'ref')
    plot_min_max_mean(vcs_canvas, metrics_dict, 'diff')

    reference_isofill = vcs.getisofill('reference_isofill')
    reference_isofill.missing = 'grey'
    test_isofill = vcs.getisofill('test_isofill')
    test_isofill.missing = 'grey'
    diff_isofill = vcs.getisofill('diff_isofill')
    diff_isofill.missing = 'grey'
    if parameter.var_region.lower().find('polar') !=-1:
        reference_isofill.projection = 'polar'
        test_isofill.projection = 'polar'
        diff_isofill.projection = 'polar'
        if parameter.var_region.find('S') !=-1: 
            lat_y1 = -90 
            lat_y2 = -55 
        elif parameter.var_region.find('N') !=-1:
            lat_y1 = 90 
            lat_y2 = 50 
 
        reference_isofill.datawc_y1 = lat_y1  # this should extracted from selected domain
        reference_isofill.datawc_y2 = lat_y2
        test_isofill.datawc_y1 = lat_y1  # this should extracted from selected domain
        test_isofill.datawc_y2 = lat_y2
        diff_isofill.datawc_y1 = lat_y1  # this should extracted from selected domain
        diff_isofill.datawc_y2 = lat_y2


    set_levels_of_graphics_method(reference_isofill, parameter.contour_levels, reference, test)
    set_levels_of_graphics_method(test_isofill, parameter.contour_levels, test, reference)
    set_levels_of_graphics_method(diff_isofill, parameter.diff_levels, diff)

    if parameter.arrows:
        reference_isofill.ext_1 = True
        reference_isofill.ext_2 = True
        test_isofill.ext_1 = True
        test_isofill.ext_2 = True
        diff_isofill.ext_1 = True
        diff_isofill.ext_2 = True

    set_colormap_of_graphics_method(vcs_canvas, parameter.reference_colormap, reference_isofill)
    set_colormap_of_graphics_method(vcs_canvas, parameter.test_colormap, test_isofill)
    set_colormap_of_graphics_method(vcs_canvas, parameter.diff_colormap, diff_isofill)

    vcs_canvas.plot(add_cyclic(test), template_test, test_isofill)
    vcs_canvas.plot(add_cyclic(reference), template_ref, reference_isofill)
    vcs_canvas.plot(add_cyclic(diff), template_diff, diff_isofill)

    plot_rmse_and_corr(vcs_canvas, metrics_dict)

    # Plotting the main title
    main_title = managetextcombined('main_title', 'main_title', vcs_canvas)
    main_title.string = parameter.main_title
    main_title.y = [0.985]
    vcs_canvas.portrait()  # for some reason, this needs to be before a call to vcs_canvas.plot()
    vcs_canvas.plot(main_title)

    if not parameter.logo:
        vcs_canvas.drawlogooff()

    fnm = os.path.join(get_output_dir('7', parameter), parameter.output_file)
    for f in parameter.output_format:
        f = f.lower().split('.')[-1]
        if f == 'png':
            vcs_canvas.png(fnm)
        elif f == 'pdf':
            vcs_canvas.pdf(fnm)
        elif f == 'svg':
            vcs_canvas.svg(fnm)
        print('Plot saved in: ' + fnm + '.' + f)
    vcs_canvas.clear()
Esempio n. 14
0
def plot(reference, test, diff, metrics_dict, parameter):

    # Create figure, projection
    fig = plt.figure(figsize=parameter.figsize, dpi=parameter.dpi)

    # Create projection
    print(parameter.var_region)
    if parameter.var_region.find('N') != -1:
        pole = 'N'
        proj = ccrs.NorthPolarStereo(central_longitude=0)
    elif parameter.var_region.find('S') != -1:
        pole = 'S'
        proj = ccrs.SouthPolarStereo(central_longitude=0)

    # First two panels
    min1 = metrics_dict['test']['min']
    mean1 = metrics_dict['test']['mean']
    max1 = metrics_dict['test']['max']
    if test.count() > 1:
        plot_panel(0, fig, proj, pole, test, parameter.contour_levels, parameter.test_colormap, [
                   parameter.test_name_yrs, parameter.test_title, test.units], parameter, stats=(max1, mean1, min1))

    min2 = metrics_dict['ref']['min']
    mean2 = metrics_dict['ref']['mean']
    max2 = metrics_dict['ref']['max']

    if reference.count() > 1:
        plot_panel(1, fig, proj, pole, reference, parameter.contour_levels, parameter.reference_colormap, [
                   parameter.reference_name, parameter.reference_title, reference.units], parameter, stats=(max2, mean2, min2))

    # Third panel
    min3 = metrics_dict['diff']['min']
    mean3 = metrics_dict['diff']['mean']
    max3 = metrics_dict['diff']['max']
    r = metrics_dict['misc']['rmse']
    c = metrics_dict['misc']['corr']

    if diff.count() > 1:
        plot_panel(2, fig, proj, pole, diff, parameter.diff_levels, parameter.diff_colormap, [
                   None, parameter.diff_title, None], parameter, stats=(max3, mean3, min3, r, c))

    # Figure title
    fig.suptitle(parameter.main_title, x=0.5, y=0.97, fontsize=18)

    # Save figure
    for f in parameter.output_format:
        f = f.lower().split('.')[-1]
        fnm = os.path.join(get_output_dir(parameter.current_set,
            parameter), parameter.output_file + '.' + f)
        plt.savefig(fnm)
        # Get the filename that the user has passed in and display that.
        # When running in a container, the paths are modified.
        fnm = os.path.join(get_output_dir(parameter.current_set, parameter,
            ignore_container=True), parameter.output_file + '.' + f)
        print('Plot saved in: ' + fnm)

    # Save individual subplots
    for f in parameter.output_format_subplot:
        fnm = os.path.join(get_output_dir(
            parameter.current_set, parameter), parameter.output_file)
        page = fig.get_size_inches()
        i = 0
        for p in panel:
            # Extent of subplot
            subpage = np.array(p).reshape(2,2)
            subpage[1,:] = subpage[0,:] + subpage[1,:]
            subpage = subpage + np.array(border).reshape(2,2)
            subpage = list(((subpage)*page).flatten())
            extent = matplotlib.transforms.Bbox.from_extents(*subpage)
            # Save subplot
            fname = fnm + '.%i.' %(i) + f
            plt.savefig(fname, bbox_inches=extent)
            
            orig_fnm = os.path.join(get_output_dir(parameter.current_set, parameter,
                ignore_container=True), parameter.output_file)
            fname = orig_fnm + '.%i.' %(i) + f
            print('Sub-plot saved in: ' + fname)
            
            i += 1

    plt.close()
Esempio n. 15
0
def plot(reference, test, diff, metrics_dict, parameter):

    # Create figure, projection
    fig = plt.figure(figsize=parameter.figsize, dpi=parameter.dpi)
    # proj = ccrs.PlateCarree(central_longitude=180)
    proj = None

    # First two panels
    min1 = metrics_dict['test']['min']
    mean1 = metrics_dict['test']['mean']
    max1 = metrics_dict['test']['max']

    plot_panel(0,
               fig,
               proj,
               test,
               parameter.contour_levels,
               parameter.test_colormap,
               (parameter.test_name_yrs, parameter.test_title, test.units),
               parameter,
               stats=(max1, mean1, min1))

    min2 = metrics_dict['ref']['min']
    mean2 = metrics_dict['ref']['mean']
    max2 = metrics_dict['ref']['max']
    plot_panel(
        1,
        fig,
        proj,
        reference,
        parameter.contour_levels,
        parameter.reference_colormap,
        (parameter.reference_name, parameter.reference_title, reference.units),
        parameter,
        stats=(max2, mean2, min2))

    # Third panel
    min3 = metrics_dict['diff']['min']
    mean3 = metrics_dict['diff']['mean']
    max3 = metrics_dict['diff']['max']

    r = metrics_dict['misc']['rmse']
    c = metrics_dict['misc']['corr']
    plot_panel(2,
               fig,
               proj,
               diff,
               parameter.diff_levels,
               parameter.diff_colormap, (None, parameter.diff_title, None),
               parameter,
               stats=(max3, mean3, min3, r, c))

    # Figure title
    fig.suptitle(parameter.main_title, x=0.5, y=0.96, fontsize=18)

    # Save figure
    for f in parameter.output_format:
        f = f.lower().split('.')[-1]
        fnm = os.path.join(get_output_dir(parameter.current_set, parameter),
                           parameter.output_file)
        plt.savefig(fnm + '.' + f)
        _chown(fnm + '.' + f, parameter.user)
        print('Plot saved in: ' + fnm + '.' + f)

    # Save individual subplots
    for f in parameter.output_format_subplot:
        fnm = os.path.join(get_output_dir(parameter.current_set, parameter),
                           parameter.output_file)
        page = fig.get_size_inches()
        i = 0
        for p in panel:
            # Extent of subplot
            subpage = np.array(p).reshape(2, 2)
            subpage[1, :] = subpage[0, :] + subpage[1, :]
            subpage = subpage + np.array(border).reshape(2, 2)
            subpage = list(((subpage) * page).flatten())
            extent = matplotlib.transforms.Bbox.from_extents(*subpage)
            # Save suplot
            fname = fnm + '.%i.' % (i) + f
            plt.savefig(fname, bbox_inches=extent)
            _chown(fname, parameter.user)
            print('Sub-plot saved in: ' + fname)
            i += 1

    plt.close()
Esempio n. 16
0
def create_viewer(root_dir, parameters, ext):
    """Based of the parameters, find the files with
    extension ext and create the viewer in root_dir."""

    viewer = OutputViewer(path=root_dir, index_name='ACME Diagnostics')
    add_pages_and_top_row(viewer, parameters)

    for parameter in parameters:
        for set_num in parameter.sets:
            viewer.set_page("Set-{}".format(set_num))
            try:
                viewer.set_group(parameter.case_id)
            except RuntimeError:
                viewer.add_group(parameter.case_id)

            # Add all of the files with extension ext from the case_id/ folder'
            pth = get_output_dir(set_num, parameter)
            files = glob.glob(
                pth + '/*.' + ext
            )  # ex: files[0] = myresults/set5/set5_SST_HadISST/HadISST_CL-SST-SON-global.png

            for ext_fnm in files:
                fnm = ext_fnm.replace('.' + ext, '')
                fnm = fnm.split('/')[-1]  # ex: HadISST_CL-SST-SON-global
                keywords = fnm.split('-')

                # 2d vars, format is [ref_name, var, season, region]
                # 3d vars, format is [ref_name, var, plev, season, region]
                # ref_name and/or var can be something_like_this, so we always use negative indices
                ref_name = keywords[0]
                region = keywords[-1]
                season = keywords[-2]
                if keywords[-3].isdigit(
                ):  # for when we have a 3d variable, ex: keywords[-3] = 880
                    plev = keywords[-3]
                    var = keywords[-4]
                else:
                    plev = None
                    var = keywords[-3]

                if plev is None:  # 2d variable
                    #row_name = '%s %s %s' % (ref_name, var, region)
                    row_name = '%s %s' % (var, region)
                else:  # 3d variable
                    #row_name = '%s %s %s %s' % (ref_name, var, plev + ' mb ', region)
                    row_name = '%s %s %s' % (var, plev + ' mb ', region)

                try:
                    viewer.set_row(row_name)
                except RuntimeError:
                    # row of row_name wasn't in the viewer, so add it
                    viewer.add_row(row_name)
                    viewer.add_col(var)  # the description

                if parameter.case_id not in ROW_INFO[set_num]:
                    ROW_INFO[set_num][parameter.case_id] = {}
                if row_name not in ROW_INFO[set_num][parameter.case_id]:
                    ROW_INFO[set_num][parameter.case_id][row_name] = {}
                # format fnm to support relative paths
                ROW_INFO[set_num][
                    parameter.case_id][row_name][season] = os.path.join(
                        'set{}'.format(set_num), parameter.case_id, fnm)

    # add all of the files in from the case_id/ folder in ANN, DJF, MAM, JJA, SON order
    for set_num in ROW_INFO:
        viewer.set_page("Set-{}".format(set_num))
        for group in ROW_INFO[set_num]:
            viewer.set_group(group)
            for row_name in ROW_INFO[set_num][group]:
                viewer.set_row(row_name)
                for col_season in viewer.page.columns[
                        1:]:  # [1:] is to ignore 'Description' col
                    if col_season in ROW_INFO[set_num][group][row_name]:
                        fnm = ROW_INFO[set_num][group][row_name][col_season]
                        nc_files = [
                            fnm + nc_ext
                            for nc_ext in ['_test.nc', '_ref.nc', '_diff.nc']
                        ]
                        formatted_files = [{
                            'url': f,
                            'title': f
                        } for f in nc_files]
                        viewer.add_col(fnm + '.' + ext,
                                       is_file=True,
                                       title=col_season,
                                       other_files=formatted_files)
                    else:
                        # insert a blank value
                        # is_file must be True, otherwise OutputViewer indexes incorrectly
                        viewer.add_col('-----', is_file=True)

    viewer.generate_viewer(prompt_user=False)
Esempio n. 17
0
def plot(reference, test, diff, metrics_dict, parameter):
    vcs_canvas = vcs.init(bg=True,
                          geometry=(parameter.canvas_size_w,
                                    parameter.canvas_size_h))
    case_id = parameter.case_id

    reference = rotate_180(reference)
    test = rotate_180(test)
    diff = rotate_180(diff)

    file_path = os.path.join(sys.prefix, 'share', 'acme_diags',
                             'zonal_mean_2d')
    vcs_canvas.scriptrun(os.path.join(file_path, 'plot_set_4.json'))
    vcs_canvas.scriptrun(os.path.join(file_path, 'plot_set_4_new.json'))

    template_test = vcs_canvas.gettemplate('plotset4_0_x_0')
    template_ref = vcs_canvas.gettemplate('plotset4_0_x_1')
    template_diff = vcs_canvas.gettemplate('plotset4_0_x_2')

    utils.set_units(test, parameter.test_units)
    utils.set_units(reference, parameter.reference_units)
    utils.set_units(diff, parameter.diff_units)

    test.long_name = parameter.test_title
    reference.long_name = parameter.reference_title
    diff.long_name = parameter.diff_title

    test.id = parameter.test_name
    reference.id = parameter.reference_name
    diff.id = parameter.diff_name

    # model and observation graph
    utils.plot_min_max_mean(textcombined_objs, vcs_canvas, metrics_dict,
                            'test')
    utils.plot_min_max_mean(textcombined_objs, vcs_canvas, metrics_dict, 'ref')
    utils.plot_min_max_mean(textcombined_objs, vcs_canvas, metrics_dict,
                            'diff')

    reference_isofill = vcs.getisofill('reference_isofill')
    reference_isofill.missing = 'grey'
    reference = log_yaxis(reference, reference_isofill)

    test_isofill = vcs.getisofill('test_isofill')
    test_isofill.missing = 'grey'
    test = log_yaxis(test, test_isofill)

    diff_isofill = vcs.getisofill('diff_isofill')
    diff_isofill.missing = 'grey'
    diff = log_yaxis(diff, diff_isofill)

    utils.set_levels_of_graphics_method(reference_isofill,
                                        parameter.contour_levels, reference,
                                        test)
    utils.set_levels_of_graphics_method(test_isofill, parameter.contour_levels,
                                        test, reference)
    utils.set_levels_of_graphics_method(diff_isofill, parameter.diff_levels,
                                        diff)

    if parameter.arrows:
        reference_isofill.ext_1 = True
        reference_isofill.ext_2 = True
        test_isofill.ext_1 = True
        test_isofill.ext_2 = True
        diff_isofill.ext_1 = True
        diff_isofill.ext_2 = True

    utils.set_colormap_of_graphics_method(vcs_canvas,
                                          parameter.reference_colormap,
                                          reference_isofill, parameter)
    utils.set_colormap_of_graphics_method(vcs_canvas, parameter.test_colormap,
                                          test_isofill, parameter)
    utils.set_colormap_of_graphics_method(vcs_canvas, parameter.diff_colormap,
                                          diff_isofill, parameter)

    vcs_canvas.plot(test, template_test, test_isofill)
    vcs_canvas.plot(reference, template_ref, reference_isofill)
    vcs_canvas.plot(diff, template_diff, diff_isofill)

    utils.plot_rmse_and_corr(textcombined_objs, vcs_canvas, metrics_dict)

    # Plotting the main title
    main_title = utils.managetextcombined(textcombined_objs, 'main_title',
                                          'main_title', vcs_canvas)
    main_title.string = parameter.main_title
    vcs_canvas.portrait(
    )  # for some reason, this needs to be before a call to vcs_canvas.plot()
    vcs_canvas.plot(main_title)

    if not parameter.logo:
        vcs_canvas.drawlogooff()

    fnm = os.path.join(get_output_dir(parameter.current_set, parameter),
                       parameter.output_file)
    for f in parameter.output_format:
        f = f.lower().split('.')[-1]
        if f == 'png':
            vcs_canvas.png(fnm)
            _chown(fnm + '.png', parameter.user)
        elif f == 'pdf':
            vcs_canvas.pdf(fnm)
            _chown(fnm + '.pdf', parameter.user)
        elif f == 'svg':
            vcs_canvas.svg(fnm)
            _chown(fnm + '.svg', parameter.user)
        print('Plot saved in: ' + fnm + '.' + f)

    vcs_canvas.clear()