Comenzamos cargando las librerías necesarias para obtener las distintas animaciones. Para construir animaciones con la librería gganimate debemos usarla conjuntamente con ggplot2, junto a otras que aumentan su potencial:

library(ggplot2)
library(gganimate)
if(!"transformr" %in% installed.packages()) install.packages("transformr")
if(!"gifski" %in% installed.packages()) install.packages("gifski")
library(gifski)
if(!"ggpubr" %in% installed.packages()) install.packages("ggpubr")
library(ggpubr)

Gráficos de líneas o puntos animados

Vamos a mostrar cómo animar un diagrama de puntos a partir de una variable. Usaremos el conjunto real de datos RiesgoPobrezaTasa.xls que contiene la tasa de riesgo de pobreza anual por comunidades autónomas en España desde 2008 hasta 2020.

# Instalamos la librería readxl, caso de no tenerla ya instalada
if(!"readxl" %in% installed.packages())
  install.packages("readxl")

library(readxl)
# Importamos el conjunto de datos
data <- read_excel("RiesgoPobrezaTasa.xls")

El tipo de gráfico más adecuado para representar series temporales es el de líneas, que podemos obtener con geom_line() de ggplot2. En él podemos apreciar cómo varía la tasa de riesgo de pobreza por año, distinguiendo por comunidad autónoma (valor recogido en la variable ccaa del data.frame).

ggplot(data)+
  aes(x=agno,y=riesgo1,colour=ccaa)+
  geom_line(aes(linetype=ccaa))+
  labs(title="Riesgo de Pobreza",x="Año",y="Tasa")+
  scale_colour_discrete(name="CCAA")+
  guides(linetype="none")+
  theme_minimal()

Para guardar el gráfico, podemos utilizar la función ggsave(filename, plot=last_plot(), device=NULL). Acepta los formatos "ps", "tex" (pictex), "pdf", "jpeg", "tiff", "png", "bmp", "svg" o "wmf" (solo para windows).

gplot <- ggplot(data)+
  aes(x=agno,y=riesgo1,colour=ccaa)+
  geom_line(aes(linetype=ccaa))+
  labs(title="Riesgo de Pobreza",x="Año",y="Tasa")+
  scale_colour_discrete(name="CCAA")+
  guides(linetype="none")+
  theme_minimal()

ggsave("Pobreza",gplot,device="jpeg")
## Saving 7 x 5 in image

Si queremos animar

gplot + transition_reveal(agno)

Una función interesante de la librería ggpubr es ggarrange(), que permite representar dos o más gráficos creados con ggplot2 en una misma gráfica, en la que además se puede unificar la leyenda.

# Creamos un primer gráfico y lo almacenamos en gplot1
gplot1 <- ggplot(data)+
  aes(x=agno,y=riesgo1,colour=ccaa)+
  geom_line()+
  labs(title="Riesgo de Pobreza 1",x="Año",y="Tasa")+
  scale_x_continuous(breaks=2008:2020)+
  scale_colour_discrete(name="CCAA")+
  guides(linetype="none")+
  theme_minimal()

# Creamos un segundo gráfico y lo almacenamos en gplot2
gplot2 <- ggplot(data)+
  aes(x=agno,y=riesgo2,colour=ccaa)+
  geom_line()+
  labs(title="Riesgo de Pobreza 2",x="Año",y="Tasa")+
  scale_x_continuous(breaks=2008:2020)+
  scale_colour_discrete(name="CCAA")+
  guides(linetype="none")+
  theme_minimal()

# Mostramos ambos gráficos juntos con la misma legenda
ggarrange(gplot1,gplot2,ncol=1,nrow=2,common.legend=TRUE)

Vamos a construir un diagrama de puntos dinámico en el que representamos la tasa de riesgo de pobreza donde cada color representa una comunidad autónoma, y la animación dependerá del año. Para hacer la animación utilizamos la función transition_states() de la librería gganimate. Necesitamos además instalar algunos paquetes adicionales (transformry gifski).

ggplot(data)+
  aes(x=riesgo1,y=riesgo2,colour=ccaa)+
  geom_point()+
  labs(title="Riesgo de Pobreza. Año: {closest_state}",x="Tasa",y="Tasa con alquiler imputado")+
  scale_colour_discrete(name="CCAA")+
  theme_bw()+
  transition_states(agno,transition_length = 0.5, state_length = 0.3)

Finalmente, para guardar el gráfico animado en formato gif, debemos introducir el gráfico en una variable, por ejemplo gplot y utilizar la función anim_save().

gplot <- ggplot(data)+
  aes(x=riesgo1,y=riesgo2,colour=ccaa)+
  geom_point()+
  labs(title="Riesgo de Pobreza. Año: {closest_state}",x="Tasa",y="Tasa con alquiler imputado")+
  scale_colour_discrete(name="CCAA")+
  theme_bw()+
  transition_states(agno,transition_length = 0.5, state_length = 0.3)

anim_save("anim_Riqueza.gif",gplot)

Diagramas de barras animados

Creamos el conjunto de datos, a partir de la información recogida por el Instituto Nacional de Estadística, acerca de la serie histórica de nacimientos en España por sexo desde 1946 hasta 2020:

