Beispiel #1
0
def plot_cross_section(cube, pv, theta, theta_e, z_bl, rh, ax, n, ylims):
    # Make the plot
    if cube.units == 'K':
        im = iplt.contourf(cube,
                           even_cscale(20),
                           coords=coords,
                           cmap='coolwarm',
                           extend='both')
    elif cube.units == 'PVU':
        im = iplt.contourf(cube,
                           even_cscale(2),
                           coords=coords,
                           cmap='coolwarm',
                           extend='both')
    else:
        print(cube.units)

    iplt.contour(pv, [2], colors='k', coords=coords)

    cs_theta = iplt.contour(theta,
                            theta_levs,
                            coords=coords,
                            colors='k',
                            linewidths=1,
                            linestyles='-')

    cs_theta_e = iplt.contour(theta_e,
                              theta_levs,
                              coords=coords,
                              colors='w',
                              linewidths=1,
                              linestyles='-')

    iplt.plot(z_bl.coord('grid_longitude'), z_bl, color='y')
    iplt.contour(rh, [0.8], coords=coords, colors='grey')
    iplt.contourf(rh, [0.8, 2], coords=coords, colors='None', hatches=['.'])
    plt.title(second_analysis.all_diagnostics[cube.name()].symbol)

    if n == 0:
        plt.clabel(cs_theta, fmt='%1.1f')
        plt.clabel(cs_theta_e, fmt='%1.1f')
    ax.set_ylim(*ylims)

    if n < (nrows - 1) * ncols:
        ax.set_xticks([])

    if n % ncols != 0:
        ax.set_yticks([])

    return im
Beispiel #2
0
def cross_sections(tracers, theta, rh, z_bl, fig):
    # Plot each cube separately
    for n, cube in enumerate(tracers):
        row = n / ncols
        col = n - row * ncols
        ax = plt.subplot2grid((nrows, ncols), (row, col))

        # Interpolate along the cross section
        cube = cs_cube(cube, xs, xf, ys, yf)
        coords = ['grid_longitude', 'altitude']

        # Make the plot
        im = iplt.contourf(cube,
                           even_cscale(2),
                           coords=coords,
                           cmap='coolwarm',
                           extend='both')
        cs = iplt.contour(theta,
                          theta_levs,
                          coords=coords,
                          colors='k',
                          linewidths=2)
        iplt.plot(z_bl.coord('grid_longitude'), z_bl, color='y')
        iplt.contour(rh, [0.8], coords=coords, colors='w')
        iplt.contourf(rh, [0.8, 2],
                      coords=coords,
                      colors='None',
                      hatches=['.'])
        plt.title(second_analysis.all_diagnostics[cube.name()].symbol)

        if n == 0:
            plt.clabel(cs, fmt='%1.0f', colors='k')
        ax.set_ylim(0, 7)

        if n < 4:
            ax.set_xticks([])

    # Add letter labels to panels
    for n, ax in enumerate(fig.axes):
        multilabel(ax, n)

    # Add colorbar at bottom of figure
    cbar = plt.colorbar(im,
                        ax=fig.axes,
                        orientation='horizontal',
                        fraction=0.05,
                        spacing='proportional')
    cbar.set_label('PVU')
    cbar.set_ticks(np.linspace(-2, 2, 9))

    fig.text(0.075, 0.58, 'Height (km)', va='center', rotation='vertical')
    fig.text(0.5, 0.2, 'Grid Longitude', ha='center')
    return
