Note
Go to the end to download the full example code.
Animating drifter trajectories#
Trajan supports animating trajectory datasets using a builder pattern.
Start with ds.traj.animate(), chain configuration methods, then call
.show() to display interactively or .save() to write a file.
import logging
import lzma
import numpy as np
import xarray as xr
import coloredlogs
import trajan as ta
coloredlogs.install(level=logging.DEBUG, logger=logging.getLogger('trajan'))
Load the Barents Sea drifter dataset, drop short gaps and grid to 6-hourly.
2026-07-06 13:43:40 runnervmkkn4f h5py._conv[4354] DEBUG Creating converter from 7 to 5
2026-07-06 13:43:40 runnervmkkn4f h5py._conv[4354] DEBUG Creating converter from 5 to 7
2026-07-06 13:43:40 runnervmkkn4f h5py._conv[4354] DEBUG Creating converter from 7 to 5
2026-07-06 13:43:40 runnervmkkn4f h5py._conv[4354] DEBUG Creating converter from 5 to 7
2026-07-06 13:43:40 runnervmkkn4f h5py._conv[4354] DEBUG Creating converter from 3 to 5
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detecting trajectory dimension
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detecting time-variable for "obs"..
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detected obs-dim: obs, detected time-variable: time.
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detected Ragged trajectory dataset
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detecting trajectory dimension
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detecting time-variable for "obs"..
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detected obs-dim: obs, detected time-variable: time.
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detected Ragged trajectory dataset
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detecting trajectory dimension
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detecting time-variable for "obs"..
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detected obs-dim: obs, detected time-variable: time.
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detected Ragged trajectory dataset
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detecting trajectory dimension
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detected obs-dim: time, detected time-variable: time.
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detected Orthogonal trajectory dataset
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detecting trajectory dimension
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detecting time-variable for "obs"..
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detected obs-dim: obs, detected time-variable: time.
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detected Ragged trajectory dataset
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detecting trajectory dimension
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detected obs-dim: time, detected time-variable: time.
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detected Orthogonal trajectory dataset
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detecting trajectory dimension
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detected obs-dim: time, detected time-variable: time.
2026-07-06 13:43:40 runnervmkkn4f trajan.accessor[4354] DEBUG Detected Orthogonal trajectory dataset
Basic animation — just call .animate() and .show().
The title shows the current timestamp automatically.
ds.traj.animate().set_title('Barents Sea drifters').show()

2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG Setting up new plot object.
2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:43:40 runnervmkkn4f trajan.plot[4354] DEBUG Creating new figure and axes..
2026-07-06 13:43:40 runnervmkkn4f trajan.animation[4354] DEBUG Dataset is already regularly gridded, skipping gridtime
2026-07-06 13:43:40 runnervmkkn4f trajan.animation[4354] DEBUG Building animation: 192 frames
2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:43:40 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
Colour particles by drift speed.
Pass the DataArray directly to color_by — no need to add it to the dataset.

2026-07-06 13:44:22 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:44:22 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:44:22 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:44:22 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:44:22 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:44:22 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:44:22 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:44:22 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:44:22 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:44:22 runnervmkkn4f trajan.plot[4354] DEBUG Creating new figure and axes..
2026-07-06 13:44:22 runnervmkkn4f trajan.animation[4354] DEBUG Dataset is already regularly gridded, skipping gridtime
2026-07-06 13:44:22 runnervmkkn4f trajan.animation[4354] DEBUG Building animation: 192 frames
2026-07-06 13:44:22 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:44:22 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:44:22 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:44:22 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:44:22 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:44:22 runnervmkkn4f matplotlib.colorbar[4354] DEBUG locator: <matplotlib.ticker.AutoLocator object at 0x7ff4c002d520>
Show static trajectory lines in the background so the full path of each drifter is always visible.

2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.plot[4354] DEBUG Creating new figure and axes..
2026-07-06 13:45:07 runnervmkkn4f trajan.animation[4354] DEBUG Dataset is already regularly gridded, skipping gridtime
2026-07-06 13:45:07 runnervmkkn4f trajan.animation[4354] DEBUG Building animation: 192 frames
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.plot[4354] DEBUG Plotting lines
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.plot[4354] DEBUG axes already set up
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f trajan.traj[4354] DEBUG No grid-mapping specified, checking if coordinates are lon/lat..
2026-07-06 13:45:07 runnervmkkn4f matplotlib.colorbar[4354] DEBUG locator: <matplotlib.ticker.AutoLocator object at 0x7ff44fc22690>