ggplot2在顶部共享传奇

时间:2017-05-30 14:36:33

标签: r ggplot2

我正在努力分享两个ggplot图之间的共同传说,我已经使用arrange.grid进行了安排。我得到的最接近的是:

Plot a legend and well-spaced universal y-axis and main titles in grid.arrange但是使用这里的想法我只能在底部或顶部获得共同的传奇。这是我的尝试:

$time = date('Y-m-d 03:00:00');

此教程仅显示如何将其置于底部或侧面:

https://cran.r-project.org/web/packages/cowplot/vignettes/shared_legends.html

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

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)

1 个答案:

答案 0 :(得分: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)}

然后你可以做以下

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)
               )

您可能需要使用0.05

中的heights=c(0.05,1)进行一些实验