Beispiel #3
0
def main(**kwargs):
    # Initialise the plot
    fig = plt.figure(figsize=(18, 15))

    for n, coord in enumerate(coords):
        for m, subdomain in enumerate(['ridges', 'troughs']):
            cubes = second_analysis.get_data(coord, subdomain)
            cube = convert.calc(name, cubes)
            cube.coord(coord).convert_units('km')
            mean, std_err = second_analysis.extract_statistics(
                cube, 'forecast_index')

            ax = plt.subplot2grid((2, 2), (n, m))
            im = iplt.contourf(mean, even_cscale(0.18), cmap='coolwarm')

            # X-axis - Same for both columns
            ax.set_xticks([0, 12, 24, 36, 48, 60])
            if n == 0:
                ax.get_xaxis().set_ticklabels([])
                ax.set_title(subdomain.capitalize())

            # Y-axis - Same for both rows
            ax.set_ylim(-2, 2)
            ax.set_yticks([-2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5, 2])
            ax.axhline(color='k')
            if m > 0:
                ax.get_yaxis().set_ticklabels([])

    add_labels(fig)

    fig.text(0.5, 0.2, 'Forecast Lead Time (hours)', ha='center')

    for n, axis in enumerate(fig.axes):
        multilabel(axis, n)

    cbar = plt.colorbar(im,
                        ax=fig.axes,
                        orientation='horizontal',
                        fraction=0.05,
                        spacing='proportional')
    cbar.set_ticks([-0.18, -0.09, 0, 0.09, 0.18])
    cbar.set_label('PVU')
    plt.savefig(plotdir + 'inconsistency.pdf')
    plt.show()

    return
Beispiel #4
0
def plot_overview(mslp, pv):
    iplt.contourf(pv,
                  even_cscale(2),
                  cmap='coolwarm',
                  spacing='proportional',
                  extend='both')
    add_map()
    cbar = plt.colorbar(orientation='horizontal',
                        fraction=0.05,
                        spacing='proportional')
    cbar.set_label('PVU')
    cbar.set_ticks(np.linspace(-2, 2, 9))
    cs = iplt.contour(mslp, plevs, colors='k', linewidths=1)
    plt.clabel(cs, fmt='%1.0f', colors='k')
    plt.plot(track[:, 0], track[:, 1], '-y')
    plt.plot(track[time, 0], track[time, 1], 'yx', markersize=15)

    return
Beispiel #5
0
def main(cubes):
    # Set up cross section plotters
    pv = convert.calc('ertel_potential_vorticity', cubes)
    adv = convert.calc('advection_only_pv', cubes)
    T = convert.calc('air_temperature', cubes)
    dtdz = calculus.multidim(T, 'altitude', 'z')
    for cube in [pv, adv, dtdz]:
        cube.coord('altitude').convert_units('km')
        cube.coord('atmosphere_hybrid_height_coordinate').convert_units('km')
        cube.coord('surface_altitude').convert_units('km')
    plotters = []
    for name in names:
        cube = convert.calc(name, cubes)
        cube.coord('altitude').convert_units('km')
        cube.coord('atmosphere_hybrid_height_coordinate').convert_units('km')
        cube.coord('surface_altitude').convert_units('km')
        plotter1 = CSP(True, qplt.contourf, cube, even_cscale(5),
                       cmap='coolwarm', extend='both')
        plotter2 = CSP(False, iplt.contour, pv, [2], colors='k')
        plotter3 = CSP(False, iplt.contour, adv, [2], colors='k',
                       linestyles='--')
        plotter4 = CSP(False, iplt.contour, dtdz, [-0.002], colors='k',
                       linestyles=':')
        plotters.append(plotter1)
        plotters.append(plotter2)
        plotters.append(plotter3)
        plotters.append(plotter4)

    onselect = CS(plotters)

    # Plot theta on 2-PVU to identify regions
    theta = convert.calc('air_potential_temperature', cubes,
                         levels=('ertel_potential_vorticity', [2]))[0]
    theta.data = np.ma.masked_where(theta.data > 340, theta.data)
    plot.contourf(theta, np.linspace(280, 340, 13))

    # Create Cross-sections
    selector = RectangleSelector(plt.gca(), onselect, drawtype='line')
    plt.show()

    return
Beispiel #6
0
def main(dt):
    forecast = case_studies.iop5b.copy()
    cubes_f = forecast.set_lead_time(hours=dt)

    analysis = case_studies.iop5_analyses.copy()
    cubes_a = analysis.set_lead_time(hours=dt)

    # Mask land
    z_0 = convert.calc('altitude', cubes_f)[0]

    make_plots(cubes_f, cubes_a, 'air_potential_temperature',
               ('air_pressure', [90000]), 'K',
               even_cscale(10, 11),
               np.linspace(270, 300, 13))
    plt.savefig(plotdir + 'iop5_T_error.pdf')
    """

    # Low-level pressure
    fig = plt.figure(figsize=(18, 8))
    ax = plt.subplot2grid((1, 2), (0, 0))
    make_plot(cubes_f, cubes_a, 'air_pressure', None, 'hPa',
              even_cscale(5, 11), np.linspace(950, 1050, 11),
              mask=z_0.data != 20)
    plt.title('(a)'.ljust(30) + 'p(20 m)'.ljust(35))

    # Geopotential height
    ax = plt.subplot2grid((1, 2), (0, 1))
    make_plot(cubes_f, cubes_a, 'altitude', ('air_pressure', [50000]), 'm',
              even_cscale(50, 11), np.linspace(5000, 6000, 11))
    plt.title('(b)'.ljust(30) + 'z(500 hPa)'.ljust(35))

    plt.savefig(plotdir + 'iop8_errors.pdf')

    plt.show()
    """

    return
