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
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
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
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
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
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
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__':
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))
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')