Winter Arctic sea ice state variability (updates through to April 2022)#

Summary: In this notebook, we provide updates to the original winter Arctic sea ice thickness notebooks with an additional winter (2021-2022) of data collection. Here we read the IS2SITMOGR4 files from our AWS S3 bucket, instead of our aggregated Jupyter Book dataset. I generally focus on showing the ‘’smoothed/interpolated’ variables, whereas Petty et al., (2023) focussed more on the non-interpolated gridded data. Once we produce an updated aggregated Jupyter Book dataset we can update this notebook with those additional variables.

Version history: Version 1 (01/23/2023)

Import notebook dependencies#

# For working with gridded climate data 
import xarray as xr 
# Helper function for reading the data from the bucket
from utils.read_data_utils import read_IS2SITMOGR4 
from utils.plotting_utils import static_winter_comparison_lineplot, staticArcticMaps, staticArcticMaps_overlayDrifts, interactiveArcticMaps, compute_gridcell_winter_means, interactive_winter_comparison_lineplot # Plotting utils 
import numpy as np
# Plotting dependencies
#%config InlineBackend.figure_format = 'retina'
import matplotlib as mpl
# Sets figure size in the notebook
mpl.rcParams['figure.dpi'] = 150 

# Remove warnings to improve display
import warnings 
warnings.filterwarnings('ignore') 
# Read in the raw monthly gridded winter Arctic sea ice data from S3 (still using V2)
IS2SITMOGR4_all = read_IS2SITMOGR4(data_type='zarr-s3', 
                                   local_data_path='./data/IS2SITMOGR4/', version='V2',persist=True) 
IS2SITMOGR4_all
load zarr from S3 bucket:  icesat-2-sea-ice-us-west-2
zarr_path: s3://icesat-2-sea-ice-us-west-2/IS2SITMOGR4_V2/zarr/IS2SITMOGR4_V2_201811-202204.zarr/all/
<xarray.Dataset>
Dimensions:            (time: 30, y: 448, x: 304)
Coordinates:
    latitude           (y, x) float32 31.1 31.2 31.3 31.39 ... 34.68 34.58 34.47
    longitude          (y, x) float32 168.3 168.1 168.0 ... -10.36 -10.18 -9.999
  * time               (time) datetime64[ns] 2018-11-01 ... 2022-04-01
    xgrid              (y, x) float32 dask.array<chunksize=(224, 304), meta=np.ndarray>
    ygrid              (y, x) float32 dask.array<chunksize=(224, 304), meta=np.ndarray>
Dimensions without coordinates: y, x
Data variables: (12/15)
    freeboard          (time, y, x) float32 dask.array<chunksize=(8, 112, 152), meta=np.ndarray>
    freeboard_int      (time, y, x) float32 dask.array<chunksize=(8, 112, 152), meta=np.ndarray>
    ice_density        (time, y, x) float32 dask.array<chunksize=(8, 112, 152), meta=np.ndarray>
    ice_thickness      (time, y, x) float32 dask.array<chunksize=(8, 112, 152), meta=np.ndarray>
    ice_thickness_int  (time, y, x) float32 dask.array<chunksize=(8, 112, 152), meta=np.ndarray>
    ice_thickness_unc  (time, y, x) float32 dask.array<chunksize=(8, 112, 152), meta=np.ndarray>
    ...                 ...
    projection         (time) float64 dask.array<chunksize=(30,), meta=np.ndarray>
    region_mask        (time, y, x) float32 dask.array<chunksize=(8, 112, 152), meta=np.ndarray>
    sea_ice_conc       (time, y, x) float32 dask.array<chunksize=(8, 112, 152), meta=np.ndarray>
    snow_density       (time, y, x) float32 dask.array<chunksize=(8, 112, 152), meta=np.ndarray>
    snow_depth         (time, y, x) float32 dask.array<chunksize=(8, 112, 152), meta=np.ndarray>
    snow_depth_int     (time, y, x) float32 dask.array<chunksize=(8, 112, 152), meta=np.ndarray>
# Years over which to perform analysis
years = [2018,2019,2020, 2021]

Winter mean Arctic maps (static)#

Compute and map (static) mean winter sea ice conditions across the years of analysis chosen

