首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ggplot2分享了顶部的图例

ggplot2分享了顶部的图例
EN

Stack Overflow用户
提问于 2017-05-30 22:36:33
回答 1查看 524关注 0票数 0

我正在努力在两个ggplot图之间共享共同的图例,这是我使用arrange.grid安排的。我得到的最接近的是:

Plot a legend and well-spaced universal y-axis and main titles in grid.arrange,但是使用这里的想法,我只能在底部或顶部得到常见的图例。这是我的尝试:

代码语言:javascript
复制
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

使用此解决方案会有所帮助,但图形看起来仍然很丑陋。

代码语言:javascript
复制
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))
EN

回答 1

Stack Overflow用户

发布于 2017-05-30 22:42:21

您可以使用此函数

代码语言:javascript
复制
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)}

然后,您可以执行以下操作

代码语言:javascript
复制
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))

更新

要将图例放在最上面,请尝试以下命令

代码语言:javascript
复制
  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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44265227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档