Data-vis

Introducción a ggplot

Paquete ggplot2

¿Qué es?

Basado en el trabajo de doctorado de Hadley Wickham, ggplot2 es un paquete poderoso y ampliamente utilizado en R para la creación de visualizaciones de datos. Fue creado por Hadley Wickham y se basa en el concepto de “Gramática de Gráficos”. Aquí tienes una explicación completa del paquete ggplot2:

  1. Gramática de Gráficos: ggplot2 se basa en la Gramática de Gráficos, un marco abstracto para describir y construir visualizaciones de datos. Este concepto descompone el proceso de creación de gráficos en componentes distintos, lo que lo hace altamente flexible y personalizable.

  2. Creación de Gráficos de Alto Nivel: ggplot2 es conocido por su enfoque de alto nivel para la creación de gráficos. En lugar de especificar cada detalle de un gráfico individualmente, describes el gráfico en términos de datos y mapeos, y ggplot2 maneja automáticamente los detalles.

  3. Enfoque en Capas: En ggplot2, construyes gráficos añadiendo capas, comenzando con una fuente de datos y agregando progresivamente componentes como geoms (objetos geométricos que representan puntos de datos), mapeos estéticos y transformaciones estadísticas. Este enfoque de capas permite visualizaciones complejas e informativas.

  4. Estética Guiada por los Datos: ggplot2 te permite mapear variables de datos a estéticas como color, tamaño, forma y posición. Este enfoque guiado por los datos te permite crear visualizaciones que revelan patrones y relaciones en tus datos.

  5. Objetos Geométricos Extensivos: El paquete proporciona una amplia gama de objetos geométricos (geoms) que te permiten representar tus datos de diversas formas. Los geoms comunes incluyen puntos, líneas, barras y etiquetas de texto, pero hay muchos más para elegir.

  6. Facetado: ggplot2 admite el facetado, que es el proceso de crear múltiples gráficos basados en una variable categórica en tus datos. Esto te permite explorar cómo diferentes categorías afectan tus visualizaciones.

  7. Temas y Personalización: ggplot2 proporciona temas que te permiten personalizar la apariencia de tus gráficos. Puedes cambiar fuentes, colores, líneas de cuadrícula y más para que coincidan con tu estilo preferido o para cumplir con requisitos específicos de marca.

  8. Transformaciones Estadísticas: El paquete ofrece una variedad de transformaciones estadísticas que se pueden aplicar a tus datos antes de trazarlos. Por ejemplo, puedes calcular estadísticas resumidas como medias, medianas o cuantiles dentro de tu gráfico.

  9. Código Elegante: ggplot2 fomenta un código limpio y elegante a través de su estructura de capas y el uso del operador pipe (%>%), lo que facilita la lectura y comprensión de visualizaciones complejas.

  10. Exploración y Comunicación de Datos: ggplot2 es una herramienta valiosa tanto para la exploración como para la comunicación de datos. Te permite generar rápidamente visualizaciones significativas para el análisis de datos, así como crear gráficos listos para publicar en informes y presentaciones.

Cómo funciona

El sistema de capas puede ser confuso al principio, lo que ha llevado a explicaciones que no son del todo precisas. En este sentido, es importante asegurarse de comprender completamente el sistema de capas de ggplot2 antes de intentar explicarlo a otros.

Sistema incorrecto de capas de ggplot2

La estructura del código de ggplot2:

Create a plot with:
  One layer that includes:
    Data
    Statistics
    Aesthetic components
    Geometry
  Another layer that includes:
    Data
    Statistics
    Aesthetic components
    Geometry
  Refinements to the plot
  Styling

Structure of a plot
ggplot(...) +
  layer(...) +
  layer(...) +
  helper(...) +
  helper(...) +
  theme(...)

Como un pastel.

Representación correcta del sistema de capas de ggplot 2.

Lecturas Adicionales

Lee la documentación del paquete

Visita The R Graph Gallery para ver una colección de figuras elaboradas con el paquete ggplot2.

Lee los apuntes de ggplot2:

apuntes de ggplot2

Para inspiración visita Top 50 ggplot2 Visualizations - The Master List (Con el código en R completo.)

Buscando expandir los horizontes, visita la página de extensiones de ggplot2.

Conceptos Básicos

library("ggplot2")
library("magrittr")
library("dplyr")

diamonds %<>%
  sample_n(5000) # obtener una muestra de los datos


# diamonds %>% 
#   glimpse

Capas

