library(learnr)
library(ggplot2)
knitr::opts_chunk$set(echo = FALSE, comment = "")

# Datos de temperatura, cortesía de https://www.kaggle.com/sudalairajkumar/daily-temperature-of-major-cities
temps <- dataviz::temps
temps_beirut <- temps[temps$city == "Beirut",]

Introducción

Aquí practicaremos un concepto central de ggplot, la asignación (mapping en inglés) de atributos estéticos a los valores que toma una variable. Dicho de otra forma, como mostrar de modo perceptible a la vista la diferencia entre valores: con distintos colores, distintos tamaños, distintas posiciones en un gráfico, etc.

Usaremos el paquete de R ggplot2, que incluye funciones para realizar una gran variedad de visualizaciones.

# cargar la librería que vamos a usar
library(ggplot2)

El data set con el que practicaremos contiene la temperatura promedio para cada día del 2019 en la ciudad de Beirut, Líbano:

temps_beirut

Uso básico de ggplot

Si le pasamos un dataframe a ggplot(), sin agregar nada más, obtenemos un gráfico vacío:

ggplot(temps_beirut)

¡Vendría a ser una especie de lienzo en blanco!

Esto es porque necesitamos definir al menos una geometría (el recurso visual con el que vamos a mostrar la información, como líneas, puntos, barras, etc.) y al menos una asignación estética (especificar cuales variables queremos mostrar, y que atributo estético va a representar sus valores, como el color, el tamaño, la transparencia, etc.).

ggplot() implementa un marco teórico para la creación de visualizaciones, "la gramática de los gráficos". Ésta permite expresar en forma concisa los componentes de un gráfico:

knitr::include_graphics("https://bitsandbricks.github.io/img/ggplot_resumen.png")

diagrama de David Keyes

¿Cómo funciona ésto en la práctica? El caso de uso más simple de ggplot consiste en:

A intentarlo. Asignemos la columna day_of_year a la posición en el eje de las $x$, la columna temperature a las $y$, y usemos geom_line() para mostrar los datos.

ggplot(temps_beirut, aes(x = ___, y = ___)) +
  ___()
ggplot(temps_beirut, aes(x = day_of_year, y = temperature)) +
  geom____()
ggplot(temps_beirut, aes(x = day_of_year, y = temperature)) +
  geom_line()

Ahora otra vez, pero usando geom_point() en vez de geom_line().

ggplot(temps_beirut, aes(x = day_of_year, y = temperature)) +
  ___()
ggplot(temps_beirut, aes(x = day_of_year, y = temperature)) +
  geom_point()

Y ahora intercambiemos las columnas que antes asignamos a las $x$ y a las $y$:

ggplot(temps_beirut, aes(x = ___, y = ___)) +
  geom_point()
ggplot(temps_beirut, aes(x = temperature, y = day_of_year)) +
  geom_point()

Otras geoms más complejas

Pueden elegir entre una variada colección de geoms para hacer toda clase de gráficos. Por ejemplo, geom_boxplot() crea boxplots (o "diagramas de caja"). Al hacer boxplots es común mostrar un gráfico separado para cada categoría presente en la data a mostrar, usando para eso el eje de las $x$ o de las $y$. ¡Hagamos eso mismo! Pongamos month en el eje $x$ (como variable categórica), temperature en el eje de las $y$, y a dibujar cajas con geom_boxplot().

ggplot(temps_beirut, aes(x = ___, y = ___)) +
  ___()
ggplot(temps_beirut, aes(x = month, y = temperature)) +
  ___()
ggplot(temps_beirut, aes(x = month, y = temperature)) +
  geom_boxplot()
ggplot(___) +
  ___()
ggplot(temps_beirut, aes(x = ___, y = ___)) +
  geom_boxplot()
ggplot(temps_beirut, aes(x = temperature, y = month)) +
  geom_boxplot()

Más adelante vamos a regresar a los boxplots, explicando cómo se interpretan.

Agregando color

Ahora pasamos a trabajar con el dataset temps, que es similar a temps_beirut pero contiene registros para tres ubicaciones adicionales:

temps

Hagamos un gráfico de líneas mostrando temperature para cada day_of_year, usando el atributo estético color para diferencias las líneas según la ciudad que representan.

ggplot(temps, aes(x = ___, y = ___, color = ___)) +
  ___()
