如何排列`ggplot2` objects side-by-side 并确保绘图区域相等?

How to arrange `ggplot2` objects side-by-side and ensure equal plotting areas?

我正在尝试并排排列两个 ggplot2 图,即 two-column 使用包 gridExtra 进行布局。我有兴趣确保两者 绘图具有相等的绘图区域(即,灰色绘图面板对于两者都是相同的 plots) 而不管 x-axis 标签的高度。正如您在 下面的示例,当使用更长的 x-axis 标签时,gridExtra::grid.arrange() 似乎通过调整绘图区域(即变灰的 情节的一部分)。

# Dummy data.
data <- data.frame(x = 1:10, y = rnorm(10))

# Dummy labels.
x_labels_short <- 1:10
x_labels_long <- 100001:100010

# Common settings for both `ggplot2` plots.
layers <- list(
    labs(
        x = "Plot title"
    ),
    theme(
        axis.text.x = element_text(
            angle = 90,
            vjust = 0.5,
            hjust = 1
        )
    )
)

# `ggplot2 plot (a).
plot_a <- ggplot(data, aes(x, y)) +
    scale_x_continuous(breaks = 1:10, labels = x_labels_short) +
    layers

# `ggplo2` plot (b).
plot_b <- ggplot(data, aes(x, y)) +
    scale_x_continuous(breaks = 1:10, labels = x_labels_long) +
    layers

# Showing the plots side by side.
gridExtra::grid.arrange(
    plot_a,
    plot_b,
    ncol = 2
)

输出:

我想要的是两个地块 (1) 具有相等的绘图区域和 (b) x-axis plot_a 的标题与 plot_b 的标题对齐(即 x-axis 的标题 plot_a 根据 plot_b 的 x-axis 标签的长度进行偏移。

如果不清楚,这就是我想用 base 实现的效果 R.

# Wrapper for convenience.
plot_gen <- function(data, labels) {
    plot(
        NULL,
        xlim = c(1, 10),
        ylim = c(min(data$y), max(data$y)),
        xlab = "",
        ylab = "y",
        xaxt = "n"
    )
    axis(
        side = 1,
        at = 1:10,
        labels = labels,
        las = 2
    )
    title(
        xlab = "Plot title",
        line = 4.5
    )
}

# Get `par`.
old_par = par(no.readonly = TRUE)

# Set the two-column layout.
layout(matrix(1:2, ncol = 2))

# Adjust margins.
par(mar = old_par$mar + c(1.5, 0, 0, 0))

# Plot base plot one.
plot_gen(data, x_labels_short)

# Plot base plot two.
plot_gen(data, x_labels_long)

# Restore `par`.
par(old_par)

# Restore layout.
layout(1:1)

输出:

快速提及。我在 SO 上发现了类似的问题(即 ), 但是我看不出 答案解决了问题。另外,我试图安排的情节是基于 在不同的数据上,我认为我不能使用 facet_wrap 方法。

一个建议:patchwork 包。

library(patchwork)
plot_a + plot_b

它也适用于更复杂的布局,例如:

(plot_a | plot_b) / plot_a