freeboard_winter_means = compute_gridcell_winter_means(IS2SITMOGR4_all.freeboard_int, years=years)
staticArcticMaps(freeboard_winter_means, dates=freeboard_winter_means.time.values, set_cbarlabel = "Sea ice freeboard (m)", cmap="YlOrRd", col_wrap=4, vmin=0, vmax=0.8, out_str='freeboard_winter_2018_2022')
../_images/735807cbbb5a100e7fa042647a61090666904434b0f9854232250eef7190d3bd.png
snow_depth_winter_means = compute_gridcell_winter_means(IS2SITMOGR4_all.snow_depth_int, years=years)
staticArcticMaps(snow_depth_winter_means, dates=snow_depth_winter_means.time.values,set_cbarlabel = "Snow depth (m)", cmap="inferno", col_wrap=4, vmin=0, vmax=0.5, out_str='snowdepth_winter_2018_2022')
../_images/c8911443197960f8bfed01ef5fa57a2955787f1a834498f7b18dc04690c3391a.png
thickness_winter_means = compute_gridcell_winter_means(IS2SITMOGR4_all.ice_thickness_int, years=years)
staticArcticMaps(thickness_winter_means, dates=thickness_winter_means.time.values,title="", set_cbarlabel = "Sea ice thickness (m)", col_wrap=4, cmap="viridis", vmin=0, vmax=5, out_str='thickness_winter_2018_2022')
../_images/93f03037dcb0a469a110764328589482eacd9b456fffee1b3aabea6766912521.png
snow_density_winter_means = compute_gridcell_winter_means(IS2SITMOGR4_all.snow_density, years=years)
staticArcticMaps(snow_density_winter_means, dates=snow_density_winter_means.time.values,set_cbarlabel = "Snow density (kg/m3)", cmap="GnBu", col_wrap=4, vmin=240, vmax=330, out_str='snowdensity_winter_2018_2022')
../_images/0e0187ef115cd98160dd78c91ec72ecad7ebf26ed18f709529151019ef69b972.png
ice_type_winter_means = compute_gridcell_winter_means(IS2SITMOGR4_all.ice_type, years=years)
staticArcticMaps(ice_type_winter_means, dates=ice_type_winter_means.time.values, set_cbarlabel = "Sea ice type (0 = FYI, 1 = MYI)", col_wrap=4, cmap="YlOrRd", vmin=0, vmax=1, out_str='icetype_winter_2018_2022')
../_images/499aaf8d57e03d229b964bd112e80d0bce9a7c9e0d567b1956bc8b38fea7fa2d.png

Winter anomaly plots#

Compute and map (static) winter anomaly maps (relative to the mean across the three winters by default) for given variables across the four winters

freeboard_winter_means = compute_gridcell_winter_means(IS2SITMOGR4_all.freeboard, years=years)
staticArcticMaps(freeboard_winter_means-freeboard_winter_means.mean(axis=0), dates=freeboard_winter_means.time.values,title="", col_wrap=4, set_cbarlabel = "Sea ice freeboard anomaly (m)", cmap="BrBG", vmin=-0.2, vmax=0.2, out_str='freeboard_winter_anomaly_2018_2022')
../_images/24783ab99c751ae4078b6a60090f009f666c719354bdaf9a12feccc1c76457d7.png
snow_depth_winter_means = compute_gridcell_winter_means(IS2SITMOGR4_all.snow_depth, years=years)
staticArcticMaps(snow_depth_winter_means-snow_depth_winter_means.mean(axis=0), dates=snow_depth_winter_means.time.values,col_wrap=4, set_cbarlabel = "Snow depth anomaly (m)", cmap="PRGn", vmin=-0.2, vmax=0.2, out_str='snowdepth_winter_anomaly_2018_2022')
../_images/eab00749a7116fdf89c6dd4788e302b2514eedd7198fc987087319039d9eecfb.png
thickness_winter_means = compute_gridcell_winter_means(IS2SITMOGR4_all.ice_thickness_int, years=years)
staticArcticMaps(thickness_winter_means-thickness_winter_means.mean(axis=0), dates=thickness_winter_means.time.values,col_wrap=4, set_cbarlabel = "Sea ice thickness anomaly (m)", cmap="RdBu", vmin=-1.5, vmax=1.5, out_str='thickness_winter_anomaly_2018_2022')
../_images/17e91c817cf118534ea62440ec16b34ca6006698f394cf06286950c3a9f51d49.png

