如何排列`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
我正在尝试并排排列两个 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