ggplot2:单行中具有不同变量的多个图,单个分组图例

时间:2013-06-06 13:15:41

标签: r ggplot2

虽然有些主题在同一个方向上进行,但我没有找到任何可以解决我的问题的具体方法。因此,一个新的主题,并提前感谢所有的帮助。

场合

我有两个图,需要水平放在一个图中,例如:

library(ggplot2)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ]    
p1 <- qplot(price, carat, data=dsamp, colour=clarity)
p2 <- qplot(price, depth, data=dsamp, colour=clarity)

虽然每个图的因变量不同,但分组和独立性保持不变。因此,我只需要图中的一个图例来描述这些组。

我尝试了什么,什么不行?

我尝试使用R Cookbook中描述的解决方案。该页面上给出的自定义multiplot()函数可以在没有图例的情况下呈现图表。但是,如果只需要一个图例,则该功能失败。由于其中一个图形将包含图例,而另一个图形不包含,两个图形的宽度相互之间会有所不同(请从link mentioned复制多重函数):

multiplot(p1 + theme(legend.position = "none"),p2,cols=2)

我找到的另一个可能的解决方案是包gridExtra,其中包含此code example。除了图表是垂直排列外,它几乎可以满足我的需要。我尝试使用函数参数,但无法想象如何水平排列图。希望有人对该包/问题有更多的经验。谢谢!

1 个答案:

答案 0 :(得分:15)

以下是使用包gridExtragrid.arrange()的解决方案。首先,制作三个图 - 一个带有图例(p1.leg),两个没有图例。

p1.leg <- ggplot(dsamp,aes(price,carat,colour=clarity))+geom_point()
p1<-ggplot(dsamp,aes(price,carat,colour=clarity))+geom_point()+
      theme(legend.position="none")
p2 <-ggplot(dsamp,aes(price,depth,colour=clarity))+geom_point()+
     theme(legend.position="none")

现在你可以从第一个带有函数g_legend()的情节得到传说,我借用@Luciano Selzer来回答this question

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

leg<-g_legend(p1.leg)

现在,您可以将图表和图例与函数arrangeGrob()grid.arrange()结合使用。在arrangeGrob()中,您可以设置列的宽度,以便在绘图和图例之间获得所需的比例。

library(gridExtra)
grid.arrange(arrangeGrob(arrangeGrob(p1,p2),leg,ncol=2,widths=c(5/6,1/6)))

enter image description here

更新

将所有图表放在同一行:

grid.arrange(arrangeGrob(p1,p2,leg,ncol=3,widths=c(3/7,3/7,1/7)))

enter image description here