/ BLOG, RECURSOS

ggplot2 + BBC = bbplot

ggplot2 es un paquete del lenguage R para la visualización de datos. El par de Gs en ggplot2 es de Grammar of Graphics o la Gramática de Gráficos - un lenguaje simple e intuitivo para construir gráficos.

Una gramática de gráficos es una herramienta que nos permite describir de manera concisa los componentes de un gráfico. Dicha gramática nos permite ir más allá de los gráficos con nombre (por ejemplo, el gráfico de dispersión) y obtener información sobre la estructura profunda que subyace en los gráficos estadísticos.
- Hadley Wickham, creador del tidyverse en R en su arículo A Layered Grammar of Graphics (2010).

¿Qué es bbplot?

A finales de enero del 2019, la BBC publicó el paquete bbplot y un libro de recetas para crear varios gráficos listos para publicación con ggplot2.

La meta es crear un proceso de creación de gráficos más reproducible y de paso ayudarle a principiantes de R a hacer gráficos.

bbplot es un paquete que transforma un gráfico creado con ggplot2 agregándole el estilo de la BBC.

ggplot2 + bbc_style = bbplot
Ejemplos de gráficos con el estilo de la BBC


bbplot es esencialmente dos funciones:

  • bbc_style(): añade atributos a tu gráfico de ggplot2.
    Lo único que necesitas hacer es agregar la línea + bbc_style() a tu gráfico de ggplot2 para transformarlo en algo que pareciera haber salido de un artículo de la BBC.
gráfico de ggplot2
gráfico de ggplot2 + bbc_style
La diferencia entre estos dos gráficos es + bbc_style()


  • finalise_plot(): agrega los ultimos detalles a tu gráfico y lo guarda como imagen .png. Esto esencialmente alínea a la izquierda el título y el subtítulo de tu gráfico además de agregar una nota al pie con la fuente de tus datos y hasta un logo si así lo deseas.

La meta de este artículo es ilustrar lo que puedes hacer con el paquete bbplot

Sin más preambulo veamos bbplot en acción. En tacosdedatos acabamos de agregar una magia antigüa para poder hacer nuestros artículos más interactivos 🔮👀 (se llama thebelab).
Si vas al inicio de esta página verás el botón ✨ activar código ✨. Al hacer clic transformarás ciertas celdas de código aquí debajo en celdas ejecutables. Estas celdas activadas son editables así que te invito a que cambies el código para personalizar los gráficos un poco como se te ocurra. Detrás de todo esto esta el poder de MyBinder un proyecto del mismo equipo que te trajo Project Jupyter del cual aprenderemos más adelante.

Primero necesitas cargar los paquetes necesarios

En el libro de recetas publicado en conjunto con bbplot la BBC sugiere utilizar el paquete pacman para cargar los paquetes necesarios a tu entorno. Esto es el equivalente de escribir library("dplyr"), library("tidyr"), library("gapminder"), etc. pero en un sólo comando.
NOTA: La primera línea del código instala pacman si no lo tienes.

if(!require(pacman))install.packages("pacman")

pacman::p_load('dplyr', 'tidyr', 'gapminder',
               'ggplot2',  'ggalt',
               'forcats', 'R.utils', 'png', 
               'grid', 'ggpubr', 'scales',
               'bbplot')

Mucho ojo, nosotros ya tenemos instalado el paquete bbplot. Si no lo haz instalado el código aquí arriba resultará en un error.
bbplot no está en CRAN, el sistema central de paquetes de R del que normalmente descargarías un paquete nuevo.
A bbplot lo instalas desde GitHub con devtools. Esto puede ser un poco confuso para los principiantes ya que en esencia son dos pasos (aunque con todos los que hablé en preparación para este artículo me lo contaron como si fuera algo simple y sencillo… 🙄).

Paso 1: instala devtools, el paquete que te ayuda a instalar paquetes de GitHub. Este si existe en CRAN así que solo necesitas ejecutar:

install.packages("devtools")

Paso 2: instala bbplot utilizando devtools:

devtools::install_github("bbc/bbplot")

