def multi_model_contours( cfg, metadatas, ): """ Make a multi model comparison plot showing several transect contour plots. This tool loads several cubes from the files, checks that the units are sensible BGC units, checks for layers, adjusts the titles accordingly, determines the ultimate file name and format, then saves the image. Parameters ---------- cfg: dict the opened global config dictionairy, passed by ESMValTool. metadatas: dict The metadatas dictionairy for a specific model. """ #### # Load the data for each layer as a separate cube model_cubes = {} regions = {} thresholds = {} set_y_logscale = True for filename in sorted(metadatas): cube = iris.load_cube(filename) cube = diagtools.bgc_units(cube, metadatas[filename]['short_name']) cube = make_depth_safe(cube) cubes = make_cube_region_dict(cube) model_cubes[filename] = cubes for region in model_cubes[filename]: regions[region] = True # Determine y log scale. set_y_logscale = determine_set_y_logscale(cfg, metadatas[filename]) # Load threshold/thresholds. tmp_thresholds = diagtools.load_thresholds(cfg, metadatas[filename]) for threshold in tmp_thresholds: thresholds[threshold] = True # Load image format extention image_extention = diagtools.get_image_format(cfg) # Make a plot for each layer and each threshold for region, threshold in itertools.product(regions, thresholds): logger.info('plotting threshold: \t%s', threshold) title = '' plot_details = {} # Plot each file in the group for index, filename in enumerate(sorted(metadatas)): color = diagtools.get_colour_from_cmap(index, len(metadatas)) linewidth = 1. linestyle = '-' # Determine line style for MultiModel statistics: if 'MultiModel' in metadatas[filename]['dataset']: linewidth = 2. linestyle = ':' # Determine line style for Observations if metadatas[filename]['project'] in diagtools.get_obs_projects(): color = 'black' linewidth = 1.7 linestyle = '-' qplt.contour(model_cubes[filename][region], [ threshold, ], colors=[ color, ], linewidths=linewidth, linestyles=linestyle, rasterized=True) plot_details[filename] = { 'c': color, 'ls': linestyle, 'lw': linewidth, 'label': metadatas[filename]['dataset'] } if set_y_logscale: plt.axes().set_yscale('log') title = metadatas[filename]['long_name'] units = str(model_cubes[filename][region].units) add_sea_floor(model_cubes[filename][region]) # Add title, threshold, legend to plots title = ' '.join([ title, str(threshold), units, determine_transect_str(model_cubes[filename][region], region) ]) titlify(title) plt.legend(loc='best') # Saving files: if cfg['write_plots']: path = diagtools.get_image_path( cfg, metadatas[filename], prefix='MultipleModels', suffix='_'.join([ 'contour_tramsect', region, str(threshold) + image_extention ]), metadata_id_list=[ 'field', 'short_name', 'preprocessor', 'diagnostic', 'start_year', 'end_year' ], ) # Resize and add legend outside thew axes. plt.gcf().set_size_inches(9., 6.) diagtools.add_legend_outside_right(plot_details, plt.gca(), column_width=0.15) logger.info('Saving plots to %s', path) plt.savefig(path) plt.close()
def make_transect_contours( cfg, metadata, filename, ): """ Make a contour plot of the transect for an indivudual model. This tool loads the cube from the file, checks that the units are sensible BGC units, checks for layers, adjusts the titles accordingly, determines the ultimate file name and format, then saves the image. Parameters ---------- cfg: dict the opened global config dictionairy, passed by ESMValTool. metadata: dict The metadata dictionairy for a specific model. filename: str The preprocessed model file. """ # Load cube and set up units cube = iris.load_cube(filename) cube = diagtools.bgc_units(cube, metadata['short_name']) cube = make_depth_safe(cube) # Load threshold/thresholds. plot_details = {} colours = [] thresholds = diagtools.load_thresholds(cfg, metadata) linewidths = [1 for thres in thresholds] linestyles = ['-' for thres in thresholds] cubes = make_cube_region_dict(cube) for region, cube in cubes.items(): for itr, thres in enumerate(thresholds): colour = diagtools.get_colour_from_cmap(itr, len(thresholds)) label = str(thres) + ' ' + str(cube.units) colours.append(colour) plot_details[thres] = { 'c': colour, 'lw': 1, 'ls': '-', 'label': label } qplt.contour(cube, thresholds, colors=colours, linewidths=linewidths, linestyles=linestyles, rasterized=True) # Determine y log scale. if determine_set_y_logscale(cfg, metadata): plt.axes().set_yscale('log') add_sea_floor(cube) # Add legend diagtools.add_legend_outside_right(plot_details, plt.gca(), column_width=0.08, loc='below') # Add title to plot title = ' '.join([ metadata['dataset'], metadata['long_name'], determine_transect_str(cube, region) ]) titlify(title) # Load image format extention image_extention = diagtools.get_image_format(cfg) # Determine image filename: if metadata['dataset'].find('MultiModel') > -1: path = diagtools.folder( cfg['plot_dir']) + os.path.basename(filename) path.replace('.nc', region + '_transect_contour' + image_extention) else: path = diagtools.get_image_path( cfg, metadata, suffix=region + 'transect_contour' + image_extention, ) # Saving files: if cfg['write_plots']: logger.info('Saving plots to %s', path) plt.savefig(path) plt.close()