我有一个带有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)
有什么建议吗?谢谢
这是一个工作流程cowplot,它提供了一些巧妙的功能,可以将grob放在一起并提取元素,如图例.他们有一个详细的小插图,用你正在寻找的共享传说创建地块网格.类似地,关于绘图注释的插图会覆盖cowplot用于创建和添加标签的功能 - 它们的功能与其他绘图元素非常相似,可以在其中使用cowplot::plot_grid.
这个过程基本上就是
lapply(可能是一个循环)创建没有图例的图表列表顺便说一句,加载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 .