ggplot2 - 如何使用grid.arrange为多个图添加唯一图例?

aaa*_*aaa 4 r legend ggplot2

我有一个带有4个面板的情节用ggplot2和制成grid.arrange.每个面板都有一个图例,它们对所有面板都是相同的.

如何删除4个图例并在图表底部创建一个独特的图例?

这里是我的样本数据和情节:

set.seed(100)
df_1 = data.frame(lat = rnorm(20), 
                  lon = rnorm(20), 
                  cor = c(rep('positive', 7), rep('negative', 13)), 
                  sign = c(rep(99, 5), rep(95, 6), rep(90,9)))

lst_df = list(df_1, df_1, df_1, df_1)


library(ggplot2)
library(gridExtra)
library(grid)

for (i in 1:length(lst_df)) {
p[[i]] = ggplot() +

    geom_point(data=lst_df[[i]], aes(x=lon, y=lat, size=sign, colour = cor), alpha = 0.5) +

    scale_color_manual(values=c("blue", "orange"),
                       name='col', 
                       labels = c('neg', 'pos'),
                       guide = guide_legend(override.aes = list(alpha = 1, size = 3))) +

    scale_size(range = c(1,3), 
               breaks = c(90, 95, 99),
               labels = c(1, 5, 10),
               name = 'test',
               guide = guide_legend(override.aes = list(colour = 'black', 
                                                        alpha = 1)))
}


grid.arrange(p[[1]], p[[2]], p[[3]], p[[4]], 
             ncol=2, nrow=2,
             top=textGrob(expression(bold("test")), gp=gpar(fontsize=25, face= 'bold')))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

有什么建议吗?谢谢

cam*_*lle 7

这是一个工作流程cowplot,它提供了一些巧妙的功能,可以将grob放在一起并提取元素,如图例.他们有一个详细的小插图,用你正在寻找的共享传说创建地块网格.类似地,关于绘图注释的插图会覆盖cowplot用于创建和添加标签的功能 - 它们的功能与其他绘图元素非常相似,可以在其中使用cowplot::plot_grid.

这个过程基本上就是

  1. 使用lapply(可能是一个循环)创建没有图例的图表列表
  2. 提取其中一个传说 - 因为它们都是相同的而无关紧要 - 它们被定位在底部
  3. 为标题创建文本grob
  4. 从无图例列表中创建网格
  5. 从标题,无图例图形网格和图例创建网格

顺便说一句,加载cowplot让它设置其默认ggplot主题,我不是特别喜欢,所以我使用cowplot::function符号而不是library(cowplot).

您可以调整用于制作最终网格的相对高度 - 这是第一个对我有用的比率.

如果它出现了,我几个月前发布了一个问题,draw_label就像你想要的ggplot标题中的正常元素一样,制作grob主题指南; 包裹作者和我的专业功能的答案都在这里.

library(ggplot2)
...

p_no_legend <- lapply(p, function(x) x + theme(legend.position = "none"))
legend <- cowplot::get_legend(p[[1]] + theme(legend.position = "bottom"))

title <- cowplot::ggdraw() + cowplot::draw_label("test", fontface = "bold")

p_grid <- cowplot::plot_grid(plotlist = p_no_legend, ncol = 2)
cowplot::plot_grid(title, p_grid, legend, ncol = 1, rel_heights = c(0.1, 1, 0.2))
Run Code Online (Sandbox Code Playgroud)

由reprex包(v0.2.0)创建于2018-09-11 .