Python unstructured ICON tricontourf plot (python 3)#

Software requirements:

  • Python 3

  • Numpy

  • matplotlib

  • cartopy

  • xarray

  • python-cdo

    • ncells: 20480

    • run time: 0.932 s

Example script#

DKRZ_example_ICON_tricontourf.py

#!/usr/bin/env python
# coding: utf-8
'''
DKRZ example

ICON tricontourf plot

Content
- read netCDF data and grid files
- used map projections: PlateCarree
- draw contours filled with tricontourf
- add coastlines
- save to PNG

-------------------------------------------------------------------------------
2021 copyright DKRZ licensed under CC BY-NC-SA 4.0 <br>
               (https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en)
-------------------------------------------------------------------------------
'''
import time, os
import xarray as xr
import numpy as np
import numpy.ma as ma

import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.tri as tri
import cartopy.crs as ccrs
import cartopy.feature as cfeature

from cdo import *
cdo = Cdo()

def main():
    plt.switch_backend('agg')

    t1 = time.time()    #-- retrieve start time

    #-- set title string
    title = 'ICON tricontourf plot'

    #--  set data and grid file path, and variable name
    varName   = 'ta'

    fname = '../../data/ta_ps_850.nc'
    gname = '../../data/r2b4_amip.nc'

    #-- extract subregion of the global grid with CDO
    minlon, maxlon, minlat, maxlat = -179.5, 179.5, -89.5, 89.5

    #-- make sure that nan, inf, and -inf are set to missing value
    cdo_cmd = '-setmisstoc,-9999. -setgrid,'+ gname +' '+ fname +' '

    Data = cdo.sellonlatbox('{0},{1},{2},{3}'.format(minlon,maxlon,minlat,maxlat),
                            input=cdo_cmd,
                            options='-r',
                            returnXDataset=True)
    #-- get missing_value
    missing_value = Data[varName].encoding['missing_value']

    #-- get variable
    var = Data[varName][0,0,:].values
    var = var - 273.15

    #-- get coordinates and convert radians to degrees
    clon = np.rad2deg(Data.clon.values)
    clat = np.rad2deg(Data.clat.values)

    #-- set contour levels, labels
    varMin, varMax, varInt = -32, 28, 2
    levels = np.arange(varMin, varMax+varInt, varInt)
    nlevs  = levels.size
    labels = ['{:.2f}'.format(x) for x in levels]

    #-- print information to stdout
    print('')
    print('Cells:            %6d ' % clon.size)
    print('Variable min/max: %6.2f ' % np.nanmin(var)+'/'+' %.2f' % np.nanmax(var))
    print('Contour  min/max: %6.2f ' % varMin+'/'+' %.2f' % varMax)
    print('')

    #-- set projection
    projection = ccrs.PlateCarree()

    #-- set colormap for nlevs
    cmap = plt.get_cmap('Spectral_r', nlevs)

    #-- create figure and axes instances; we need subplots for plot and colorbar
    fig, ax = plt.subplots(figsize=(10,10),
                           subplot_kw=dict(projection=projection))
    ax.set_global()

    #-- plot land areas at last to get rid of the contour lines at land
    ax.gridlines(draw_labels=True,
                 linewidth=0.5,
                 color='dimgray',
                 alpha=0.4,
                 zorder=2)

    ax.coastlines(linewidth=0.5, zorder=2)

    #-- plot the title string
    plt.title(title)

    #-- contour plot
    cnf = ax.tricontourf(clon, clat, var,
                         vmin=varMin,
                         vmax=varMax,
                         levels=levels,
                         cmap=cmap,
                         extend='neither',
                         zorder=0)

    #-- add a color bar
    cbar_ax = fig.add_axes([0.2, 0.25, 0.6, 0.015], autoscalex_on=True) #-- x,y,w,h
    cbar = fig.colorbar(cnf, cax=cbar_ax, orientation='horizontal')
    plt.setp(cbar.ax.get_xticklabels()[::2], visible=False)
    cbar.set_label('[deg C]')

    #-- maximize and save the PNG file
    plt.savefig('plot_ICON_tricontourf.png', bbox_inches='tight',dpi=150)

    #-- get wallclock time
    t2 = time.time()
    print('Wallclock time:  %0.3f seconds\n' % (t2-t1))


if __name__ == '__main__':
    main()
    

image0