El paquete ggplot2 no proporciona una funcionalidad integrada para combinar gráficos en una única figura, pero existen otras librerías que permiten unir gráficos de ggplot2 en layouts personalizados. La más popular y fácil de usar sin lugar a dudas es patchwork, pero existen otras alternativas, como cowplot o gridExtra que también revisaremos en este tutorial.

Gráficos de muestra

Para hacer todos los ejemplos de este tutorial reproducibles vamos a crear cuatro gráficos y asignarlos a objetos llamados p1, p2, p3 y p4. Puedes usar otros nombres, pero nosotros usaremos estos por convención.

# install.packages("ggplot2")
library(ggplot2)

# Simulación de datos
set.seed(5)
x <- runif(100)
df <- data.frame(x = seq_along(x), var = x)

# Gráfico de cajas
p1 <- ggplot(df, aes(x = "", y = var)) +
  geom_boxplot()

# Gráfico de densidad
p2 <- ggplot() +
  stat_function(fun = dnorm, geom = "density",
                xlim = c(-3, 3), fill = "white") 

# Gráfico de líneas
p3 <- ggplot(df, aes(x = x, y = var)) +
  geom_line(color = "gray20")

# Gráfico de dispersión
p4 <- ggplot(df, aes(x = x, y = var)) +
  geom_point(color = "gray20")

# Vemos los gráficos
p1
p2
p3
p4

Grid de ggplots

patchwork

Combinar gráficos de ggplot2

patchwork está diseñado para combinar gráficos de ggplot2 en una única figura de manera fácil. El uso básico consiste en guardar los gráficos en objetos, cargar la librería y luego utilizar el operador + para combinar los gráficos, como si estuviésemos agregando una nueva capa.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Combinamos los gráficos
p1 + p2

Combinar dos gráficos en ggplot2

patchwork alineará perfectamente los gráficos de ggplot2.

Controlar el layout

Al unir gráficos con +, patchwork intentará que el layout sea lo más cuadrado posible, pero si quieres personalizar el número de filas y columnas de la figura puedes usar la función plot_layout. Ten en cuenta que también puedes especificar las anchuras y las alturas relativas de los gráficos con los argumentos widths y heights, respectivamente.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Combinamos los gráficos
p1 + p2 + p3 + p4 +
  plot_layout(ncol = 3)

Unir varios gráficos con plot_layout

Probablemente la funcionalidad más interesante de la función plot_layout es que permite crear un diseño del layout personalizado tal y como se muestra en el ejemplo siguiente, donde 1, 2, 3 y 4 representa las localizaciones para p1,p2, p3 y p4, respectivamente, y # representa un espacio vacío. Recuerda que puedes usar números pero también letras para representar las localizaciones de los gráficos.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Diseño personalizado (# es un área vacía)
design <- "
  111
  2#3
  443
"

# Combinamos los gráficos con un layout personalizado
p1 + p2 + p3 + p4 +
  plot_layout(design = design)

Layout personalizado de gráficos de ggplot2 con patchwork

La función wrap_plots

En ocasiones no es posible utilizar el operador + de manera programática, por lo que si no conoces el número de gráficos que vas a crear de antemano puedes utilizar la función wrap_plots y pasarle una lista de gráficos. Esta función también permite especificar el número de filas y columnas, los tamaños y layouts personalizadas.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Combinamos los gráficos
wrap_plots(p1, p2, p3, p4, 
           ncol = 2, nrow = 2,
           widths = c(1, 0.5), heights = c(0.5, 1))

La función wrap_plots de patchwork

Agregar espaciadores

Cuando se crea un layout personalizado se puede utilizar # para agregar espacios, tal y como se mostró en uno de los ejemplos anteriores, pero si estás utilizando + existe una función llamada plot_spacer que agrega espacios o huecos entre los gráficos.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Gráficos con espacios
p1 + plot_spacer() + plot_spacer() + p3

Agregar un espacio entre los gráficos de ggplot2

Operadores

El paquete patchwork también proporciona dos operadores prácticos para unir gráficos de ggplot2 uno al lado del otro o para apilarlos.

Gráficos de ggplot2 uno al lado del otro

El operador | posiciona los gráficos en fila. Este operador es parecido a + cuando tienes dos gráficos pero | pondrá los gráficos en una misma fila mientras que + intentará crear un layout lo más cuadrado posible.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Combinamos los gráficos en filas
p1 | p2

# Equivalente a:
# p1 + p2 + plot_layout(nrow = 1)

Unir varios gráficos de ggplot2 uno al lado del otro

ggplots apilados

El operador / apila los gráficos de ggplot2 en columnas sin necesidad de utilizar la función plot_layout y especificar ncol = 1.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Apilamos los gráficos
p1 / p2

# Equivalente a:
# p1 + p2 + plot_layout(ncol = 1)