nhombres=c(174842,185523,191569,202478,211087,216496,220843,219056,234386,243292,
           250727,255954,268377,253895,249184,240201,234875,227584,215995,208787,
           205596,195742,188997,190112,186698,187399,191055,199406,204727,204878,
           207495,211201,216707,221297,227176,236229,246051,251585,268639,278175,
           296225,310911,329779,339101,349232,346386,353727,346075,345963,345851,
           341401,342713,342726,349315,344358,347027,358304,345299,338813,336867,
           341715,336105,334511,331588,311684,307544,295932,302746,305899,291782,
           290300,308649,329655,302341,300015)
nmujeres=c(166473,175094,181208,190703,199496,203794,206752,206659,220262,228707,
           235848,239043,251402,238632,233773,226170,219716,214297,202851,197593,
           192036,184388,176196,178923,175928,176070,179093,186380,192020,191111,
           193930,197233,202212,205485,211574,220069,227230,233767,247067,254833,
           274794,291081,307113,317256,328224,322992,334984,326888,326442,326241,
           322266,323855,324585,330810,325561,329334,339393,326221,320003,317749,
           321660,318369,318705,315196,296437,291426,281954,286442,287120,275692,
           275078,293110, 312386,286391,285366)
años=1946:2020
naños=length(años)
nacimientos=data.frame(Año=rep(años,2), 
                       Sexo=rep(c("Niño", "Niña"),c(naños,naños)),
                       Número=c(rev(nhombres),rev(nmujeres)))

Representamos con un diagrama de barras el número de nacimientos de niñas y niños con ggplot, añadimos una capa con la animación por año y almacenamos el gráfico generado en el objeto gNacimientos

ggplot(data=nacimientos, aes(x = Sexo, y = Número, 
                             fill= Sexo )) +
  geom_bar(stat= "identity", 
           color = "white", 
           show.legend = FALSE) +
  geom_text(aes(label = Número), 
            position = position_dodge(0.9), 
            vjust= 1.2, 
            size = 6, 
            color = "white")+
  scale_fill_manual(values = c("hotpink3", "#79CDCD")) +
  scale_y_continuous(labels = scales::comma) +
  theme_minimal()+
  enter_appear() +
  transition_states(Año,
                    transition_length = 1.5,
                    state_length=2, wrap=FALSE) +
  labs(title = " Recién nacidos en España por sexo \n Año : {closest_state}", 
       y = "",
       x = "", 
       caption = "Instituto Nacional de Estadística") +
  theme(panel.grid.major.x = element_blank(),
        plot.title = element_text(size = 14, 
                                  face = "bold", 
                                  hjust = 0.5)) ->gNacimientos

Finalmente, mostramos la animación:

animate(gNacimientos, nframes=150, width=400, height=400, fps=5)

Podemos guardar la animación con anim_save

anim_save("Nacimientos.gif")

Una forma alternativa de hacer la representación podría ser mostrando los datos apilados en una única barra:

ggplot(data=nacimientos, aes(x="",
                             y = Número, 
                             fill= Sexo )) +
  geom_bar(stat= "identity", 
           color = "white", 
           show.legend = TRUE) + # Ahora sí es necesaria
  geom_text(aes(label = as.factor(Número)), 
            position = position_stack(vjust=0.5), 
            size = 6, 
            color = "white")+
  scale_fill_manual(values = c("hotpink3", "#79CDCD")) +
  scale_y_continuous(labels = scales::comma) +
  theme_minimal()+
  enter_appear() +
  transition_states(Año,
                    transition_length = 1.5,
                    state_length=2) +
  labs(title = " Recién nacidos en España por sexo \n Año : {closest_state}", 
       y = "",
       x = "", 
       caption = "Instituto Nacional de Estadística") +
  theme_minimal()+
  theme(panel.grid.major.x = element_blank(),
        plot.title = element_text(size = 14, 
                                  face = "bold", 
                                  hjust = 0.5)) ->gNacimientos
animate(gNacimientos, nframes=150, width=400, height=400, fps=5)

Una alternativa más para visualizar una animación de este conjunto de datos sería mostrar la evolución temporal del total de nacimientos. Modificamos el conjunto de datos:

nacimientosT=data.frame(Año=años, 
                        Total=rev(nhombres)+rev(nmujeres))

Construimos el gráfico

ggplot(data=nacimientosT, aes(x=Año, y= Total, fill="orange"))+
  geom_col(show.legend = FALSE)+
  scale_y_continuous(labels = scales::comma) +
  theme_minimal()+
  labs(x="Año", y="",
       title="Total de nacimientos en España",
       caption = "Instituto Nacional de Estadística")+
  theme(plot.title = element_text(size = 14, 
                                  face = "bold", 
                                  hjust = 0.5))

y lo animamos

ggplot(data=nacimientosT, aes(x=Año, y=Total, fill="orange"))+
  geom_col(show.legend = FALSE)+
  scale_y_continuous(labels = scales::comma) +
  theme_minimal()+
  labs(x="Año", y="",
       title="Nacimientos anuales en España \n Año: {closest_state}",
       caption = "Instituto Nacional de Estadística")+
  transition_states(Año)+
  shadow_mark()+
  theme(plot.title = element_text(size = 14, 
                                  face = "bold", 
                                  hjust = 0.5))->gNacimientosT
animate(gNacimientosT, nframes=150, width=900, height=300, fps=5)