R que R

Data Visualization: Evolución temporal

Fri, Nov 29, 2019
R Data Visualization
#gapminder #gganimate #echarts4r


Paquetes



library(tidyverse)
library(gapminder)
library(echarts4r)
library(gganimate)
library(viridis)
library(hrbrthemes)
library(DT)


Dataset


En esta ocasión vamos a utilizar una dataset bastante conocido llamado gapminder que se encuentra en el paquete del mismo nombre. Este dataframe contiene la siguiente información para 142 países:

  • country: Nombre de 142 países. No osbtante sorprende la ausencia de países de gran tamaño como Rusia, Groenlandia o Ucrania entre otros.
  • continent: Indica el continente de cada país.
  • year: El rango de datos abarca el periodo 1952-2007 (en incrementos de 5 años).
  • lifeExp: Indica la esperanza de vida de cada país en años.
  • pop: Población.
  • gdpPercap: Indica el PIB por habitante en dólares ajustados a la inflación.


Veámos el conjunto del dataframe:



datatable(gapminder)



datos_gapminder <- gapminder %>%
  mutate(Name = recode_factor(country,
                              `Congo, Dem. Rep.`= "Dem. Rep. Congo",
                              `Congo, Rep.`= "Congo",
                              `Cote d'Ivoire`= "Côte d'Ivoire",
                              `Central African Republic`= "Central African Rep.",
                              `Yemen, Rep.`= "Yemen",
                              `Korea, Rep.`= "Korea",
                              `Korea, Dem. Rep.`= "Dem. Rep. Korea",
                              `Czech Republic`= "Czech Rep.",
                              `Slovak Republic`= "Slovakia",
                              `Dominican Republic`= "Dominican Rep.",
                              `Equatorial Guinea`= "Eq. Guinea"))


Evolución en un bubblechart con gganimate


Una opción muy recurrente para mostrar la evolución de los países, especialmente para evidenciar la relación entre algún indicador con respecto al PIB por habitante de cada país, es realizar un scatterplot o un bubblechart donde cada variable se representa en uno de los ejes del gráfico (abscisas y ordenadas) y donde el tamaño de las burbujas correponde al tamaño de cada una de las economías (bien sea por población, PIB u otro indicador). Por su parte, el paquete {gganimate} nos permite dinamizar el gráfico para observar de una forma más natural la evolución temporal de la relación entre las variables analizadas.


En esta ocasión vamos a representar la evolución de la relación entre la esperanza de vida y el PIB por habitante de los países presentes en el dataset. El tamaño de las burbujas corresponderá al tamaño de cada economía según su población. Sin lugar a duda China e India destacarán con respecto al resto de países debido a su gran población.



plot <-  ggplot(datos_gapminder, 
                aes(x= log(gdpPercap), 
                       y= lifeExp)) +
  geom_point(aes(size = pop,
                 fill= Name),
             alpha = 0.9, 
             colour= "black",
             shape = 21,
             show.legend = F) +
  scale_size(range = c(0.5, 40)) +
  scale_fill_viridis(discrete = T, option = "magma") +
  theme_minimal() + 
  theme(
    axis.line = element_blank(),
    axis.ticks = element_blank(),
    plot.background = element_rect(fill = "snow", color = NA),
    panel.background = element_rect(fill= "snow", color = NA),
    plot.title = element_text(size = 16, hjust = 0.5),
    plot.subtitle = element_text(size = 14, hjust = 0.5),
    plot.caption = element_text(size = 10, hjust = 1))+
  labs(title = "GDP per Capita VS. Life Expectancy",
       subtitle = "Year: {closest_state}",
       caption = "Fuente: Gapminder",
       x = "GDP per cápita (log)",
       y = "Life Expectancy")

 plot+ transition_states(year) 


Debido al gran número de países resulta difícil identificarlos por colores. Sin embargo, puede resultar conveniente asignar un color a cada continente, como por ejemplo el de los anillos olímpicos. Para ello podemos indicar los cólores deseados de la siguiente forma:



plot_2 <-  ggplot(datos_gapminder, 
                aes(x= log(gdpPercap), 
                       y= lifeExp)) +
  geom_point(aes(size = pop,
                 fill= continent),
             alpha = 0.9, 
             colour= "black",
             shape = 21,
             show.legend = F) +
  scale_size(range = c(0.5, 40)) +
  scale_fill_manual(values = c("grey30", "firebrick3", "gold", "forestgreen", "dodgerblue")) +
  theme_minimal() + 
  theme(
    axis.line = element_blank(),
    axis.ticks = element_blank(),
    plot.background = element_rect(fill = "snow", color = NA),
    panel.background = element_rect(fill= "snow", color = NA),
    plot.title = element_text(size = 16, hjust = 0.5),
    plot.subtitle = element_text(size = 14, hjust = 0.5),
    plot.caption = element_text(size = 10, hjust = 1))+
  labs(title = "GDP per Capita VS. Life Expectancy",
       subtitle = "Year: {closest_state}",
       caption = "Fuente: Gapminder",
       x = "GDP per cápita (log)",
       y = "Life Expectancy")

 plot_2 + transition_states(year) 