Apilar gráficos de ggplot con los operadores de patchwork

Anidar operadores

Los operadores anteriores se pueden anidar para crear layouts complejos combinando unos pocos operadores. En el siguiente ejemplo creamos un layout con dos gráficos encima y uno ancho debajo.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Dos gráficos encima y uno debajo
(p1 | p2) / p3

Anida operadores para crear layouts complejos de gráficos de ggplot2 utilizando patchwork

El ejemplo siguiente es parecido al anterior, pero con un gráfico a la izquierda y dos a la derecha.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Un gráfico a la izquierda y dos a la derecha
p1 | (p2 / p3)

El paquete patchwork de R

Títulos y etiquetas

Título para todos los gráficos

Puedes agregar un título a todos los gráficos con la función plot_annotation y el argumento title. Ten en cuenta que también puedes agregar un título, un subtítulo y un pie de imagen con los argumentos correspondientes.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Título para la combinación de gráficos
p1 + ((p2 | p3) / p4) + 
plot_annotation(title = 'Título para todos los gráficos',
                subtitle = "Subtítulo",
                caption = "Pie del gráfico")

Título para varios gráficos de ggplot2

La función plot_annotation también se puede utilizar para etiquetar cada gráfico de manera individual con el argumento tags_level. Las posibles opciones son "1" para números, "a" para letras minúsculas, "A" para letras mayúsculas, "i" para numeración romana, "I" para numeración romana en mayúsculas o un vector con tus propias etiquetas.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Etiquetas para cada gráfico
p1 + p2 + plot_annotation(tag_levels = "A")

La función plot_annotation de patchwork

Las etiquetas se pueden personalizar con los argumentos tag_prefix, tag_suffix y tag_sep. En el ejemplo siguiente agregamos "Gráfico " como prefijo de las etiquetas.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Etiquetas para cada gráfico
p1 + p2 + plot_annotation(tag_levels = "A", tag_prefix = "Gráfico ")

Unir ggplots en una única figura y agregar etiquetas a cada uno de ellos

Agregar más capas

Las figuras creadas con patchwork se comportan de la misma manera que un objeto de ggplot2, de forma que puedes agregar nuevas capas como en cualquier otro gráfico, pero la capa se aplicará al último gráfico.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Añadimos una nueva capa
p2 + p1 +
  geom_jitter(color = "dodgerblue1")

# Equivalente a:
patch <- p2 + p1
patch + geom_jitter(color = "dodgerblue1")

Añadir una nueva capa de ggplot a un objeto de patchwork

Si quieres personalizar otro gráfico que no sea el último que agregaste puedes agregar una nueva capa tras él o guardar el patchwork, acceder al elemento que quieras y personalizarlo, tal y como se muestra abajo.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Añadimos una nueva capa al primer gráfico
p2 + theme_bw() + p1

# Equivalente a:
patch <- p2 + p1
patch[[1]] <- patch[[1]] + theme_bw()
patch

Agregar nuevas capas a una composición hecha con patchwork

Modificar todos los gráficos a la vez

patchwork también proporciona el operador & para modificar todos los gráficos al mismo tiempo. Esto es muy útil, por ejemplo, para establecer el mismo tema para todos los gráficos a la vez, tal y como se muestra a continuación.

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# Cambiar el tema para todos los gráficos
p1 + p2 + p3 + p4 & theme_classic()

Aplicar una nueva capa a los gráficos de ggplot2 plots de un layout a la vez

Agregar gráficos de R base, tablas y textos

En los ejemplos anteriores hemos visto las posibilidades que patchwork ofrece para combinar gráficos de ggplot2, pero también puedes unir gráficos de ggplot2 con gráficos de R base, tablas y textos. Si quieres combinar un gráfico de ggplot2 con un gráfico de R base puedes utilizar la función wrap_elements y agregar el gráfico de R base con un ~ como prefijo, e.g. ~plot(x, y).

# install.packages("ggplot2")
# install.packages("patchwork")
library(ggplot2)
library(patchwork)

# ggplot2 y R base
old_par <- par()
par(mar = c(0, 2, 0, 0), bg = NA)
p1 + wrap_elements(panel = ~plot(1:10))
par(old_par)

Combinar un ggplot con la función plot en R

Al combinar gráficos de R base con los de ggplot2, patchwork no podrá alinear los gráficos, de modo que tendrás que personalizar los márgenes para uno de los gráficos e intentar ajustar los valores hasta que se consiga una buena alineación.

Utilizando la función tableGrob del paquete gridExtra, que revisaremos en la última sección de este tutorial, puedes agregar una tabla al layout creado con patchwork.

# install.packages("ggplot2")
# install.packages("patchwork")
# install.packages("gridExtra")
library(ggplot2)
library(patchwork)
library(gridExtra)

tab <- t(round(quantile(df$var), 2))

# ggplot2 con tabla
p1 / tableGrob(tab)

