Introducción a ggplot2

Este post contiene links a programas de referidos ¡Gracias por apoyarnos haciendo click!

En este tutorial te enseño cómo funciona el paquete ggplot2 y por qué considero que es la mejor librería de gráficos 2D.

Instalar ggplot2

Para instalar ggplot2 lo único que necesitas es correr el siguiente código en la consola. Recuerda que instalar un paquete es algo que haces sólo una vez, así que no necesitas agregar esto a tu script o archivo .R.

install.packages('ggplot2')

Gramática de gráficos

La gg en ggplot2 viene de Grammar of graphics o Gramática de gráficos. Es una filosofía para construir gráficos consistentemente, utilizada no sólo por ggplot2, sino por software de visualización de datos como Tableau o Power BI. Puedes leer más al respecto en este paper de Hadley Wickham. Para más profundidad acerca de este paquete, puedes revisar el libro R Graphics Cookbook.

Usar ggplot2

Como siempre, vamos a limpiar los nombres de iris y vamos a convertirlo en un tibble.

library(dplyr)
library(janitor)
library(ggplot2)

iris <- as_tibble(iris) %>% clean_names()

Directo a un ejemplo

ggplot(iris) + geom_point(aes(x = sepal_length, y = sepal_width))

Te presento un diagrama de dispersión. Para cada par de valores \((x, y)\), grafica un punto en un plano cartesiano con esas coordenadas.

Si lees el código y ves el gráfico, tu cerebro encontrará patrones y verás que hay cosas que tienen sentido intuitivamente:

  1. Utilizamos el conjunto de datos iris con ggplot(iris)
  2. En el eje de las \(x\) tenemos sepal_length y en el eje de las \(y\) tenemos sepal_width
  3. Utilizamos la función geom_point y en el gráfico vemos puntos

Aunque el paquete se llame ggplot2, la función para crear los gráficos es ggplot. Estå atento con eso, que a veces causa confusión al principio.

Sin embargo, hay otras cosas que no quedan tan claras, como qué significa la función aes y cómo es que estamos sumando el resultado de ggplot con el resultado de geom_point. Vamos punto por punto.

¿Para qué sirve la función aes?

Probablemente la parte más rara de ggplot2 es la función aes, pero no te asustes, es sencillo.

¿Por qué no así?

Probablemente estés pensando que una versión más intuitiva del código para crear este gráfico sería esta:

ggplot(iris) + geom_point(x = sepal_length, y = sepal_width)

En ggplot podrías hacer algo como eso, pero los valores de x y y tendrían que ser constantes en el sentido de que tengan el mismo valor para todos los puntos. No sólo sirve con x y y, sino también con otras características como colour, fill, size, etc. Por ejemplo, si queremos que todos los puntos sean rojos:

ggplot(iris) + geom_point(aes(x = sepal_length, y = sepal_width), colour = "red")

Ajá, pero ¿qué hace aes?

El nombre de la función aes viene de aesthetics, que en este contexto quiere decir características visuales. Con la función aes asignamos variables del cunjunto de datos a características visuales del gráfico. Así podemos separar lo que es constante (igual para todos los puntos) de lo que es variable (para cada punto del conjunto de datos), como en el ejemplo anterior en el que x y y son variables pero el colour es constante.

Mira la sutil diferencia con este ejemplo en el que usamos species para el colour. El argumento colour ahora está dentro de aes.

ggplot(iris) + geom_point(aes(x = sepal_length, y = sepal_width, colour = species))

¿Por qué sumamos?

Aunque no vamos a profundizar mucho en esto, la razón de sumar los resultados es prácticamente la misma del operador %>%. La idea es poder modificar el gráfico por capas sin necesidad de anidar funciones. Este tema de las capas merece por sí solo otro post, así que por ahora te toca confiar en la magia de ggplot2.

Una notación más tidyverse

En ocasiones, necesitamos transformar el conjunto de datos, ya sea filtrando, calculando una nueva columna, agrupando o haciendo cálculos de agregación.

Por ejemplo, vamos a graficar el promedio de sepal_length por species en un gráficos de barras. Es decir, en el eje de las \(x\) queremos la species y en el eje de las \(y\) el promedio de sepal_length.

Podemos entonces utilizar la notación del tidyverse para encadenar operaciones y mantener nuestro código legible:

iris %>% 
  group_by(species) %>% 
  summarise(sepal_length_mean = mean(sepal_length)) %>% 
  ggplot() + 
  geom_bar(aes(x = species, y = sepal_length_mean), stat = 'identity') +
  ggtitle('Sepal length average by Species')

Casi siempre que uses geom_bar debes utilizar stat = 'identity'. Significa que la función no debe hacer ningún cálculo como sumar o contar para determinar la altura de la barra, sino simplemente utilizar el valor de la variable asignada a la y.

Fíjate que después de usar ggplot cambiamos de %>% a +. Es un error tan frecuente que si te equivocas en esto, los programadores de ggplot2 han sido tan amables que el mensaje de error dirá:

Error: `mapping` must be created by `aes()`
Did you use %>% instead of +?

Conclusión

El uso de la gramática de gráficos en ggplot2 nos permite rápidamente traducir al código la idea de gráfico que tenemos. Basta con preguntarnos al menos qué variable qiero en las \(x\) y qué variable qiero en las \(y\). Luego podemos ir asignando otras variables a otras características visuales. Además, ggplot2 se integra muy bien a la notación del tidyverse.

Finalmente, si quieres tener una referencia en la que puedas buscar rápidamente cómo hacer alguna cosa en ggplot2, obtén el R Graphics Cookbook. En serio, si estás pensando en usar R como tu herramienta principal para la estadística o la ciencia de datos, este libro es un recurso muy valioso.

Cada tipo de gráfico merece su propio post, así que a medida que agreguemos contenido, iremos explicando cuándo utilizar cada tipo de gráfico, cómo hacerlo con ggplot2 y cuáles son las configuraciones más comunes.