ggplot() +
  layer(
    data = diamonds, 
    mapping = aes(x = carat, y = price),
    geom = "point", 
    stat = "identity", 
    position = "identity"
    ) +
  scale_y_continuous() +
  scale_x_continuous() +
  coord_cartesian() +
  theme_minimal()

ggplot() +
  layer(
    data = mtcars, 
    mapping = aes(x = mpg, y = cyl),
    geom = "point", 
    stat = "identity", 
    position = "identity"
    ) +
  scale_y_continuous() +
  scale_x_continuous() +
  coord_cartesian() +
  theme_minimal()

Capas Superpuestas

ggplot() +
  layer(
    data = diamonds, 
    mapping = aes(x = carat, y = price),
    geom = "point", 
    stat = "identity", 
    position = "identity"
    ) +
  layer(
    data = mtcars, 
    mapping = aes(x = mpg, y = cyl),
    geom = "point", 
    stat = "identity", 
    position = "identity"
    ) +
  scale_y_continuous(name = "Y axis") +
  scale_x_continuous(name = " X axis") +
  coord_cartesian() +
  theme_minimal()

Factorización y mapeo

ggplot(
  data = diamonds, 
  mapping = aes(x = carat, y = price),
) +
  layer(
    geom = "point", 
    stat = "identity", 
    position = "identity"
  ) +
  scale_y_continuous() +
  scale_x_continuous() +
  coord_cartesian() +
  theme_minimal()

ggplot(
  data = diamonds, 
  mapping = aes(x = carat, y = price),
) +
  layer(
    geom = "smooth", 
    stat = "smooth", 
    position = "identity",
    params = list(se = TRUE, colour = "#ac4875")
  ) +
  scale_y_continuous() +
  scale_x_continuous() +
  coord_cartesian() +
  theme_minimal()

ggplot(
  data = diamonds, 
  mapping = aes(x = carat, y = price),
) +
  layer(
    geom = "point", 
    stat = "identity", 
    position = "identity"
  ) +
  layer(
    geom = "smooth", 
    stat = "smooth", 
    position = "identity",
    params = list(se = TRUE, colour = "#ac4875")
  ) +
  scale_y_continuous() +
  scale_x_continuous() +
  coord_cartesian() +
  theme_minimal()

geoms

ggplot(
  data = diamonds, 
  mapping = aes(x = carat, y = price),
) +
  # layer(
  #   geom = "point", 
  #   stat = "identity", 
  #   position = "identity"
  # ) + 
  geom_point() + # This line resumes the four ones below
  layer(
    geom = "smooth", 
    stat = "smooth", 
    position = "identity",
    params = list(se = TRUE, colour = "#ac4875", method = "gam")
  ) +
  scale_y_continuous() +
  scale_x_continuous() +
  coord_cartesian() +
  theme_minimal()

ggplot(
  data = diamonds, 
  mapping = aes(x = carat, y = price),
) +
  geom_point() +
  # layer(
  #   geom = "smooth", 
  #   stat = "smooth", 
  #   position = "identity",
  #   params = list(se = TRUE, colour = "#ac4875", method = "gam")
  # ) +
  geom_smooth(colour = "#ac4875") +  # This line resumes the four ones below
  scale_y_continuous(name = "Precio") +
  scale_x_continuous(name = "Quilates") +
  theme_minimal()

Uso más extendido

ggplot(diamonds) +
  aes(x = carat, y = price) + 
  geom_point() +
  stat_smooth(colour = "#ac4875") +
  theme_minimal()

Facets

ggplot(diamonds) +
  aes(x = carat, y = price) + 
  geom_point() +
  stat_smooth(colour = "#ac4875") +
  facet_wrap(~ color) +
  theme_minimal()

library("esquisse")
# esquisser(data = diamonds)
ggplot(diamonds) +
  aes(x = carat, y = price) +
  geom_point(shape = "circle", size = 1.5, colour = "#112446") +
  theme_minimal() +
  facet_wrap(vars(color))

Ejemplos

ggplot(diamonds) + 
  aes(x = carat, y = price, colour = color) + 
  geom_point() 

ggplot(diamonds) + 
  aes(x = cut, y = price, fill = color) + 
  geom_boxplot()

diamonds %>% 
  group_by(color) %>% 
  summarise(carat_avg = mean(carat, na.rm = TRUE)) %>% 
  ggplot() + 
  aes(x = color, y = carat_avg) + 
  geom_bar(stat = "identity") 

Ejercicio

Genera las siguientes gráficas.