Como forçar vários gráficos r a terem o mesmo comprimento de x-ticks? [duplicado]
Vários pacotes em R são capazes de organizar parcelas múltiplas em uma grade, como gridExtra
e 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 base
e ggplot2
não fixariam o comprimento dos x-ticks e cowplot::plot_grid
apenas 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_wrap
deve resolver esse problema, mas ainda me pergunto se há uma solução mais direta.
Respostas
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)
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)