Beispiel #7
0
import matplotlib.pyplot as plt
import iris.plot as iplt
from irise import convert
from irise.plot.util import add_map, even_cscale
from myscripts.models.um import case_studies

levels = ('air_potential_temperature', [320])
clevs = even_cscale(2)
cmap = 'coolwarm'


def main(cubes):
    pv = convert.calc('ertel_potential_vorticity', cubes, levels=levels)[0]
    adv = convert.calc('advection_only_pv', cubes, levels=levels)[0]
    for n, name in enumerate([
            'sum_of_physics_pv_tracers', 'epsilon',
            'dynamics_tracer_inconsistency', 'residual_pv'
    ]):
        cube = convert.calc(name, cubes, levels=levels)[0]

        m = n / 2
        ax = plt.subplot2grid((2, 2), (n - 2 * m, m))
        iplt.contourf(cube, clevs, cmap=cmap)
        add_map()
        iplt.contour(pv, [2], colors='k', linestyles='-')
        iplt.contour(adv, [2], colors='k', linestyles='-')

    plt.show()


if __name__ == '__main__':
Beispiel #8
0
import numpy as np
import matplotlib.pyplot as plt
import iris.plot as iplt
from irise import convert, plot
from irise.plot.util import add_map, even_cscale
from myscripts.models.um import case_studies
from myscripts.projects.thesis.case_studies import plotdir

levels = ('altitude', [1000])
levs = np.linspace(0, 50, 21)
errlevs = even_cscale(25, levels=21)


def main(dt):
    fig = plt.figure(figsize=(18, 15))

    # Load data
    forecast = case_studies.iop8.copy()
    cubes_f = forecast.set_lead_time(hours=24)
    analysis = case_studies.iop8_analyses.copy()
    cubes_a = analysis.set_lead_time(hours=24)

    # Forecast
    plt.subplot2grid((25, 4), (0, 0), colspan=2, rowspan=10)
    wind_speed(cubes_f, levs, cmap='magma_r')
    plt.title('(a)'.ljust(28) + 'Forecast'.ljust(35))

    # Analysis
    plt.subplot2grid((25, 4), (0, 2), colspan=2, rowspan=10)
    im = wind_speed(cubes_a, levs, cmap='magma_r')
    plt.title('(b)'.ljust(28) + 'Analysis'.ljust(35))
Beispiel #9
0
        iplt.contour(mask, [0.5], colors='k', linestyles='--')
        add_map()
        plt.title(second_analysis.all_diagnostics[name].symbol)

        iplt.contour(theta, [300], colors='k', linewidths=2)
        iplt.contour(rh, [0.8], colors='w', linewidths=2)
        iplt.contourf(rh, [0.8, 2], colors='None', hatches=['.'])

    for n, ax in enumerate(fig.axes):
        multilabel(ax, n)

    cbar = plt.colorbar(im, ax=fig.axes, orientation='horizontal',
                        fraction=0.05, spacing='proportional')
    cbar.set_label('PVU')
    cbar.set_ticks(np.linspace(-2, 2, 17)[::2])

    plt.savefig(plotdir + 'iop5_pv_tracers_24h_' +
                str(levels[1][0])[0:3] + 'hpa.pdf')
    # plt.show()

    return


if __name__ == '__main__':
    forecast = case_studies.iop5b.copy()
    cubes = forecast.set_lead_time(hours=24)
    for p in [60000, 75000, 90000]:
        levels = ('air_pressure', [p])
        main(cubes, levels, even_cscale(2), cmap='coolwarm',
             extend='both')