将多图 ggplots 与拼凑和单个图例对齐

Posted

技术标签:

【中文标题】将多图 ggplots 与拼凑和单个图例对齐【英文标题】:Align multi-figure ggplots with patchwork and single legend 【发布时间】:2021-10-17 15:18:47 【问题描述】:

我正在使用拼凑在 R 中创建一个多图图形。它们共享一个图例,因此我在右上角的面板中使用 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")

【问题讨论】:

【参考方案1】:

这也可以通过gridExtra 包中的grid.arrange() 来完成:

library(gridExtra)

grid.arrange(p, p, p, p, p, leg,
             p, p, p, p, p, p,
             nrow = 2)

【讨论】:

【参考方案2】:

实现所需结果的一种选择是将包括图例在内的所有图放在一个列表中并使用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")

【讨论】:

以上是关于将多图 ggplots 与拼凑和单个图例对齐的主要内容,如果未能解决你的问题,请参考以下文章

将关键点图例和标签对齐到图例框的右侧,在ggplot2中

R语言ggplot2可视化: 将图例标题(legend title)对齐到ggplot2中图例框的中间(默认左对齐align legend title to middle of legend)

R语言ggplot2可视化:ggplot2可视化分组箱图,将可视化图像的图例(legend)和标题(title)放置在图像左上方并左对齐其中图例信息水平平铺(top left)

R语言ggplot2可视化:ggplot2可视化分组箱图,将可视化图像的图例(legend)放置在图像底部左边左对齐其中图例信息水平平铺​ (position legend bottom left)

R语言ggplot2可视化:ggplot2可视化分组箱图,将可视化图像的图例(legend)放置在图像底部左边左对齐其中图例信息水平平铺​ (position legend bottom left)

Oracle SQL 多列与单个范围/图例对齐