Mucho ojo (parte 2), existe un sinfín de razones por las cuales esto no funcione en ciertos sistemas. Por ejemplo, el servidor conectado a esta página donde estás ejecutando código está basado en Linux (Ubuntu 16.04, creo) y por alguna razón no podíamos instalarlo con devtools. Lo que tuvimos que hacer es clonar el repositorio bbc/bbplot, instalarlo como source y luego borramos los archivos de donde estabamos trabajando ya que no los necesitamos más.

#clona el repositorio. ocupas tener git instalado.
git clone https://github.com/bbc/bbplot.git
# dile a R que instale el paquete
R --quiet -e "install.packages('bbplot', repos = NULL, type = 'source')"
# borra la carpeta de tu area de trabajo
## En sistemas Linux/MacOS
rm -rf bbplot #'rmdir /s /q bbplot' en Windows

Ya que tenemos todos los paquetes instalados y cargados en nuestro entorno podemos hacer nuestros gráficos. Utilizaremos los datos de Gapminder los cuales puedes instalar también de CRAN.
Gapminder “es una fundación sueca sin afiliaciones políticas, religiosas o económicas que busca luchar contra los conceptos erróneos y devastadores sobre el desarrollo global” a través de datos.
nota: todo esto asume que ya fuiste al inicio de la página a activar el código 👀 y ejecutaste la celda que carga los paquetes con pacman

# Datos de gapminder
# Primero escoge un pais del conjunto de datos
# nota: Los datos de gapminder se encuentran en ingles
pais = "Colombia"
datos_para_linea <- gapminder %>%
  filter(country == pais) 

# crea el gráfico
línea <- ggplot(datos_para_linea, aes(x = year, y = lifeExp)) + 
  geom_line(colour = "#1380A1", size = 1) + 
  geom_hline(yintercept = 0, size = 1, colour="#333333") + 
  labs(title="Pura Vida", 
         subtitle = paste("Esperanza de Vida en ", pais, " 1952-2007")) + 
  bbc_style()

# muestra el gráfico
línea

Pero vayamos paso a paso.
Paso 0: Cargas tus datos.

# Datos de gapminder
# Primero escoge un pais del conjunto de datos
# nota: Los datos de gapminder se encuentran en ingles
# Arabia Saudita sería 'Saudi Arabia', por ejemplo.
pais = "Colombia"
datos_para_linea <- gapminder %>%
  filter(country == pais)

head(datos_para_linea)

Paso 1: Crea un gráfico y asígnale lo que ggplot2 llama aesthethic mappings o mapeos estéticos (cuando mapeas o relacionas tus datos a una característica estética del gráfico).
Es decir: X es el año e Y es esperanza de vida.

# Ya tenemos cargados los datos
# crea el gráfico - paso 1
línea <- ggplot(datos_para_linea, aes(x = year, y = lifeExp))

# muestra el gráfico
línea

Paso 2: Agrégale una geometría. ¿Cómo vas a visualizar los valores mapeados?
En este caso con una línea:

# Ya tenemos cargados los datos
# crea el gráfico - paso 2
línea <- ggplot(datos_para_linea, aes(x = year, y = lifeExp)) + 
  geom_line(colour = "#1380A1", size = 1)

# muestra el gráfico
línea

Paso 3: Agregamos una línea horizontal geom_hline en el valor 0 de Y.
Este paso es opcional pero recomendado - Y representa Esperanza de Vida y estaría bueno que tu escala comience en 0.

# Ya tenemos cargados los datos
# crea el gráfico - paso 3
línea <- ggplot(datos_para_linea, aes(x = year, y = lifeExp)) + 
  geom_line(colour = "#1380A1", size = 1) + 
  geom_hline(yintercept = 0, size = 1, colour="#333333")

# muestra el gráfico
línea

Paso 4: Güau que rápido vas. En este paso le agregamos labels o etiquetas: Título y Subtítutlo.

# Ya tenemos cargados los datos
# crea el gráfico - paso 4
línea <- ggplot(datos_para_linea, aes(x = year, y = lifeExp)) + 
  geom_line(colour = "#1380A1", size = 1) + 
  geom_hline(yintercept = 0, size = 1, colour="#333333") + 
  labs(title="Pura Vida", 
       subtitle = "Esperanza de Vida en Colombia 1952-2007")

