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:
- Utilizamos el conjunto de datos
iris
conggplot(iris)
- En el eje de las \(x\) tenemos
sepal_length
y en el eje de las \(y\) tenemossepal_width
- 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.