Los gráficos sugieren que existe una relación entre la esperanza de vida de los países y su PIB per cápita. También parece evidente que, a granes rasgos, existen diferencias notables por continente, siendo los países africanos los que, por lo general, registran un menor PIB per cápita y una menor esperanza de vida. Por el lado positivo se observa una evolución favorable a lo largo del periodo analizado, dándose un progresivo y generalizado incremento del VAB por habitante y, con ello, una progresiva mejora en la esperanza de vida de la mayoría de países.


Bar chart con {gganimate}


Otra posibilidad para examinar la evolución de la esperanza de vida en los países incluidos en el dataframe gapminder es realizar un gráfico de barras donde se refleje el valor de cada país en algún año determinado. Al realizar el gráfico podemos diferenciar los países por continente con el objetivo de comparar no solo la situación general de los distintos continentes sino también la situación relativa de cada país en comparación con otros países del mismo continente.


Antes de graficar realizamos una serie de modificaciones al dataframe utilizado previamente. Nos interesa establecer las etiquetas que aparecerán en el gráfico (redondeamos el valor de la esperanza de vida) así como calcular la esperanza de vida promedio de todo el periodo en cada país, valor que nos servirá para ordenar los distintos países en el gráfico. Nótese que en este caso hemos decidido ordenar los países según el valor promedio pero podríamos escoger otro criterio para ello.


datos_gapminder_plot3 <- datos_gapminder %>%
  group_by(country) %>%
  arrange(country) %>%
  mutate(label = paste0(" ", round(lifeExp))) %>%
  mutate(mean = mean(lifeExp))

datos_gapminder_plot3$lifeExp <- formatC(datos_gapminder_plot3$lifeExp, format = "f", digits=1)

datos_gapminder_plot3$lifeExp <- as.numeric(datos_gapminder_plot3$lifeExp)


Una vez tenemos preparado el dataset realizamos el gráfico. Utilizamos el theme_lab() de traffordatalab, theme que ya hemos utilizado previamente y que personalmente encuentro bastante agradable a la vista.



source("https://github.com/traffordDataLab/assets/raw/master/theme/ggplot2/theme_lab.R")


plot_3 <- datos_gapminder_plot3 %>%
  ggplot(aes(reorder(country, mean), lifeExp, 
             fill= continent)) +
  geom_col(alpha = 0.8,
           size= 2)+
  coord_flip() +
  facet_wrap(~continent, scales= "free_y", ncol=2) +
  labs(title = "Expectativa de vida por país y continente", 
       subtitle = "Year : {closest_state}",
       caption = "Fuente: gapminder",
       fill= NULL,
       x= "", y="") +
  theme_lab()+
  theme(panel.grid.major.x = element_blank(),
        plot.title = element_text(size = 14, 
                                  face = "bold", 
                                  hjust = 0.5),
        plot.subtitle = element_text(size=14, 
                                     face = "plain", 
                                     hjust = 0.5),
        axis.text.y= element_text(size = 8, hjust = 1),
        axis.text.x= element_text(size = 8),
        panel.grid.minor = element_blank(),
        panel.grid.major = element_blank())+
  geom_hline(yintercept=c(25, 50, 75, 100), 
             color = "lightgrey",
             linetype = "dashed")+
  geom_text(aes(label = label), 
            hjust = 0,
            color = "grey40",
            size = 2.8)+
  guides(color = FALSE, fill = FALSE) +
  scale_fill_manual(values = c("grey30", "firebrick3", "gold", "forestgreen", "dodgerblue"))+
  transition_states(year)

plot_3


En este gráfico podemos observar, a nivel país, cómo ha ido evolucionando cada una de las naciones en términos de expectativa de vida. Tal y como mencionamos previamente ha habido una mejoría generalizada en este indicador aunque existen notables diferencias entre países y entre continentes. Destaca notablemente la fuerte caída en la esperanza de vida de algunos países en los años que sufrieron episodios bélicos o de conflicto como es el caso de Ruanda, Irak o Camboya.


Mapa evolutivo con el paquete {echarts4r}


Tal y como se expuso en un post anterior, podemos representar la evolución de la esperanza de vida, o de otra variable de interés, en un mapa con el paquete {echarts4r}. Un mapa de estas características nos permite visualizar la evolución de los países y detectar de forma instantánea aquellos países que no están incluidos en el dataframe del paquete {gapminder}.



datos_gapminder %>%
  group_by(year) %>%
  e_chart(Name, timeline = TRUE) %>%
  e_map(lifeExp) %>%
  e_visual_map(min= 20, max= 90) %>%
  e_title("Esperanza de vida por país y año", left = "center") 


Se podría realizar un gráfico 3D con una simple modificación del código previo.



datos_gapminder %>%
  group_by(year) %>%
  e_chart(Name, timeline = TRUE) %>%
  e_map_3d(lifeExp) %>%
  e_visual_map(min= 20, max= 90) %>%
  e_title("Esperanza de vida por país y año", left = "center")