Data & policies & politics

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      
> 

3: El resultado: China pisando  los talones de Estados Unidos