Librería

gganimate

Autor principal

Thomas Lin Pedersen

Datos de muestra

Los ejemplos de este tutorial utilizan el dataset gapminder, que contiene datos de PIB per cápita, esperanza de vida y población de 142 países a lo largo de 12 años.

# install.packages("gapminder")
library(gapminder)

df <- gapminder

transition_time()

transition_time() anima los datos a lo largo de una variable temporal continua. Pasa la columna de tiempo a la función y gganimate interpolará fotogramas entre cada valor.

También necesitas el paquete gifski instalado como renderizador de GIF.

# install.packages("gganimate")
# install.packages("gifski")
library(ggplot2)
library(gganimate)
library(gapminder)

ggplot(gapminder, aes(x = gdpPercap, y = lifeExp,
                      size = pop, color = continent)) +
  geom_point(alpha = 0.7) +
  scale_x_log10() +
  scale_size(range = c(2, 12), guide = "none") +
  transition_time(year)

Gráfico de dispersión animado con transition_time en gganimate

Mostrar el valor del fotograma actual

Usa {frame_time} dentro de labs() para mostrar el valor temporal en el título u otras etiquetas. Puedes envolverlo con round() para eliminar los decimales.

library(ggplot2)
library(gganimate)
library(gapminder)

ggplot(gapminder, aes(x = gdpPercap, y = lifeExp,
                      size = pop, color = continent)) +
  geom_point(alpha = 0.7) +
  scale_x_log10() +
  scale_size(range = c(2, 12), guide = "none") +
  transition_time(year) +
  labs(title = "Year: {round(frame_time)}",
       x = "GDP per capita", y = "Life expectancy")

Mostrar el año actual en el título de gganimate con frame_time

transition_states()

transition_states() está diseñado para categorías discretas. Transiciona entre estados definidos por una variable de agrupación. Usa {closest_state} en labs() para mostrar el estado activo.

transition_length controla cuánto dura cada transición y state_length cuánto tiempo se mantiene cada estado.

# install.packages("dplyr")
library(dplyr)
library(ggplot2)
library(gganimate)
library(gapminder)

df <- gapminder %>%
  filter(year %in% c(1952, 1972, 1992, 2007)) %>%
  group_by(year, continent) %>%
  summarise(mean_life = mean(lifeExp))

ggplot(df, aes(x = continent, y = mean_life, fill = continent)) +
  geom_col() +
  transition_states(year,
                    transition_length = 2,
                    state_length = 1) +
  labs(title = "Year: {closest_state}") +
  theme_minimal() +
  theme(legend.position = "none")

Gráfico de barras animado con transition_states en gganimate

transition_reveal()

Gráfico de líneas animado con transition_reveal en gganimate

transition_reveal() dibuja progresivamente los datos a lo largo de un eje, manteniendo visibles los datos ya revelados. Funciona mejor con geom_line() y geom_point().

library(dplyr)
library(ggplot2)
library(gganimate)
library(gapminder)

df <- gapminder %>%
  filter(country %in% c("United States", "China",
                         "India", "Germany", "Brazil"))

ggplot(df, aes(x = year, y = lifeExp,
               color = country, group = country)) +
  geom_line(linewidth = 1) +
  geom_point(size = 2) +
  transition_reveal(year) +
  labs(x = "Year", y = "Life expectancy") +
  theme_minimal()

shadow_mark()

shadow_mark() deja marcas permanentes de todos los fotogramas anteriores. Combinado con transition_time() permite ver la trayectoria completa de los datos a medida que avanza la animación.

alpha y size controlan el aspecto de las marcas.

library(ggplot2)
library(gganimate)
library(gapminder)

ggplot(gapminder, aes(x = gdpPercap, y = lifeExp,
                      size = pop, color = continent)) +
  geom_point(alpha = 0.7) +
  scale_x_log10() +
  scale_size(range = c(2, 12), guide = "none") +
  transition_time(year) +
  labs(title = "Year: {round(frame_time)}") +
  shadow_mark(alpha = 0.1, size = 0.5)

shadow_mark en gganimate dejando marcas permanentes de fotogramas anteriores

ease_aes()

ease_aes() controla cómo se interpolan los valores entre fotogramas. El valor por defecto es "linear", pero puedes usar las opciones que se muestran a continuación para cambiar el movimiento de la animación.

Interpolación lineal con ease_aes en gganimate

"linear" (por defecto)

library(ggplot2)
library(gganimate)
library(gapminder)

ggplot(gapminder, aes(x = gdpPercap, y = lifeExp,
                      size = pop, color = continent)) +
  geom_point(alpha = 0.7) +
  scale_x_log10() +
  scale_size(range = c(2, 12), guide = "none") +
  transition_time(year) +
  ease_aes("linear")

Suavizado cubic-in-out con ease_aes en gganimate

"cubic-in-out"

Empieza despacio, acelera en el centro y decelera al final. Otras opciones habituales son "bounce-out", "elastic-in-out" y "back-in-out".

library(ggplot2)
library(gganimate)
library(gapminder)

ggplot(gapminder, aes(x = gdpPercap, y = lifeExp,
                      size = pop, color = continent)) +
  geom_point(alpha = 0.7) +
  scale_x_log10() +
  scale_size(range = c(2, 12), guide = "none") +
  transition_time(year) +
  ease_aes("cubic-in-out")

animate() y anim_save()

Usa animate() para controlar los parámetros de salida. nframes establece el número total de fotogramas, fps los fotogramas por segundo y width/height las dimensiones en píxeles.

Llama a anim_save() después de animate() para guardar la última animación renderizada como archivo GIF.

library(ggplot2)
library(gganimate)
library(gapminder)

p <- ggplot(gapminder, aes(x = gdpPercap, y = lifeExp,
                           size = pop, color = continent)) +
  geom_point(alpha = 0.7) +
  scale_x_log10() +
  scale_size(range = c(2, 12), guide = "none") +
  transition_time(year) +
  labs(title = "Year: {round(frame_time)}")

animate(p,
        nframes = 100,  # Total de fotogramas
        fps = 10,       # Fotogramas por segundo
        width = 600,    # Ancho en píxeles
        height = 400)   # Alto en píxeles

anim_save("gapminder.gif")

Controlar velocidad y dimensiones de la animación con animate() en gganimate

MASTER - STATISTICS DOT COM

Master Statistics

Aprende estadística desde lo básico hasta técnicas avanzadas, explicado con claridad

Ir al sitio
R PACKAGES IO

R Packages

Explora y descubre miles de paquetes, funciones y datasets de R

Ir al sitio

También te puede interesar