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 deltidyverse
enR
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.
bbplot
es esencialmente dos funciones:
bbc_style()
: añade atributos a tu gráfico deggplot2
.
Lo único que necesitas hacer es agregar la línea+ bbc_style()
a tu gráfico deggplot2
para transformarlo en algo que pareciera haber salido de un artículo de la BBC.
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.
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
😱
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í
Subscríbete a 🌮 tacos de datos | Aprende visualización de datos en español.
Recibe las mejores publicaciones directamente a tu caja de entrada