在拼图主标题和剧情标题之间添加图例

Add legend between patchwork main title and plot titles

是否可以使用拼凑在 'main' 标题下方和情节标题上方添加图例?

library(ggplot2)
library(patchwork)

p1 <- ggplot(mtcars, aes(disp, wt, color = factor(gear))) + 
    geom_point() + 
    labs(title = "first plot title")
p2 <- ggplot(mtcars, aes(drat, qsec, color = factor(gear))) + 
    geom_point() + 
    labs(title = "second plot title")

(p1+p2) + 
    plot_layout(guides = "collect") + 
    plot_annotation(title = "main title") & 
    theme(legend.position = "top")

有点 hack,提取图例然后将其绘制在顶部:

# get the legend
myLegend <- cowplot::get_legend(p1 + theme(legend.position = "top"))

(cowplot::plot_grid(myLegend) / (p1 + p2)) + 
  plot_layout(heights = unit(c(1, 5), "cm")) +
  plot_annotation(title = "main title") &
  theme(legend.position = "none")

解决此问题的另一种方法是在 patchwork 中使用 guide_area 函数。指南区域用于收集所有图例,如果您对其进行编码的话。您可以像操作绘图一样操作引导区域。

在下面的示例中,我添加了一个引导区域,将其放在顶部自己的行中,然后将相对高度设置为1:10,以便引导区域占用较少space。

操作引导区的方法有很多种,您可能需要根据需要调整主题以适应不同的情况。

p1 <- ggplot(mtcars, aes(disp, wt, color = factor(gear))) + 
  geom_point() + 
  labs(title = "first plot title")

p2 <- ggplot(mtcars, aes(drat, qsec, color = factor(gear))) + 
  geom_point() + 
  labs(title = "second plot title")

guide_area() + (p1+p2) + 
  plot_layout(guides = "collect", 
              nrow = 2, heights = c(1,10)) + 
  plot_annotation(title = "main title") & 
  theme(legend.position = "top")