# muestra el gráfico
línea

Paso 5: Agrégale + bbc_style() y ¡ya quedó!

# Ya tenemos cargados los datos
# crea el gráfico - paso 5
línea <- ggplot(datos_para_linea, aes(x = year, y = lifeExp)) + 
  geom_line(colour = "#1380A1", size = 1) + 
  geom_hline(yintercept = 0, size = 1, colour="#333333") + 
  labs(title="Pura Vida", 
       subtitle = "Esperanza de Vida en Colombia 1952-2007") + 
  bbc_style()

# muestra el gráfico
línea

Como puedes ver, bbplot es un paquete útil y muy fácil de usar. Te sirve para ahorrar tiempo en modificar cada uno de los aspectos de tu gráfico al darte un conjunto de atributos predeterminados (el estilo de la BBC). La segunda función de bbplot sirve para guardar tus gráficos en formato .png:

# finalise_plot() para guardar tu gráfico
finalise_plot(plot_name = linea, # el nombre de tu gráfico en R
              source_name = 'Gapminder', # la fuente de tus datos
              save_filepath = "ejemplo_1.png", # el nombre con el cual guardarlo
              width_pixels = 500, # ancho
              height_pixels = 500, # alto
              logo_image_path = "logo.png") # tu logo, si quieres.
gráfico de bbplot con logo
Un gráfico finalizado con todo y el logo de tacosdedatos

Conclusión

Este es el primer artículo explorando paquetes/librerías para visualizar datos. Como otros productos de tacosdedatos, queremos mantenerlos cortos y directos al punto, mostrandote a través de ejemplos el “que” y el “como”. Creemos que aprendemos más y mejor explorando.

¿Qué te pareció el formato? ¿Te gustarían resúmenes más detallados o crees que así esta bien? Mandanos un tuit a @tacosdedatos o envianos un correo a ✉️ sugerencias@tacosdedatos.com. Y recuerda que puedes subscribirte a nuestro boletín al final de esta página. Cada semana (o dos) te enviamos enviamos nuestras publicaciones y las últimas noticias directamente a tu caja de entrada.

¡Hasta la próxima! Te dejamos aquí debajo otros ejemplos.


Más ejemplos

# Prepara los datos
dumbbell_datos <- gapminder %>%
  filter(year == 1967 | year == 2007) %>%
  select(country, year, lifeExp) %>%
  spread(year, lifeExp) %>%
  mutate(gap = `2007` - `1967`) %>%
  arrange(desc(gap)) %>%
  head(10)

# Hacemos el gráfico
ggplot(dumbbell_datos, aes(x = `1967`, xend = `2007`, y = reorder(country, gap), group = country)) + 
  geom_dumbbell(colour = "#dddddd",
                size = 3,
                colour_x = "#FAAB18",
                colour_xend = "#1380A1") +
  bbc_style() + 
  labs(title="Güau, vivimos más y más",
       subtitle="Cambios más grandes \nen esperanza de vida, 1967-2007")

A este par de ejemplos debajo puedes borrarles el # en la línea bbc_style() + para activar el estilo BBC.

# Prepara los datos
faceta <- gapminder %>%
  filter(continent != "Americas") %>%
  group_by(continent, year) %>%
  summarise(pop = sum(as.numeric(pop)))

# Haz el gráfico
grafico_faceteado <- ggplot() +
  geom_area(data = faceta, aes(x = year, y = pop, fill = continent)) +
  scale_fill_manual(values = c("#FAAB18", "#1380A1","#990000", "#588300")) + 
  facet_wrap( ~ continent, ncol = 5) + 
  scale_y_continuous(breaks = c(0, 2000000000, 4000000000),
                     labels = c(0, "2bn", "4bn")) +
  # Borra el signo de # al inicio de la siguiente línea para activar el bbc_style()
  #bbc_style() + 
  geom_hline(yintercept = 0, size = 1, colour = "#333333") +
  theme(legend.position = "none",
        axis.text.x = element_blank()) +
  labs(title = "El rápido crecimiento de Asia",
       subtitle = "Crecimiento de población \npor continente, 1952-2007")

