Note
Go to the end to download the full example code.
MPAS Cell-centered contour plots¶
This example demonstrates filled and line contours for MPAS cell-centered scalar fields.
easyclimate.plot.mpas.plot_cell_contourf
draws filled contours from values located on nCells. The companion
easyclimate.plot.mpas.plot_cell_contour
draws contour lines using the same MPAS cell coordinates.
import xarray as xr
import numpy as np
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import easyclimate as ecl
from easyclimate.plot.mpas import plot_cell_contourf, plot_cell_contour
Open a sample MPAS output file. The divergence variable is defined at
MPAS cell centers, so one time and vertical level are selected before
plotting.
data = ecl.open_tutorial_dataset("mpas_JWwave_T10_nVertLevels10")
data
Draw a filled contour plot over a longitude-latitude subset. The helper uses the MPAS cell coordinates and supports windows that cross the dateline.
plot_cell_contourf(
data,
data.divergence,
cmap = "RdBu_r",
vmax = 3e-6,
vmin = -3e-6,
levels = 21,
lon_min=130,
lon_max=320,
lat_min=10,
lat_max=80,
cbar_kwargs = {'location': 'bottom', 'aspect': 60}
)

<matplotlib.tri._tricontour.TriContourSet object at 0x73548a7f9f40>
Pass an existing Cartopy axes when the contour should be combined with coastlines, gridlines, and other map decorations.
fig, ax = plt.subplots(subplot_kw= {"projection": ccrs.PlateCarree(-120)})
plot_cell_contourf(
data,
data.divergence,
transform = ccrs.PlateCarree(),
cmap = "RdBu_r",
vmax = 3e-6,
vmin = -3e-6,
levels = 21,
ax = ax,
lon_min=130,
lon_max=320,
lat_min=10,
lat_max=80,
cbar_kwargs = {'location': 'bottom', 'aspect': 60}
)
ax.set_title("JW Wave Divergence (plot_cell_contourf)")
ax.coastlines(resolution="110m", linewidth=0.6, color = "b")
ax.gridlines(draw_labels=True, alpha = 0)

<cartopy.mpl.gridliner.Gridliner object at 0x73548b098d40>
A smaller longitude-latitude window can be used to inspect regional structures without pre-slicing the MPAS mesh manually.
fig, ax = plt.subplots(subplot_kw= {"projection": ccrs.PlateCarree(160)})
plot_cell_contourf(
data,
data.divergence,
transform = ccrs.PlateCarree(),
cmap = "RdBu_r",
levels = np.linspace(-1e-6, 1e-6, 21),
ax = ax,
lon_min=120,
lon_max=200,
lat_min=20,
lat_max=70,
cbar_kwargs = {'location': 'bottom', 'aspect': 60}
)
ax.set_title("Local JW Wave Divergence (plot_cell_contourf)")
ax.coastlines(resolution="50m", linewidth=0.6, color = "k")
ax.gridlines(draw_labels=True, alpha = 0)

<cartopy.mpl.gridliner.Gridliner object at 0x73548a8ab260>
Use plot_cell_contour when contour lines and labels are preferred over a
filled field.
fig, ax = plt.subplots(subplot_kw= {"projection": ccrs.PlateCarree(120)})
cs = plot_cell_contour(
data,
data.divergence,
levels=np.linspace(-1e-6, 1e-6, 9),
colors="black",
ax=ax,
lon_min=150,
lon_max=230,
lat_min=10,
lat_max=65,
transform=ccrs.PlateCarree(),
)
ax.clabel(cs, inline=True, fontsize=8, fmt="%g")
ax.set_title("Local JW Wave Divergence (plot_cell_contour)")
ax.coastlines(resolution="50m", linewidth=0.6, color = "r")
ax.gridlines(draw_labels=True, alpha = 0)

<cartopy.mpl.gridliner.Gridliner object at 0x73548a19f9b0>
Total running time of the script: (0 minutes 5.383 seconds)