使用拼凑对齐和缩放 ggplots
Aligning and scaling ggplots with patchwork
我正在尝试使用 patchwork 包将一些地块组合成一个地块,但我不熟悉它,并且无法弄清楚如何正确缩放地块的大小。有一个核心图,散点图,然后是每个连续变量到某些分布的箱线图。下面是一个可重现的示例:
library(dplyr)
library(ggplot2)
library(patchwork)
set.seed(100)
dat1 <- tibble(x = runif(1000, 0, 10),
y = runif(1000, 0, 20),
group1 = sample(rep(letters[1:5], each = 200)),
group2 = sample(rep(letters[-22:-1], each = 250)))
plot1 <- ggplot(data = dat1) +
geom_point(aes(x = x, y = y, color = group1)) +
facet_wrap(~group2) +
theme(legend.position = 'bottom')
xbox <- ggplot(data = dat1) +
geom_boxplot(aes(x = x, y = group1, fill = group1, color = group1)) +
scale_x_continuous(position = 'top') +
theme(legend.position = 'none',
axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
title = element_blank())
ybox <- ggplot(data = dat1) +
geom_boxplot(aes(x = group1, y = y, fill = group1, color = group1)) +
scale_y_continuous(position = 'right') +
theme(legend.position = 'none',
axis.title.x = element_blank(),
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
title = element_blank())
(xbox + plot_spacer()) / (plot1 + ybox)
这与我正在尝试的很接近,但箱线图需要重新调整比例,使顶部的大约为其显示高度的 20%,右侧的大约为其显示宽度的 20%。我已经尝试使用 patchwork::plot_layout
来处理缩放,但我总是得到意想不到的结果。我插入了 patchwork::plot_spacer()
以便右侧的箱线图不会拉伸图片的整个高度,但也许有更好的方法可以做到这一点。箱线图应该看起来更像坐标轴,因此右上角的空格实际上不应该存在。
我不确定您是否会得到一个在页边距中具有推论意义的图,但您可以使用 heights
更改 plot_layout
中边距图的宽度和高度和 widths
参数或 design
参数。请注意,括号中的地块本身被视为“子地块”,并且在使用 plot_layout
时被赋予自己的“区域”。因此,我将所有地块加在一起,而不是使用其他拼凑运算符来排列它们。
xbox + plot_spacer() + plot1 + ybox + plot_layout(design = c(area(t = 1, b = 1, l = 1, r = 6), # <== top column
area(t = 1, b = 1, l = 7, r = 7), # <== top right
area(t = 2, b = 7, l = 1, r = 6), # <== bottom left
area(t = 2, b = 7, l = 7, r = 7) # <== bottom right
))
# Alternative:
xbox + plot_spacer() + plot1 + ybox + plot_layout(ncol = 2, nrow = 2,
heights = c(1, 6),
widths = c(6, 1))
我正在尝试使用 patchwork 包将一些地块组合成一个地块,但我不熟悉它,并且无法弄清楚如何正确缩放地块的大小。有一个核心图,散点图,然后是每个连续变量到某些分布的箱线图。下面是一个可重现的示例:
library(dplyr)
library(ggplot2)
library(patchwork)
set.seed(100)
dat1 <- tibble(x = runif(1000, 0, 10),
y = runif(1000, 0, 20),
group1 = sample(rep(letters[1:5], each = 200)),
group2 = sample(rep(letters[-22:-1], each = 250)))
plot1 <- ggplot(data = dat1) +
geom_point(aes(x = x, y = y, color = group1)) +
facet_wrap(~group2) +
theme(legend.position = 'bottom')
xbox <- ggplot(data = dat1) +
geom_boxplot(aes(x = x, y = group1, fill = group1, color = group1)) +
scale_x_continuous(position = 'top') +
theme(legend.position = 'none',
axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
title = element_blank())
ybox <- ggplot(data = dat1) +
geom_boxplot(aes(x = group1, y = y, fill = group1, color = group1)) +
scale_y_continuous(position = 'right') +
theme(legend.position = 'none',
axis.title.x = element_blank(),
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
title = element_blank())
(xbox + plot_spacer()) / (plot1 + ybox)
这与我正在尝试的很接近,但箱线图需要重新调整比例,使顶部的大约为其显示高度的 20%,右侧的大约为其显示宽度的 20%。我已经尝试使用 patchwork::plot_layout
来处理缩放,但我总是得到意想不到的结果。我插入了 patchwork::plot_spacer()
以便右侧的箱线图不会拉伸图片的整个高度,但也许有更好的方法可以做到这一点。箱线图应该看起来更像坐标轴,因此右上角的空格实际上不应该存在。
我不确定您是否会得到一个在页边距中具有推论意义的图,但您可以使用 heights
更改 plot_layout
中边距图的宽度和高度和 widths
参数或 design
参数。请注意,括号中的地块本身被视为“子地块”,并且在使用 plot_layout
时被赋予自己的“区域”。因此,我将所有地块加在一起,而不是使用其他拼凑运算符来排列它们。
xbox + plot_spacer() + plot1 + ybox + plot_layout(design = c(area(t = 1, b = 1, l = 1, r = 6), # <== top column
area(t = 1, b = 1, l = 7, r = 7), # <== top right
area(t = 2, b = 7, l = 1, r = 6), # <== bottom left
area(t = 2, b = 7, l = 7, r = 7) # <== bottom right
))
# Alternative:
xbox + plot_spacer() + plot1 + ybox + plot_layout(ncol = 2, nrow = 2,
heights = c(1, 6),
widths = c(6, 1))