将多图 ggplots 与拼凑图和单个图例对齐
Align multi-figure ggplots with patchwork and single legend
我在 R 中使用 patchwork 创建一个多图图形。它们共享一个图例,所以我使用 ggpubr::get_legend()
在右上角的面板中包含图例(注意:我不能使用 patchwork::plot_layout()
因为图例具有不同的基础值)。
基地地块
library(ggplot2)
library(patchwork)
library(ggpubr)
p <- ggplot(data = mtcars %>% mutate(cyl = as.factor(cyl)),
mapping = aes(x = wt, y = mpg, group = cyl, color = cyl)) +
geom_smooth(method = "lm")
当顶行和底行有6个相同的地块时,地块对齐:
(p | p | p | p | p | p) /
(p | p | p | p | p | p) &
theme(legend.position = "none")
当顶行第 5 个图是图例时,它们不对齐:
leg <- as_ggplot(get_legend(p))
(p | p | p | p | p | leg) /
(p | p | p | p | p | p) &
theme(legend.position = "none")
实现您想要的结果的一个选择是将所有图(包括图例)放在一个列表中并利用 patchwork::wrap_plots
:
library(ggplot2)
library(patchwork)
library(ggpubr)
p <- ggplot(data = mtcars %>% mutate(cyl = as.factor(cyl)),
mapping = aes(x = wt, y = mpg, group = cyl, color = cyl)) +
geom_smooth(method = "lm")
leg <- as_ggplot(get_legend(p))
p_list <- lapply(1:12, function(x) if (x == 6) leg else p)
wrap_plots(p_list, nrow = 2) &
theme(legend.position = "none")
这也可以通过 gridExtra
包中的 grid.arrange()
来完成:
library(gridExtra)
grid.arrange(p, p, p, p, p, leg,
p, p, p, p, p, p,
nrow = 2)
我在 R 中使用 patchwork 创建一个多图图形。它们共享一个图例,所以我使用 ggpubr::get_legend()
在右上角的面板中包含图例(注意:我不能使用 patchwork::plot_layout()
因为图例具有不同的基础值)。
基地地块
library(ggplot2)
library(patchwork)
library(ggpubr)
p <- ggplot(data = mtcars %>% mutate(cyl = as.factor(cyl)),
mapping = aes(x = wt, y = mpg, group = cyl, color = cyl)) +
geom_smooth(method = "lm")
当顶行和底行有6个相同的地块时,地块对齐:
(p | p | p | p | p | p) /
(p | p | p | p | p | p) &
theme(legend.position = "none")
当顶行第 5 个图是图例时,它们不对齐:
leg <- as_ggplot(get_legend(p))
(p | p | p | p | p | leg) /
(p | p | p | p | p | p) &
theme(legend.position = "none")
实现您想要的结果的一个选择是将所有图(包括图例)放在一个列表中并利用 patchwork::wrap_plots
:
library(ggplot2)
library(patchwork)
library(ggpubr)
p <- ggplot(data = mtcars %>% mutate(cyl = as.factor(cyl)),
mapping = aes(x = wt, y = mpg, group = cyl, color = cyl)) +
geom_smooth(method = "lm")
leg <- as_ggplot(get_legend(p))
p_list <- lapply(1:12, function(x) if (x == 6) leg else p)
wrap_plots(p_list, nrow = 2) &
theme(legend.position = "none")
这也可以通过 gridExtra
包中的 grid.arrange()
来完成:
library(gridExtra)
grid.arrange(p, p, p, p, p, leg,
p, p, p, p, p, p,
nrow = 2)