grafico_faceteado
# Prepara los datos
faceta <- gapminder %>%
  filter(continent != "Americas") %>%
  group_by(continent, year) %>%
  summarise(pop = sum(as.numeric(pop)))

# Hagamos el gráfico
grafico_faceteado_free <- ggplot() +
  geom_area(data = faceta, aes(x = year, y = pop, fill = continent)) +
  facet_wrap(~ continent, scales = "free") + 
  # Borra el signo de # al inicio de la siguiente línea para activar el bbc_style()
  #bbc_style() + 
  scale_fill_manual(values = c("#FAAB18", "#1380A1","#990000", "#588300")) +
  geom_hline(yintercept = 0, size = 1, colour = "#333333") +
  theme(legend.position = "none",
        axis.text.x = element_blank(),
        axis.text.y = element_blank()) +
  labs(title = "Todo es relativo",
       subtitle = "Crecimiento relativo de población \npor continente,1952-2007")

grafico_faceteado_free


Este es un buen ejemplo de como solo añadir bbc_style() al final de cualquier gráfico de ggplot2 no siempre es la mejor opción. La BBC utiliza marcas en sus ejes X por defecto pero en este gráfico en particular toman mucho espacio. Así que primero activamos el estilo BBC y luego agregamos código que elimina las etiquetas en los ejes.

# Hagamos el gráfico
datos = gapminder %>%
	filter(year == 2007)
    
ggplot(datos, aes(gdpPercap, lifeExp, size = pop, colour = country)) +
  geom_point(alpha = 0.7, show.legend = FALSE) +
  scale_colour_manual(values = country_colors) +
  scale_size(range = c(2, 12)) +
  scale_x_log10() +
  facet_wrap(~continent) +
  bbc_style()
# Hagamos el gráfico
datos = gapminder %>%
	filter(year == 2007)
    
ggplot(datos, aes(gdpPercap, lifeExp, size = pop, colour = country)) +
  geom_point(alpha = 0.7, show.legend = FALSE) +
  scale_colour_manual(values = country_colors) +
  scale_size(range = c(2, 12)) +
  scale_x_log10() +
  facet_wrap(~continent) +
  bbc_style() + 
  theme(legend.position = "none", 
        axis.text.x = element_blank(),
        # bbc_style agrega etiquetas en el eje X asi tenemos que agregar esto
        axis.ticks.x = element_blank(), 
        axis.ticks.y = element_blank(),
        axis.text.y = element_blank()) 

bonus

Mira este super gif creado con ggplot2 + bbplot + gganimate 😱

ggplot2 + bbplot + gganimate = güau
ggplot2 + bbplot + gganimate = güau


Este es el código para hacerlo en Rstudio:

# Carga todos tus paquetes
library(ggplot2)
library(bbplot)
library(gganimate)
library(gapminder)

# Creas el gráfico
animeishon <- ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, colour = country)) +
    geom_point(alpha = 0.7, show.legend = FALSE) +
    scale_colour_manual(values = country_colors) +
    scale_size(range = c(2, 12)) +
    scale_x_log10() +
    facet_wrap(~continent) + 
	  bbc_style() + 
    theme(legend.position = "none",
          axis.text.x = element_blank(),
          axis.ticks.x = element_blank(),
          axis.ticks.y = element_blank(),
          axis.text.y = element_blank(),
          plot.subtitle = element_text(size=12, face="italic",)) +
    # Estos son los atributos especificos de gganimate
    labs(title = 'Año: {frame_time}', subtitle = 'x: PIB per capita \ny: Esperanza de vida') +
    transition_time(year) +
    ease_aes('linear')

animate(animeishon, nframes = 100, end_pause = 10)

Puedes copiar y pegar todo esto en Rstudio sin necesidad de instalar nada en MyBinder.org haciendo clic aquí badge

sergio

Sergio Sánchez Zavala

Soy investigador asociado de política pública basado en San Francisco, California. Diseñador de visualizaciones de datos.

Lee Más