¿Cómo forzar que varias gráficas r tengan la misma longitud de x-ticks? [duplicar]

Nov 26 2020

Varios paquetes en R pueden organizar varios gráficos en una cuadrícula, como gridExtray cowplot. Las parcelas en la misma fila / columna están alineadas por defecto en su límite. Lo siguiente es un ejemplo. Tres histogramas están dispuestos verticalmente en el mismo gráfico. Puede notar que los x-ticks no están alineados y, por lo tanto, el diagrama de cuadrícula se ve un poco desagradable.

library(ggplot2);library(grid);library(cowplot)

p1 <- ggplot(data = NULL, aes(x = rt(10,19))) + 
  geom_histogram(bins = 5, fill = "darkgreen", color = "darkgrey", alpha = 0.6) +
  labs(y = "", x = "")
# similar plots for p2, p3

plot_grid(p1, textGrob("N=10"),
             p2, textGrob("N=100"),
             p3, textGrob("N=10000"),
             nrow=3, rel_widths = c(4/5, 1/5))

El problema es que las herramientas de trazado en basey ggplot2no fijarían la longitud de las marcas x y cowplot::plot_gridsimplemente estiran automáticamente los trazados al ancho máximo. Algunas de las gráficas tienen etiquetas y más anchas, por lo que terminan con marcas x más cortas.

Ahora quiero forzar los tres histogramas para que tengan las mismas longitudes de x-ticks. Me gustaría saber si existe algún método / paquete para este tipo de problemas. Tenga en cuenta que, por lo general, la remodelación de datos combinada con funciones como ggplot2::facet_wrapdebería resolver este problema, pero todavía me pregunto si hay una solución más directa.

Respuestas

2 teunbrand Nov 26 2020 at 14:33

Personalmente, creo que patchwork maneja las alineaciones de los gráficos con elegancia y puede hacer que los gráficos compartan un eje x estableciendo los límites en una escala común.

library(ggplot2)
library(patchwork)

set.seed(123)

plots <- lapply(c(10, 100, 1000), function(n) {
  ggplot(mapping = aes(x = rt(n, 19))) +
    geom_histogram(bins = round(sqrt(n)) * 2,
                   fill = "darkgreen", colour = "darkgrey",
                   alpha = 0.6) +
    labs(y = "", x = "")
})

plots[[1]] / plots[[2]] / plots[[3]] &
  scale_x_continuous(limits = c(-5, 5),
                     oob = scales::oob_squish)

Creado el 2020-11-26 por el paquete reprex (v0.3.0)

1 ClausWilke Nov 27 2020 at 06:53

La plot_grid()función puede alinear gráficos, vea aquí:https://wilkelab.org/cowplot/articles/aligning_plots.html

library(ggplot2)
library(grid)
library(cowplot)

set.seed(123)

plots <- lapply(c(10, 100, 1000), function(n) {
  ggplot(mapping = aes(x = rt(n, 19))) +
    geom_histogram(bins = round(sqrt(n)) * 2,
                   fill = "darkgreen", colour = "darkgrey",
                   alpha = 0.6) +
    labs(y = "", x = "") +
    scale_x_continuous(
      limits = c(-5, 5),
      oob = scales::oob_squish
    )
})

plot_grid(
  plots[[1]], textGrob("N=10"),
  plots[[2]], textGrob("N=100"),
  plots[[3]], textGrob("N=10000"),
  nrow=3, rel_widths = c(4/5, 1/5), align = "v", axis = "l"
)

Creado el 2020-11-26 por el paquete reprex (v0.3.0)