Source code for hyvr.postprocess.plotting

"""
Some functions to plot hyvr output. This module is for testing purposes only.
"""

import sys
import numpy as np
import matplotlib.pyplot as plt

[docs]def cross_section_pcolor(model, field, y=None, x=None, log=False, xlim_y=None, ylim_y=None, xlim_x=None, ylim_x=None, cmap=None): """ Create a pcolor plot of a cross section of the specified field. Parameters ---------- model : Model object field : str The field to be shown, e.g. 'ae', 'fac', 'hat', 'k_iso', etc. y : sequence of values or None, optional (default: None) If a sequence of values or a single value is given, cross section at this y-value will be plotted. If it is None, a y-cross section through the center of the model domain will be plotted. If it is an empty list, no y-cross section will be plotted. x : sequence of values or None, optional (default: None) If a sequence of values or a single value is given, cross section at this x-value will be plotted. If it is None, a x-cross section through the center of the model domain will be plotted. If it is an empty list, no x-cross section will be plotted. log : bool, optional (default: False) Whether to plot the logarithm of the field. xlim_y, ylim_y : lists/tuples, optional (default: None) Axis limits for the y-cross-sections xlim_x, ylim_x : lists/tuples, optional (default: None) Axis limits for the x-cross-sections cmap : matplotlib colormap, optional (default: None) Colormap to use for the plot, e.g. 'prism'. """ if y is None: y = [model.grid.y0 + model.grid.ly/2] if x is None: x = [model.grid.x0 + model.grid.lx/2] if np.isscalar(y): y = [y] if np.isscalar(x): x = [x] for yi in y: fig, ax = plt.subplots() y_index = int(np.round((yi-(model.grid.y0+model.grid.dy/2)/model.grid.dy))) if 0 <= y_index and y_index < model.grid.ny: im = ax.pcolor(model.grid.X[:,y_index,:].T, model.grid.Z[:,y_index,:].T, model.data[field][:,y_index,:].T, cmap=cmap) ax.set_title(field + ', y = {:.2f}'.format(yi)) ax.set_xlabel('x') ax.set_ylabel('z') if xlim_y is not None: ax.set_xlim(xlim_y) if ylim_y is not None: ax.set_ylim(ylim_y) ax.set_aspect('equal') fig.colorbar(im, ax=ax) plt.show(fig) else: print("Warning: y = {:.2f} not in model domain".format(yi), file=sys.stderr) for xi in x: fig, ax = plt.subplots() x_index = int(np.round((xi-(model.grid.x0+model.grid.dx/2)/model.grid.dx))) if 0 <= x_index and x_index < model.grid.nx: im = ax.pcolor(model.grid.Y[x_index,:,:].T, model.grid.Z[x_index,:,:].T, model.data[field][x_index,:,:].T, cmap=cmap) ax.set_title(field + ', x = {:.2f}'.format(xi)) ax.set_xlabel('y') ax.set_ylabel('z') if xlim_x is not None: ax.set_xlim(xlim_x) if ylim_x is not None: ax.set_ylim(ylim_x) ax.set_aspect('equal') fig.colorbar(im, ax=ax) plt.show(fig) else: print("Warning: x = {:.2f} not in model domain".format(xi), file=sys.stderr)