R 中牛图网格的一个共享图例
Posted
技术标签:
【中文标题】R 中牛图网格的一个共享图例【英文标题】:One shared legend for a cowplot grid in R 【发布时间】:2016-09-17 01:42:04 【问题描述】:我刚刚使用包 cowplot
构建了一个网格(用于标记 A-D 中的图)。这些图是用包ggplot2
制作的:
pfour<-ggplot(four, aes(x=Concentration, y=Percentage, fill=Phenotype)) +
geom_bar(stat='identity',color='black') +
scale_fill_grey(start = .4, end = .9) +
theme_bw()+ylab("Distribution") +
xlab("Contentration [mg/ml]") +
ggtitle("96 hpf") +
theme(legend.title = element_text(colour="black", size=10, face="bold")) +
theme(legend.background = element_rect(fill="white",
size=0.5, linetype="solid",
colour ="black")) +
scale_x_discrete(limits=c('uninjected','control','0.002', '0.02', '0.2'),
labels=c('uninjected\n(n=251)',
'control\n(n=248)',
'0.002\n(n=205)',
'0.02\n(n=222)',
'0.2\n(n=203)'))
数据看起来是这样的(4个不同的表格,百分比略有不同但原理相同):
Concentration,Percentage,Phenotype
uninjected,0.996015936,0
uninjected,0,1
uninjected,0.003984064,2
uninjected,0,3
uninjected,0,4
control,0.995967742,0
control,0.004032258,1
control,0,2
control,0,3
control,0,4
0.002,0.985365854,0
0.002,0.004878049,1
0.002,0.004878049,2
0.002,0,3
0.002,0.004878049,4
0.02,0.981981982,0
0.02,0.004504505,1
0.02,0.004504505,2
0.02,0.004504505,3
0.02,0.004504505,4
0.2,0.985221675,0
0.2,0.004926108,1
0.2,0,2
它看起来像这样:
代码是:
plot_grid(ponezoom, ptwozoom,pthreezoom,pfourzoom, align='h', labels=c('A', 'B','C','D'))
现在我想知道是否有可能为所有四个情节获得一个共享图例,因为它会占用大量情节空间来获得 4 次。感谢您的帮助。
【问题讨论】:
刚刚编辑。 ggplot2 用于图表,cowplot 用于网格 您应该澄清每列底部的两个图例是否令人满意,或者它是否需要是一个图例。您还应该发布一些数据。 【参考方案1】:您可以使用 ggpubr
包中的 ggarrange
函数。它有一个逻辑参数common.legend
。您只需将其设置为TRUE
。在您的情况下,代码块将是:
library(ggpubr)
ggarrange(ponezoom, ptwozoom, pthreezoom, pfourzoom,
align='h', labels=c('A', 'B','C','D'),
common.legend = T)
查看mtcars
数据集的示例:
library(tidyverse)
library(ggpubr)
# Create first plot
mtcars %>%
ggplot(aes(mpg, hp, color = factor(cyl))) +
geom_point(size = 2) +
theme_minimal()-> plot1
# Create second plot
mtcars %>%
ggplot(aes(disp, drat, color = factor(cyl))) +
geom_point(size = 2) +
theme_minimal() -> plot2
# Create grid
ggpubr::ggarrange(plot1, plot2, # list of plots
labels = "AUTO", # labels
common.legend = T, # COMMON LEGEND
legend = "bottom", # legend position
align = "hv", # Align them both, horizontal and vertical
nrow = 2) # number of rows
瞧:
【讨论】:
或者你可以看看patchwork
包patchwork.data-imaginist.com【参考方案2】:
is a vignette 显示了如何执行此操作。
方法是使用隐藏的图例 theme(legend.position="none")
构建您的图。
然后从其中一个对象中提取图例 grob。
grobs <- ggplotGrob(pfour)$grobs
legend <- grobs[[which(sapply(grobs, function(x) x$name) == "guide-box")]]
然后将图例绘制为单独的“情节”。 要将图例放在右侧,您可以这样做:
# build grid without legends
pgrid <- plot_grid(pone, ptwo, pthree, pfour, ncol = 2)
# add legend
p <- plot_grid(pgrid, legend, ncol = 2, rel_widths = c(1, .1))
【讨论】:
请注意,cowplot
中现在有一个 get_legend(p)
函数(在您链接的小插图中列出)。以上是关于R 中牛图网格的一个共享图例的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用cowplot包的plot_grid函数将两个ggplot2可视化结果并排组合起来并添加图像标签AB设置组合图像使用共享的图例(shared legend in cowplot)
在 ggplot2 中为每个 facet_wrap 网格放置一个图例