ggplot(temps, aes(x = day_of_year, y = temperature, color = ___)) +
  geom_line()
ggplot(temps, aes(x = day_of_year, y = temperature, color = city)) +
  geom_line()

Vamos de nuevo, esta vez usando city como variable en el eje $y$, y temperature a representar con color. Este gráfico queda mejor usandogeom_point().

ggplot(___) +
  ___()
ggplot(temps, aes(x = ___, y = ___, color = ___)) +
  geom_point()
ggplot(temps, aes(x = day_of_year, y = city, color = temperature)) +
  geom_point()

(Tip: Probar con geom_point(size = 5) para mostrar puntos más grandes.)

Usando el atributo estético fill

Algunas geoms permiten usar el atributo estético fill, que es similar color pero se aplica como relleno, "pintando" por dentro áreas como las barras de un gráfico o las regiones en un mapa (color, en cambio, se usa para líneas y puntos). Por ejemplo, podemos usar el atributo estético fill con geom_boxplot() para pintar el interior de cada caja. Vamos a probarlo. Generemos un gráfico de month en las $x$, temperature en las $y$, y coloreemos el interior de cada caja según su ciudad.

ggplot(temps, ___) +
  ___()
ggplot(temps, aes(x = month, y = ___, fill = ___)) +
  geom_boxplot()
ggplot(temps, aes(x = month, y = temperature, fill = city)) +
  geom_boxplot()

¿Podemos pintar las líneas de las cajas según el mes, y pintar el interior según la ubicación? Veamos.

ggplot(temps, ___) +
  geom_boxplot()
ggplot(temps, aes(x = month, y = ___, fill = ___)) +
  geom_boxplot()
ggplot(temps, aes(x = month, y = temperature, color = month, fill = city)) +
  geom_boxplot()

El gráfico que obtuvimos funciona como recordatorio de que en muchas ocasiones la cantidad de recursos visuales volcados resulta inversamente proporcional a su legibilidad. En general, simple es bueno... pero también conviene saber que podemos combinar varias estéticas dentro de aes() cuando resulte necesario.

Atributos estéticos fijos

Muchos de los atributos estéticos -como color, fill, y también size que cambia el tamaño de puntos y grosor de líneas- pueden ser usados como parámetros fijos para una geom; es decir, que no cambien de acuerdo a los valores de una variable, sino que son iguales para todos las figuras graficadas. Esto se logra definiendo un valor específico, y fuera del llamado a aes(). Por ejemplo, color = "blue" en lugar de la asignación de una variable, como aes(color = city). Nótese la diferencia: dentro de la función aes(), no definimos colores específicos, ggplot se encarga de eso. Sólo decimos que los valores encontrados en la columna city deben corresponder a diferentes colores. (Más adelante vamos a aprender como indicarle a ggplot que use escalas de colores específicas cuando asigna colores por variable).

Intentémoslo con el ejemplo del boxplot en la sección anterior. Asignemos el color como atributo dependiente de la ciudad, pero dejemos el color de las líneas fijo en color azul marino ("navy blue") de acuerdo a los nombres de colores que R sabe interpretar

ggplot(temps, ___) +
  ___(___)
ggplot(temps, aes(x = month, y = temperature, fill = ___)) +
  geom_boxplot(color = ___)
ggplot(temps, aes(x = month, y = temperature, fill = city)) +
  geom_boxplot(color = "navyblue")

Ahora al revés. Asignemos la variable city al color de las líneas, pero dejemos el relleno de las cajas fijo en color "navyblue".

ggplot(temps, ___) +
  ___(___)
ggplot(temps, aes(x = month, y = temperature, color = ___)) +
  geom_boxplot(fill = ___)
ggplot(temps, aes(x = month, y = temperature, color = city)) +
  geom_boxplot(fill = "navyblue")

¡Y con eso terminamos!

Para seguir practicando, pueden obtener así los datos que hemos usado para los ejemplos:

temps <- dataviz::temps
temps_beirut <- temps[temps$city == "Beirut",]

Y como bibliografía, un excelente recurso es libro Data Visualization - A practical introduction por Kieran Healy. Se puede consultar en línea, y tenemos el capítulo dedicado a los fundamentos de ggplot aquí: "Make a plot":

knitr::include_graphics("https://socviz.co/assets/dv-cover-pupress.jpg")


bitsandbricks/dataviz documentation built on May 3, 2022, 5:28 p.m.