Monthly mean timeseries#

Next we’ll compute monthly means by averaging over all gridcells within a given region. We’ll use this to generate a lineplot to compare across the three winter seasons for each variable.

# Here is where we might also want to set a region mask, e.g. to avoid including some of the more uncertain data in the peripheral seas
innerArctic = [1,2,3,4,5,6]
IS2SITMOGR4_all_innerArctic = IS2SITMOGR4_all.where(IS2SITMOGR4_all.region_mask.isin(innerArctic))

# Uncomment out to set an additional ice type mask too and change the save_label accordingly (0 = FYI, 1 = MYI)
#IS2SITMOGR4_all_innerArctic = IS2SITMOGR4_all_innerArctic.where(IS2SITMOGR4_all_innerArctic.ice_type==1)

save_label='Inner_Arctic'
static_winter_comparison_lineplot(IS2SITMOGR4_all_innerArctic.freeboard, years=years, start_month="Sep", figsize=(5,3), annotation='(a)', set_ylabel=r'Total freeboard (m)', save_label=save_label, loc_pos=4, legend=True)
../_images/bcc51945a81d2c5df14b766f467697abab99b0e327c0a69b2bce52e4918ab6ed.png
static_winter_comparison_lineplot(IS2SITMOGR4_all_innerArctic.snow_depth, years=years, start_month="Sep", figsize=(5,3), annotation='(b)',set_ylabel='Snow depth (m)', save_label=save_label, legend=False)
../_images/984120c15947ec0aff820fe5ea530ff85d25ec18d6fce3891ece774773849708.png
static_winter_comparison_lineplot(IS2SITMOGR4_all_innerArctic.snow_density, years=years, start_month="Sep", figsize=(5,3), annotation='(c)',set_ylabel=r'Snow density (kg/m$^3$)', save_label=save_label, legend=False)
../_images/569d69238a7fa0eea689c8b800bc6a2c2bf7cbfbd3056a56dc09f279a4f3cf31.png
static_winter_comparison_lineplot(IS2SITMOGR4_all_innerArctic.ice_thickness, 
                                  da_unc = IS2SITMOGR4_all_innerArctic.ice_thickness_unc, 
                                  years=years, start_month="Sep", figsize=(5,3), set_ylabel='Sea ice thickness (m)', save_label=save_label, annotation='', legend=True)
../_images/0bcf11a0c8b17567009357c6ed0add4092137511b212e21a5ff4a25e854751f3.png
static_winter_comparison_lineplot(IS2SITMOGR4_all_innerArctic.sea_ice_conc, years=years, start_month="Sep", figsize=(5,3), annotation='(e)', set_ylabel='Sea ice concentration', save_label=save_label, legend=False)
../_images/d92aab43498f3e66cedd091d327b0c4b6fdeaeff9084036442f22ec565c4fcdf.png
static_winter_comparison_lineplot(IS2SITMOGR4_all_innerArctic.ice_type, years=years, start_month="Sep", figsize=(5,3), annotation='(f)',set_ylabel='Multi-year ice fraction', save_label=save_label, legend=False)
../_images/be4e43ccff978de06a98be64da9967559832c61931c2ea0137ffe0dc5c05215e.png

Winter mean Arctic maps (interactive, preliminary)#

Interactively map the mean winter sea ice conditions across the most recent winter months.
NB: interactive plotting is slow but can be useful for the zoom functionality and for looking at exacty grid-cell/regional values. Plotting all months in the dataset pushes the notebook above 100 Mb which triggers a GitHubt warning

interactiveArcticMaps(IS2SITMOGR4_all.ice_thickness_int.sel(time=slice('2021-09-01', '2022-04-01')), title='IS2SITMOGR4', frame_width=600)
#interactive_winter_comparison_lineplot(IS2SITMOGR4_all.ice_thickness, frame_width=800, title="Arctic Ocean mean winter ICESat-2 sea ice thickness")