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)
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 (transformr
y 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)
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)