Estou usando o patchwork
pacote em R para organizar 6 gráficos em um layout de 3 linhas por 2 colunas, onde cada coluna tem gráficos empilhados verticalmente.
Cada coluna vertical funciona quando criada de forma independente, com larguras e alturas fixas usando unit()
o grid
pacote. Mas quando tento combinar as duas colunas encapsuladas com wrap_plots()
, recebo este erro:
Erro: índice fora dos limites (subconjunto "unidade")
library(ggplot2)
library(patchwork)
library(grid)
# Dummy plots
p_tmp <- lapply(1:6, function(i) {
ggplot(
data = mtcars,
aes(mpg, wt)
) +
geom_point() +
labs(
subtitle = paste("Plot", i)
)
})
# Individual columns work fine
col1 <- wrap_plots(
p_tmp[1:3],
ncol = 1,
heights = unit(rep(2.5, 3), "cm"),
widths = unit(2.5, "cm")
) +
plot_annotation(
"col1"
)
col2 <- wrap_plots(
p_tmp[4:6],
ncol = 1,
heights = unit(rep(2.5, 3), "cm"),
widths = unit(9 / 16 * 2.5, "cm")
) +
plot_annotation(
"col2"
)
# Combining both results in error
wrap_plots(col1, col2, ncol = 2)
Os gráficos de colunas individuais estão funcionando, mas ao combiná-los, recebo o erro mencionado.
Como posso combinar corretamente várias wrap_plots()
colunas que usam dimensões fixas unit() widths
e heights
? Existe uma maneira de manter dimensões fixas e ainda combiná-las em um layout maior sem acionar esse erro?
Editar:
Para esclarecer o objetivo da pergunta: os 3 primeiros gráficos são idênticos geom_raster()
e devem compartilhar uma legenda de preenchimento comum, enquanto os gráficos 4 a 6 permanecem os mesmos. A posição da legenda deve ser centralizada abaixo da primeira coluna, o que não acontece ao combinar todos os gráficos com um único wrap_plots()
comando.
library(ggplot2)
library(patchwork)
# Create raster plot
df <- expand.grid(x = 1:20, y = 1:20)
df$z <- as.vector(matrix(runif(400), nrow = 20, ncol = 20))
raster_plot <- ggplot(
data = df,
aes(x, y, fill = z)
) +
geom_raster(
interpolate = FALSE
) +
scale_fill_viridis_c() +
theme_minimal() +
theme(
legend.position = "bottom"
)
# Define plots
p_tmp <- c(
rep(list(raster_plot), 3),
lapply(1:3, function(i) {
ggplot(
data = mtcars,
aes(mpg, wt)
) +
geom_point() +
theme_minimal()
}))
heights <- unit(rep(2, 3), "cm")
# Column 1 – works alone
col1 <- wrap_plots(
p_tmp[1:3],
ncol = 1,
heights = heights,
widths = unit(2, "cm"),
guides = "collect"
)
# Column 2 – works alone
col2 <- wrap_plots(
p_tmp[4:6],
ncol = 1,
heights = heights,
widths = unit(9 / 16 * 2, "cm")
)
# Combining both → error
# wrap_plots(col1, col2, ncol = 2)
# Combining all → no error
wrap_plots(
p_tmp,
ncol = 2,
byrow = FALSE,
heights = heights,
widths = unit(c(2, 9 / 16 * 2), rep("cm", 2)),
guides = "collect",
axis_titles = "collect"
)
Em vez de usar vários
wrap_plot
s, uma opção seria usar apenas um:EDIT Para lidar com a legenda, podemos usar
guide_area
eplot_spacer
adicionar a legenda à primeira coluna: