Carrera de barras animadas
Hace poco se han visto animaciones como esta:
La animación del video está hecha en D3. Mi repreoducción será en R. A continuación la secuencia:
1: Conseguir la base de datos y tenerla en el formato correcto
Para el ejemplo usaré la base de datos del Banco Mundial sobre Producto Interno Bruto por país desde 1960 hasta 2017.
La base debe tener este formato:

Y no en este:

La información es la misma pero su organización no. El primero es un formato largo y el segundo ancho. Si la base con al que se desea trabajar está en el segundo formato debe cambiarse al primero.
2: Limpiar la base
En este caso la limpieza es mínima. Solo que quitaron los datos que son agregaciones de países, por ejemplo la Unión Europea. Una vez hecho esto solo debe combinarse la base de datos con algunas funciones de las librerías ``ggplot`` y ``gganimate`` y listo. La limpieza depende de lo quiera mostrarse, así que no hay grandes reglas para esta parte.
3: Código R
Todo el código que sigue es reproducible y debería producir el mismo resultado.
# Sobre: barras animadas
# librerìas
library(tidyverse)
library(WDI) # para descargar bases de datos del banco mundial
library(magrittr)
library(gganimate)
library(hrbrthemes)
# importar los datos
WDI::WDIsearch("gdp")
pib <- WDI(country = "all", indicator = "NY.GDP.MKTP.KD", start = 1960)
#--------------
# limpieza
#--------------
pib %<>%
rename(valor = NY.GDP.MKTP.KD) %>% # renombra el codigo de la base de datos por un nombre más corto
slice(-(1:2773)) %>% # quita las primeras filas que 2773 filas que son el agregados por regiones
filter(!is.na(valor)) %>% # quita las filas sin datos
group_by(year) %>%
mutate(
rank = min_rank(-valor) * 1, # crea un ranking por año
Value_rel = valor/valor[rank==1],# crea un ranking relativo respecto al primer lugar
Value_lbl = paste0(" ",round(valor/1e9)) # se redondea a mil millones
) %>%
filter(rank <= 10) %>% # se seleccionan los 10 primeros lugares por año
ungroup() %>%
left_join(., countrycode::codelist %>% select(iso2c, un.name.es)) %>%
rename(nombre = un.name.es) # cambiar el nombre de países al español
# acortar el nombre de Estados Unidos y Reino Unido
pib$nombre %<>% gsub("Estados Unidos de América", "Estados Unidos", .)
pib$nombre %<>% gsub("Reino Unido de Gran Bretaña e Irlanda del Norte", "Inglaterra", .)
#--------------
# animacion
#--------------
ggplot(pib, aes(rank, group = nombre,
fill = as.factor(nombre), color = as.factor(nombre))) +
geom_tile(aes(y = valor/2,
height = valor,
width = 0.9), alpha = 0.8, color = NA) +
geom_text(aes(y = 0, label = paste(nombre, " ")), vjust = 0.2, hjust = 1) + # mombre del país
geom_text(aes(y = valor,label = Value_lbl, hjust=0)) + # valor del PIB
coord_flip(clip = "off", expand = FALSE) + # girar los ejes xy
scale_x_reverse() + # poner el valor más grande arriba
guides(color = FALSE, fill = FALSE) +
labs(subtitle = "PIB en billones de dólares",
title = 'Año: {closest_state}',
x = "",
y = "PIB en precios constantes a 2010, fuente: Banco Mundial",
caption = "rafalopezv.io") +
theme_ipsum_rc() +
theme(plot.title = element_text(hjust = 0, size = 22),
axis.ticks.y = element_blank(),
axis.text.y = element_blank(),
axis.title.x = element_blank(),
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
plot.margin = margin(1,1,1,4, "cm")) +
transition_states(year, transition_length = 4, state_length = 1) +
ease_aes('cubic-in-out') -> p
animate(p, 450, fps = 30, duration = 18, width = 800, height = 600) # animación
Por si se necesitara la información de mi sesión de trabajo:
R version 3.5.1 (2018-07-02)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS 10.14.2
Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] jcolors_0.0.4 gghighlight_0.1.0 hrbrthemes_0.6.0 gganimate_1.0.0 magrittr_1.5 WDI_2.6.0
[7] forcats_0.3.0 stringr_1.4.0 dplyr_0.8.0.1 purrr_0.3.2 readr_1.3.1 tidyr_0.8.3
[13] tibble_2.1.1 ggplot2_3.1.0 tidyverse_1.2.1
loaded via a namespace (and not attached):
[1] Rcpp_1.0.0 countrycode_1.1.0 lubridate_1.7.4 lattice_0.20-35 png_0.1-7 prettyunits_1.0.2
[7] assertthat_0.2.0 digest_0.6.18 utf8_1.1.4 R6_2.4.0 cellranger_1.1.0 plyr_1.8.4
[13] backports_1.1.3 evaluate_0.13 httr_1.4.0 pillar_1.3.1 gdtools_0.1.7 rlang_0.3.1
[19] progress_1.2.0 lazyeval_0.2.2 readxl_1.1.0 rstudioapi_0.9.0 gifski_0.8.6 extrafontdb_1.0
[25] rmarkdown_1.11 labeling_0.3 extrafont_0.17 munsell_0.5.0 broom_0.5.1 compiler_3.5.1
[31] modelr_0.1.2 xfun_0.5 pkgconfig_2.0.2 htmltools_0.3.6 tidyselect_0.2.5 fansi_0.4.0
[37] crayon_1.3.4 withr_2.1.2 grid_3.5.1 nlme_3.1-137 jsonlite_1.6 Rttf2pt1_1.3.7
[43] gtable_0.2.0 scales_1.0.0 cli_1.0.1 stringi_1.4.3 farver_1.1.0 xml2_1.2.0
[49] generics_0.0.2 tools_3.5.1 RJSONIO_1.3-0 glue_1.3.1 tweenr_1.0.1 hms_0.4.2
[55] yaml_2.2.0 colorspace_1.4-0 rvest_0.3.2 knitr_1.22 haven_1.1.2
>