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

Summary: In this notebook, we provide the fourth update to the original winter Arctic sea ice thickness notebooks with the addition of the 2024 to 2025 winter from the Version 4 monthly gridded winter Arctic sea ice thickness dataset IS2SITMOGR4 (based on new Release 007 ATL10 freeboards).

Author: Alek Petty

Version history: Version 1 (11/13/2025)

### Import notebook dependencies
 
# Regular Python library imports 
import xarray as xr 
import numpy as np
import holoviews as hv
import pandas as pd
import hvplot.pandas # noqa

# Helper functions for reading the data from the bucket and plotting
from utils.read_data_utils import read_IS2SITMOGR4, read_book_data
from utils.plotting_utils import static_winter_comparison_lineplot, staticArcticMaps, staticArcticMaps_2025, interactiveArcticMaps, compute_gridcell_winter_means, interactive_winter_comparison_lineplot # Plotting utils 

# Plotting dependencies
#%config InlineBackend.figure_format = 'retina'
import matplotlib as mpl
# Sets figure size in the notebook
mpl.rcParams['figure.dpi'] = 200 

# Remove warnings to improve display
import warnings 
warnings.filterwarnings('ignore') 
# Set some plotting parameters
mpl.rcParams.update({
    "text.usetex": False,  # Use LaTeX for rendering
    "font.family": "sans-serif",
    'mathtext.fontset': 'stixsans',
    "lines.linewidth": 1.,
    "font.size": 8,
    #"lines.alpha": 0.8,
    "axes.labelsize": 8,
    "xtick.labelsize": 8,
    "ytick.labelsize": 8,
    "legend.fontsize": 8
})
mpl.rcParams['font.sans-serif'] = ['Arial']

Read in the Version 4 monthly gridded winter Arctic sea ice data#

Here I just load the data using the original netcdf files stored locally.