ggplot2 con una tabla con tableGrob y patchwork

Puedes usar la función textGrob de gridExtra para agregar un texto al layout, pero ten en cuenta que si quieres que el texto sea el primer elemento tendrás que utilizar la función wrap_elements.

# install.packages("ggplot2")
# install.packages("patchwork")
# install.packages("grid")
library(ggplot2)
library(patchwork)
library(grid)

# ggplot2 con texto
p1 + textGrob('Texto a la derecha')

# Para poner el texto primero utiliza:
# wrap_elements(textGrob('Texto a la izquierda')) + p1

ggplot2 y texto con la función textGrob de gridExtra

cowplot

El paquete cowplot proporciona diferentes add-ons de ggplot2, pero en este tutorial nos vamos a centrar en la función plot_grid, que permite combinar gráficos pasando objetos a la función. Ten en cuenta que también permite agregar gráficos de R base utilizando ~ como en patchwork.

El paquete cowplot para combinar ggplots

# install.packages("ggplot2")
# install.packages("cowplot")
library(ggplot2)
library(cowplot)

plot_grid(p1, p2)

Alinear los gráficos

La función proporciona el argumento align para establecer la alineación deseada, que puede ser ninguna ("none", por defecto), horizontal ("h"), vertical ("v") o alineada en ambas direcciones ("hv").

Alinear gráficos con el paquete cowplot de R

# install.packages("ggplot2")
# install.packages("cowplot")
library(ggplot2)
library(cowplot)

plot_grid(p1, p2, align = "h")

Número de filas y columnas

La función plot_grid también permite elegir el número de filas y columnas utilizadas para crear un grid de gráficos con los argumentos nrow y ncol.

La función plot_grid de cowplot

# install.packages("ggplot2")
# install.packages("cowplot")
library(ggplot2)
library(cowplot)

plot_grid(p1, p2, ncol = 1)

Agregar etiquetas a cada gráfico

Si quieres etiquetar cada gráfico de manera individual puedes utilizar el argumento labels de la función, donde puedes especificar un vector de etiquetas o utilizar las palabras clave "AUTO" o "auto" para agregar etiquetas automáticas en minúscula o mayúscula, respectivamente. La función también proporciona varios argumentos para personalizar el estilo de los textos.

Añadir etiquetas a los gráficos de ggplot2 del layout creado con cowplot

# install.packages("ggplot2")
# install.packages("cowplot")
library(ggplot2)
library(cowplot)

plot_grid(p1, p2,
          labels = c('A', 'B'), # O "AUTO" o "auto"
          label_fontfamily = "serif",
          label_fontface = "bold",
          label_colour = "dodgerblue2")

Unir gráficos con cowplot

Con cowplot también puedes crear layouts más complejos anidando funciones plot_grid, tal y como se muestra a continuación, donde creamos un layout con dos gráficos debajo y uno arriba.

Combinar varios gráficos con el paquete cowplot

# install.packages("ggplot2")
# install.packages("cowplot")
library(ggplot2)
library(cowplot)

# Grid de gráficos con cowplot
plot_grid(p3, plot_grid(p1, p2), ncol = 1)

gridExtra

El paquete gridExtra incluye la función grid.arrange para combinar varios gráficos (grobs, gtables, ggplot2 y objetos trellis) en una única figura.

# install.packages("ggplot2")
# install.packages("gridExtra")
library(ggplot2)
library(gridExtra)

# Combinamos los gráficos with gridExtra
grid.arrange(p2, p3, p1, p4)

grid.arrange para combinar varios ggplots

También puedes especificar el número de filas con nrow, el número de columnas con ncol y los tamaños proporcionales con widths y heights.

La función también proporciona argumentos para agregar etiquetas a los cuatro lados de la figura llamdos top (arriba), bottom (abajo), left (izquierda) y right (derecha).

# install.packages("ggplot2")
# install.packages("gridExtra")
library(ggplot2)
library(gridExtra)

# Combinamos los gráficos
grid.arrange(p4, p3, p2, p1,
             top = "Etiqueta arriba", bottom = "Etiqueta abajo", 
             left = "Etiqueta izquierda", right = "Etiqueta derecha")

Agregar etiquetas a los lados de un layout con la función grid.arrange de gridExtra

De manera similar a los layouts creados con patchwork puedes crear una matriz indicando las posiciones deseadas para cada gráfico. Luego puedes pasar esa matriz al argumento layout_matrix para especificarla.

# install.packages("ggplot2")
# install.packages("gridExtra")
library(ggplot2)
library(gridExtra)

# Layout personalizada
layout <- matrix(c(1, 1,
                   2, 3,
                   4, 4), ncol = 2, byrow = TRUE)

grid.arrange(p2, p3, p1, p4,
             layout_matrix = layout)

Layout personalizada con el paquete gridExtra

También te puede interesar