tacosdedatos

Cover image for ggplot2 + bbc = bbplot
Sergio Sánchez
Sergio Sánchez

Posted on • Updated on • Originally published at old.tacosdedatos.com

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.

Ejemplos de gráficos con el estilo de la BBC

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

rá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.

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')
Enter fullscreen mode Exit fullscreen mode

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 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, intentamos ejecutar este código en una máquina 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

bbplot final


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)
Enter fullscreen mode Exit fullscreen mode

Los datos de colombia

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
Enter fullscreen mode Exit fullscreen mode

Paso 1

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
Enter fullscreen mode Exit fullscreen mode

paso 2

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
Enter fullscreen mode Exit fullscreen mode

paso 3

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

# 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
Enter fullscreen mode Exit fullscreen mode

paso 4

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
Enter fullscreen mode Exit fullscreen mode

paso 5

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.
Enter fullscreen mode Exit fullscreen mode

Un gráfico finalizado con todo y el logo de tacosdedatos

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 "qué" y el "cómo". 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 en boletin.tacosdedatos.com

¡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")
Enter fullscreen mode Exit fullscreen mode

ejemplos

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
Enter fullscreen mode Exit fullscreen mode

ejemplos 2

# 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
Enter fullscreen mode Exit fullscreen mode

ejemplos 3

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()
Enter fullscreen mode Exit fullscreen mode

ejemplso 4

# 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()) 
Enter fullscreen mode Exit fullscreen mode

ejemplso 5

bonus

Mira este super gif creado con ggplot2 + bbplot + gganimate 😱 en el antigüo tacosdedatos

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)
Enter fullscreen mode Exit fullscreen mode

Discussion (0)