IS2SITMOGR4_v4 = read_IS2SITMOGR4(data_type='netcdf-local', local_data_path='./data/IS2SITMOGR4/', version='V4') 
IS2SITMOGR4_v4
Searching for files in:  ./data/IS2SITMOGR4/V4/*.nc
<xarray.Dataset> Size: 1GB
Dimensions:                         (time: 54, y: 448, x: 304)
Coordinates:
    longitude                       (y, x) float32 545kB 168.3 168.1 ... -9.999
    latitude                        (y, x) float32 545kB 31.1 31.2 ... 34.47
  * time                            (time) datetime64[ns] 432B 2018-11-01 ......
  * x                               (x) float32 1kB -3.838e+06 ... 3.738e+06
  * y                               (y) float32 2kB 5.838e+06 ... -5.338e+06
Data variables: (12/38)
    crs                             (time) int32 216B -2147483647 ... -214748...
    ice_thickness                   (time, y, x) float32 29MB dask.array<chunksize=(1, 448, 304), meta=np.ndarray>
    snow_depth                      (time, y, x) float32 29MB dask.array<chunksize=(1, 448, 304), meta=np.ndarray>
    ice_thickness_j22               (time, y, x) float32 29MB dask.array<chunksize=(1, 448, 304), meta=np.ndarray>
    snow_density                    (time, y, x) float32 29MB dask.array<chunksize=(1, 448, 304), meta=np.ndarray>
    ice_type                        (time, y, x) float32 29MB dask.array<chunksize=(1, 448, 304), meta=np.ndarray>
    ...                              ...
    ice_thickness_unc_ice_density   (time, y, x) float32 29MB dask.array<chunksize=(1, 448, 304), meta=np.ndarray>
    ice_thickness_unc_snow_density  (time, y, x) float32 29MB dask.array<chunksize=(1, 448, 304), meta=np.ndarray>
    ice_thickness_unc_snow_depth    (time, y, x) float32 29MB dask.array<chunksize=(1, 448, 304), meta=np.ndarray>
    sea_ice_conc                    (time, y, x) float32 29MB dask.array<chunksize=(1, 448, 304), meta=np.ndarray>
    region_mask                     (time, y, x) float32 29MB dask.array<chunksize=(1, 448, 304), meta=np.ndarray>
    grid_cell_area                  (time, y, x) float32 29MB dask.array<chunksize=(1, 448, 304), meta=np.ndarray>
Attributes:
    contact:      Alek Petty (akpetty@umd.edu)
    description:  Aggregated IS2SITMOGR4 V4 dataset.
    reference:    Official NSIDC data doi: 10.5067/CV6JEXEE31HF. Derived data...
    history:      Created 20/10/25

Winter mean maps, extended and focussing in on the new 2024-2025 winter data#

# Years over which to perform analysis (start year of that winter period)
years = [x for x in range(2018, 2024+1)]

freeboard_winter_means = compute_gridcell_winter_means(IS2SITMOGR4_v4.freeboard_int, years=years)
snow_depth_winter_means = compute_gridcell_winter_means(IS2SITMOGR4_v4.snow_depth_int, years=years)
thickness_winter_means = compute_gridcell_winter_means(IS2SITMOGR4_v4.ice_thickness_int, years=years)
#staticArcticMaps(thickness_winter_means, dates=thickness_winter_means.time.values,title="", set_cbarlabel = "Sea ice thickness (m)", col_wrap=3, cmap="viridis", vmin=0, vmax=5, out_str='thickness_winter_2018_2025')
staticArcticMaps_2025(freeboard_winter_means, dates=freeboard_winter_means.time.values,title="", set_cbarlabel = "Freeboard (m)", cmap="YlOrRd", vmin=0, vmax=0.8, out_str='freeboard_winter_2018_2025')
../_images/20f39fa738e57226bd35521eb41afb2da7bdde646077f021de0913828cb357cb.png
staticArcticMaps_2025(freeboard_winter_means-freeboard_winter_means.mean(axis=0), dates=freeboard_winter_means.time.values,title="", set_cbarlabel = "Freeboard anomalies(m)", cmap="RdBu", vmin=-0.2, vmax=0.2, out_str='freeboard_winter_2018_2025_anoms')
../_images/bcffed8a6f4b69aee78eca6f56e852e260b20f138bcf5bfe2672b2a65e327e99.png
staticArcticMaps_2025(thickness_winter_means, dates=thickness_winter_means.time.values,title="", set_cbarlabel = "Sea ice thickness (m)", cmap="viridis", vmin=0, vmax=5, out_str='thickness_winter_2018_2025')
../_images/c60094373180ba3b87fabff019beaac57efa13658dda3053c6896180e265ee11.png
staticArcticMaps_2025(thickness_winter_means-thickness_winter_means.mean(axis=0), dates=thickness_winter_means.time.values,title="", set_cbarlabel = "thickness anomalies (m)", cmap="RdBu", vmin=-1.5, vmax=1.5, out_str='thickness_winter_2018_2025_anomalies')
../_images/fd58d06e3b90fdb57b3bf5b69d4044fb1dc7be46872b0651eeed9004e23409de.png
staticArcticMaps_2025(snow_depth_winter_means, dates=snow_depth_winter_means.time.values,title="", set_cbarlabel = "Snow depth (m)", cmap="inferno", vmin=0, vmax=0.5, out_str='snow_depth_winter_2018_2025')
../_images/cc022eb1ce382825d6072d7613b9fb0750a31a4e77fdee22dfb42cbc33f4b89c.png
staticArcticMaps_2025(snow_depth_winter_means-snow_depth_winter_means.mean(axis=0), dates=snow_depth_winter_means.time.values,title="", set_cbarlabel = "snow depth anomalies (m)", cmap="RdBu", vmin=-0.2, vmax=0.2, out_str='snow_depth_winter_2018_2025_anoms')
../_images/3653427f7d048a483c8b2bbd976e95bfa1bcdf857c041e1f38b92ded024b4398.png

Updated Petty et al., (2023) time-series plots including winter 2024-2025#

Set some analysis configuration options#

# 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_v4_innerArctic = IS2SITMOGR4_v4.where(IS2SITMOGR4_v4.region_mask.isin(innerArctic))

# Drop Sep and October as coverage issues means they are hard to interpret
IS2SITMOGR4_v4_innerArctic = IS2SITMOGR4_v4_innerArctic.where(((IS2SITMOGR4_v4_innerArctic['time.month'] > 10)|(IS2SITMOGR4_v4_innerArctic['time.month'] < 5)), drop=True)

# 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_v4_innerArctic.freeboard, years=years, start_month="Sep", 
                                  figsize=(4.3,2.7), annotation='(a)', set_ylabel=r'Total freeboard (m)', 
                                  fmts = ['m.--','c.--','y.--','r.--','g.--','b.--', 'ko-'],
                                  save_label=save_label, loc_pos=4, legend=True)
../_images/76d5dc9546e58485aec590eab1b9000743700d569241a995700976e162e7e0dd.png
static_winter_comparison_lineplot(IS2SITMOGR4_v4_innerArctic.snow_depth, years=years, start_month="Sep", 
                                  figsize=(4.3,2.7), annotation='(b)',set_ylabel='Snow depth (m)', 
                                  fmts = ['m.--','c.--','y.--','r.--','g.--','b.--', 'ko-'],
                                  save_label=save_label, legend=False)
../_images/cbef28d6c37c17dfdc9e22dc0119d2b88e78ed1e83ab3e8644958e71ab157a9e.png
static_winter_comparison_lineplot(IS2SITMOGR4_v4_innerArctic.ice_thickness, 
                                  years=years, start_month="Sep", annotation='(c)', figsize=(4.3,2.7), 
                                  fmts = ['m.--','c.--','y.--','r.--','g.--','b.--', 'ko-'],
                                  set_ylabel='Sea ice thickness (m)', save_label=save_label, legend=False)
../_images/40ef112a5e98b221c4000855a0cb28db2addf1c73681930ae3755a29f17f683f.png
static_winter_comparison_lineplot(IS2SITMOGR4_v4_innerArctic.snow_density, years=years, start_month="Sep", 
                                  figsize=(4.3,2.7), annotation='(d)',set_ylabel=r'Snow density (kg/m$^3$)', 
                                  fmts = ['m.--','c.--','y.--','r.--','g.--','b.--', 'ko-'],
                                  save_label=save_label, legend=False)
../_images/80aecabe498bba9045e11ef97742b750d08e13a76a4187164c3b422671ed65b5.png
static_winter_comparison_lineplot(IS2SITMOGR4_v4_innerArctic.sea_ice_conc, years=years, start_month="Sep", figsize=(4.3,2.7), annotation='(e)', 
                                  fmts = ['m.--','c.--','y.--','r.--','g.--','b.--', 'ko-'],
                                  set_ylabel='Sea ice concentration', save_label=save_label, legend=False)
../_images/901f415d109a7b2332cac50dea6d04240e689769fd08b0155cc46a93042c3be7.png
static_winter_comparison_lineplot(IS2SITMOGR4_v4_innerArctic.ice_type, years=years, start_month="Sep", 
                                  figsize=(4.3,2.7), annotation='(f)',set_ylabel='Multi-year ice fraction', 
                                  fmts = ['m.--','c.--','y.--','r.--','g.--','b.--', 'ko-'],
                                  save_label=save_label, legend=False)
../_images/1678b789a61afd164d214afc843570031f3dd98067eeb4986ae367ccb3f18268.png

References#

Petty, A. A., Keeney, N., Cabaj, A., Kushner, P., & Bagnardi, M. (2023). Winter Arctic sea ice thickness from ICESat-2: upgrades to freeboard and snow loading estimates and an assessment of the first three winters of data collection. The Cryosphere,17, 127–156, https://doi.org/10.5194/tc-17-127-2023