我正在努力在两个ggplot图之间共享共同的图例,这是我使用arrange.grid安排的。我得到的最接近的是:
Plot a legend and well-spaced universal y-axis and main titles in grid.arrange,但是使用这里的想法,我只能在底部或顶部得到常见的图例。这是我的尝试:
library(ggplot2)
p1<-ggplot(data=diamonds)+geom_bar(aes(x=cut,fill=color))+scale_x_discrete("")+ylab("")+ggtitle("Title 1")
p2<-ggplot(data=diamonds)+geom_bar(aes(x=cut,fill=color))+scale_x_discrete("")+ylab("")+ggtitle("Title 2")
legend = gtable_filter(ggplotGrob(p1), "guide-box")
grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
p2 + theme(legend.position="none"),
nrow = 1,
top = textGrob("Main Title", vjust = -6, gp = gpar(fontface = "bold", cex = 1.5)),
left = textGrob("Global Y-axis Label", rot = 90, vjust = 2.5),
bottom = textGrob("Global X-axis Label", vjust =-1)),
legend,
nrow=1)此外,本教程仅展示如何放置在底部或边上:
https://cran.r-project.org/web/packages/cowplot/vignettes/shared_legends.html
使用此解决方案会有所帮助,但图形看起来仍然很丑陋。
p1<-ggplot(data=diamonds)+geom_bar(aes(x=cut,fill=color))+scale_x_discrete("")+ylab("")+ggtitle("Title 1")+guides(fill = guide_legend(title.position = "top",nrow=1))+theme(legend.position = "top", plot.title=element_text(hjust = 0,vjust=-1))
p2<-ggplot(data=diamonds)+geom_bar(aes(x=cut,fill=color))+scale_x_discrete("")+ylab("")+ggtitle("Title 2")
g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)}
mylegend<-g_legend(p1)
grid.arrange(mylegend,nrow=2,heights=c(0.2,1),
arrangeGrob(p1+ theme(legend.position="none"),
p2+ theme(legend.position="none"),
top = textGrob("Main Title", vjust =-6, gp = gpar(fontface = "bold", cex = 1.5)),
left = textGrob("Global Y-axis Label", rot = 90, vjust = 2.5),
bottom = textGrob("Global X-axis Label", vjust =-1),
nrow=1))发布于 2017-05-30 22:42:21
您可以使用此函数
g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)}然后,您可以执行以下操作
plot1 <- ggplot(...) + ...
mylegend<-g_legend(plot1)
plot2 <- ggplot(...) + ... + theme(legend.position="none")
grid.arrange(arrangeGrob(plot1+ theme(legend.position="none")
,plot2
nrow=1),
mylegend,nrow=2,heights=c(10,1))更新
要将图例放在最上面,请尝试以下命令
grid.arrange(mylegend,nrow=2,heights=c(0.05,1),
arrangeGrob( plot1+ theme(legend.position="none")
,plot2
,nrow=1)
)您可能需要在heights=c(0.05,1)中试验一下0.05
https://stackoverflow.com/questions/44265227
复制相似问题