Create animated biplots that enables dynamic visualisation of temporal or sequential changes in multivariate data by animating a single biplot across the levels of a time variable. It builds on objects from the 'biplotEZ' package, Lubbe S, le Roux N, Nienkemper-Swanepoel J, Ganey R, Buys R, Adams Z, Manefeldt P (2024)

moveEZ (pronounced move easy) extends the
biplotEZ package to
animate PCA biplots across the ordered levels of a categorical variable.
Rather than producing a separate static biplot per level, which
fragments sequential information and makes gradual structural change
difficult to perceive, moveEZ renders transitions between levels as a
continuous animation.
Install the released version from CRAN:
install.packages("moveEZ")
Or install the development version from GitHub:
# install.packages("devtools")
devtools::install_github("MuViSU/moveEZ")
moveEZ animates PCA biplots across the ordered levels of a categorical
variable — referred to as the time variable. This variable need not
represent chronological time; it may be any ordered index such as
experimental stages, algorithmic iterations, or measurement occasions.
Each distinct level of the time variable defines a time slice: the
subset of observations corresponding to that level.
The package provides three animation functions of increasing methodological complexity:
| Function | PCA computed | Variable vectors | Alignment |
|---|---|---|---|
moveplot() |
Once, on full dataset | Fixed | Not required |
moveplot2() |
Per time slice | Dynamic | Manual (align.time, reflect) |
moveplot3() |
Per time slice | Dynamic | Automated (GPA) |
All three functions support animated output (move = TRUE) and static
faceted output (move = FALSE).
library(moveEZ)
library(biplotEZ)
data("Africa_climate")
bp <- biplot(Africa_climate, scaled = TRUE) |>
PCA(group.aes = Africa_climate$Region) |>
samples(opacity = 0.8) |>
plot()
# Static faceted display
bp |> moveplot(time.var = "Year", group.var = "Region",
hulls = TRUE, move = FALSE)
# Animated display
bp |> moveplot(time.var = "Year", group.var = "Region",
hulls = TRUE, move = TRUE)
vignette("moveEZ"). Also consult the package website.If you encounter any issues or have questions, please open an issue on the GitHub repository.
Logo concept developed with assistance from OpenAI's ChatGPT (https://openai.com/chatgpt); final design by Raeesa and Johané.