moveEZ - pronounced move easy

An R package for animated biplots.

Ganey R & Nienkemper-Swanepoel J (2025). moveEZ: Animated Biplots. R package version 1.2.0, https://CRAN.R-project.org/package=moveEZ.

Background

  • Multivariate data underpins much of modern science from climate and agriculture to public health and economics.
  • Static biplots capture variable–observation relationships at a single moment but not how those relationships shift as conditions change.
  • The obvious fix - one biplot per time level - collapses with many levels into an unreadable wall of plots.
  • moveEZ instead animates a single biplot across the time variable, turning it into a temporal narrative where trajectories and patterns of change emerge intuitively.
  • And “time” is just the common case: the framework handles any ordered factor - treatment levels, experimental conditions, and more.

Biplots

  • Singular Value Decomposition
X
n × p
= U
n × p
D
p × p
V′
p × p
  • Representing samples
Z
n × p
= X
n × p
V′
p × p
  • Representing variables
V
p × p

The data: ERA5 over African cities

Fifth-generation ECMWF atmospheric reanalysis (ERA5), via the Copernicus Climate Data Store.

  • 20 African cities
  • 26 years of monthly observations
  • Observations: one city–year
  • Vectors: climate variables
Variable Description
t2m 2 m air temperature (°C)
ssr Surface net solar radiation (J/m²)
d2m 2 m dew point (°C)
sp Surface pressure (hPa)
wind_speed 10 m wind speed (m/s)
tp Total precipitation (mm)

The PCA biplot

Principal Component Analysis projects high-dimensional data onto a lower-dimensional plane:

  • Observations → points
  • Variables → vectors

This dual display lets us read, simultaneously:

  • clusters of similar observations,
  • associations among variables,
  • how individual observations score on each measured condition.

But this is a single snapshot. Let the controlled factor be time and the points and axes begin to move. Capturing that movement is exactly what moveEZ is built to do.

Three animation frameworks

moveEZ provides three functions of increasing methodological complexity:

moveplot()
Fixed variable frame

Single PCA on full dataset.
Variable vectors fixed; only sample positions animated across time levels.
moveplot2()
Dynamic frame

Separate PCA per time slice.
Both samples and variable vectors evolve. Manual alignment for sign indeterminacy.
moveplot3()
Dynamic frame + GPA

Extends moveplot2() with automated alignment via Generalised Procrustes Analysis.
Beyond today's scope — see the package vignette.

Fixed Variable Frame: moveplot()

moveplot() computes a single PCA decomposition on the full dataset. Variable vectors remain fixed throughout the animation, providing a stable reference frame. Only sample positions - sliced by the time variable - are animated.

Most appropriate when the variance–covariance structure can be assumed stable across time, and the only viable option when there is a single observation per group per time level.

Samples
Z
Variables
V

Biplots sliced by year with moveplot()

Biplot animated across years for different regimes with moveplot()

Biplot animated across years for different cities with moveplot()

Dynamic Frame: moveplot2()

moveplot2() computes a separate PCA decomposition for each time slice, allowing both sample positions and variable vectors to evolve. This gives a more faithful depiction of time-varying variance–covariance structures.

Samples
Variables
X1
Z1
V1
X2
Z2
V2

X8
Z8
V8

Biplot for each regime using moveplot2()

Relationships by regime (1/2)

  • Desert - Sunshine + temperature move together, opposing pressure; moisture + rain pair up, and wind runs against them (windier = drier).
  • Dry-winter highland - Pressure + precipitation align, opposite sunshine + wind; temperature + dewpoint form a separate axis.
  • Humid subtropical - Temperature + moisture tightly coupled, opposing pressure; sunshine and wind act as independent drivers; rain separates off.
  • Mediterranean - Precipitation dominates its own vertical axis; dewpoint/wind/temperature bundle, opposed by pressure.

Biplot for each regime using moveplot2()

Relationships by regime (2/2)

  • Oceanic - Temperature, sunshine, moisture, wind collapse into one cluster; pressure opposes it; rain forms a clean independent axis.
  • Semi-arid - Sunshine + rain together, wind + dewpoint together; arrows more spread, so associations are weaker and less polarised.
  • Tropical savanna - Mirrors Oceanic: temperature/sunshine/wind/dewpoint group against pressure, with rain as its own near-perpendicular axis.

Two patterns hold across regimes

  • Surface pressure consistently trades off against the temperature–sunshine group.
  • Precipitation is most independent in the wetter/maritime regimes (Mediterranean, Oceanic, Tropical savanna), but couples with moisture or sunshine in the drier ones.

Durban in Humid subtropical

Cape Town in Mediterranean

The Annual Orbit

  • Connecting each year’s monthly points in calendar order traces a closed loop through the biplot - the city’s annual climate cycle as a single shape.

  • Position locates the climate regime in the reduced space

  • Shape & size of the loop capture seasonal range and how variables co-vary through the year

  • Animation across years shows whether the orbit holds steady or drifts - a visual signature of regime change

  • A stationary climate returns to the same orbit each year; a shifting one spirals.

Johannesburg in Dry-winter Highland

Conclusions

  • moveEZ transforms the static biplot into a temporal narrative, making gradual multivariate structural change immediately apparent in continuous animated sequences.

  • Applied to ERA5 African climate data, the package reveals how associations among climate variables evolve, how regional climate profiles shift in multivariate space, and how the trajectory and magnitude of change differ across regions - insights directly relevant to climate adaptation and resilience research.

  • Two complementary frameworks cater to different assumptions about temporal stability: a fixed reference frame (moveplot()) when structure is stable, and a dynamic frame (moveplot2()) when it evolves.

  • For settings where cross-slice sign and orientation indeterminacy need to be resolved automatically, moveplot3() adds Generalised Procrustes alignment - available in the package for those who want to go further.

References

  • Ganey R & Nienkemper-Swanepoel J (2025). moveEZ: Animated Biplots. R package version 1.2.0, https://CRAN.R-project.org/package=moveEZ.

  • Hersbach, H., Bell, B., Berrisford, P., et al. 2023. ERA5 monthly averaged data on single levels from 1940 to present. Copernicus Climate Change Service (C3S) Climate Data Store (CDS), DOI: 10.24381/cds.f17050d7

  • Lubbe S, le Roux N, Nienkemper-Swanepoel J, et al. 2024. biplotEZ: EZ-to-Use Biplots. https://doi.org/10.32614/CRAN.package.biplotEZ.