Como forçar vários gráficos r a terem o mesmo comprimento de x-ticks? [duplicado]

Nov 26 2020

Vários pacotes em R são capazes de organizar parcelas múltiplas em uma grade, como gridExtrae cowplot. Os gráficos na mesma linha / coluna são alinhados por padrão em seus limites. A seguir está um exemplo. Três histogramas são organizados verticalmente no mesmo gráfico. Você pode notar que os x-ticks não são alterados e, portanto, o gráfico da grade parece um pouco feio.

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))

O problema é que as ferramentas de plotagem em basee ggplot2não fixariam o comprimento dos x-ticks e cowplot::plot_gridapenas esticam automaticamente as plotagens até a largura máxima. Alguns dos gráficos têm rótulos y mais largos, de modo que acabam com marcações x mais curtas.

Agora quero forçar os três histogramas a terem os mesmos comprimentos de x-ticks. Gostaria de saber se existe algum método / pacote para este tipo de problemas? Observe que geralmente a remodelagem de dados combinada com funções como ggplot2::facet_wrapdeve resolver esse problema, mas ainda me pergunto se há uma solução mais direta.

Respostas

2 teunbrand Nov 26 2020 at 14:33

Pessoalmente, acho que o patchwork lida com os alinhamentos dos gráficos de maneira elegante e você pode fazer com que os gráficos compartilhem um eixo x, definindo os limites em uma escala comum.

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)

Criado em 2020-11-26 pelo pacote reprex (v0.3.0)

1 ClausWilke Nov 27 2020 at 06:53

A plot_grid()função pode alinhar gráficos, veja aqui: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"
)

Criado em 2020-11-26 pelo pacote reprex (v0.3.0)