NCL_xy_16.pyΒΆ

This script illustrates the following concepts:
  • Drawing a legend inside an XY plot

  • Drawing an X reference line in an XY plot

  • Reversing the Y axis

  • Using log scaling and explicit labeling

  • Changing the labels in a legend

  • Creating a vertical profile plot

See following URLs to see the reproduced NCL plot & script:
import geocat.datafiles as gdf
import matplotlib.pyplot as plt
import matplotlib.ticker as tic

Import packages:

import numpy as np
import xarray as xr
from geocat.viz import util as gvutil
from matplotlib.ticker import NullFormatter, ScalarFormatter

Read in data:

# Open a netCDF data file using xarray default engine and load the data into xarrays
ds = xr.open_dataset(gdf.get("netcdf_files/atmos.nc"), decode_times=False)
U = ds.U.isel(time=0).drop('time').isel(lon=0).drop('lon')

# Extract slices of the data at different latitudes using the index of the desired value
U20 = U.isel(lat=39).drop('lat')
U30 = U.isel(lat=42).drop('lat')
U40 = U.isel(lat=46).drop('lat')
U50 = U.isel(lat=49).drop('lat')

Plot with linear y axis:

# Generate figure (set its size (width, height) in inches) and axes
plt.figure(figsize=(8, 8))
ax = plt.axes()

# Use geocat.viz.util convenience function to add minor and major tick lines
gvutil.add_major_minor_ticks(ax,
                             x_minor_per_major=5,
                             y_minor_per_major=4,
                             labelsize=14)

# Use geocat.viz.util convenience function to set axes parameters
gvutil.set_axes_limits_and_ticks(ax,
                                 xlim=(-20, 40),
                                 ylim=(1000, 0),
                                 xticks=np.arange(-20, 60, 10),
                                 yticks=np.arange(0, 1200, 200))

# Use geocat.viz.util convenience function to set titles and labels
gvutil.set_titles_and_labels(ax,
                             maintitle='Profile Plot',
                             xlabel=U.long_name,
                             ylabel=U['lev'].long_name)

# Add reference line x=0
ax.axvline(x=0, color='black', linewidth=0.5)

# Plot data
plt.plot(U20.data,
         U20.lev,
         color='black',
         linestyle='solid',
         label='20N',
         linewidth=0.5)
plt.plot(U30.data,
         U30.lev,
         color='black',
         dashes=[15, 5],
         label='30N',
         linewidth=0.5)
plt.plot(U40.data,
         U40.lev,
         color='black',
         dashes=[4, 5],
         label='40N',
         linewidth=0.5)
plt.plot(U50.data,
         U50.lev,
         color='black',
         dashes=[15, 5, 5, 5],
         label='50N',
         linewidth=0.5)

# Add legend
handles, labels = ax.get_legend_handles_labels()
# Default order is the order in which the data was plotted
handles = reversed(handles)  # Reverse order of legend elements
labels = reversed(labels)
plt.legend(handles,
           labels,
           loc='center right',
           frameon=False,
           fontsize=14,
           labelspacing=1)

plt.show()
Profile Plot

Plot with logarithmic y axis:

# Generate figure (set its size (width, height) in inches) and axes
plt.figure(figsize=(8, 8))
ax = plt.axes()

# Note: Currently geocat-viz does not have a utility function for formating
# major and minor ticks on logarithmic axes.
plt.yscale('log')
ax.yaxis.set_major_formatter(ScalarFormatter())
ax.yaxis.set_minor_formatter(NullFormatter())
ax.tick_params(labelsize=14)
ax.minorticks_on()
ax.xaxis.set_minor_locator(tic.AutoMinorLocator(n=5))
# Specify no minor ticks on log y axis
ax.yaxis.set_minor_locator(tic.LogLocator())
# Length and width are in points and may need to change depending on figure size
ax.tick_params("both",
               length=8,
               width=0.9,
               which="major",
               bottom=True,
               top=True,
               left=True,
               right=True)
ax.tick_params("both",
               length=4,
               width=0.4,
               which="minor",
               bottom=True,
               top=True,
               left=True,
               right=True)

# Use geocat.viz.util convenience function to set axes parameters
pressure_lvls = [1, 5, 10, 30, 50, 100, 200, 300, 400, 500, 700, 1000]
gvutil.set_axes_limits_and_ticks(ax,
                                 xlim=(-20, 40),
                                 ylim=(1000, 4),
                                 xticks=np.arange(-20, 60, 10),
                                 yticks=pressure_lvls)

# Use geocat.viz.util convenience function to set titles and labels
gvutil.set_titles_and_labels(ax, maintitle='Profile Plot', xlabel=U.long_name)

# Plot data
plt.plot(U20.data,
         U20.lev,
         color='black',
         linestyle='solid',
         label='20N',
         linewidth=0.5)
plt.plot(U30.data,
         U30.lev,
         color='black',
         dashes=[15, 5],
         label='30N',
         linewidth=0.5)
plt.plot(U40.data,
         U40.lev,
         color='black',
         dashes=[4, 5],
         label='40N',
         linewidth=0.5)
plt.plot(U50.data,
         U50.lev,
         color='black',
         dashes=[15, 5, 5, 5],
         label='50N',
         linewidth=0.5)

# Add legend
handles, labels = ax.get_legend_handles_labels()
# Default order is the order in which the data was plotted
handles = reversed(handles)  # Reverse order of legend elements
labels = reversed(labels)
plt.legend(handles,
           labels,
           loc='center right',
           frameon=False,
           fontsize=14,
           labelspacing=1)

plt.show()
Profile Plot

Total running time of the script: ( 0 minutes 0.578 seconds)

Gallery generated by Sphinx-Gallery