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

Max*_*m.K 9 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)
Run Code Online (Sandbox Code Playgroud)

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

我尝试了什么,什么不起作用

我试图使用R Cookbook中描述的解决方案.multiplot()该页面上给出的自定义函数使得图表没有图例就可以了.但是,如果只需要一个图例,则该功能失败.由于其中一个图形将包含图例,而另一个图形不包含图形,因此两个图形的宽度相互之间会有所不同(请从提到链接中复制多色函数):

multiplot(p1 + theme(legend.position = "none"),p2,cols=2)
Run Code Online (Sandbox Code Playgroud)

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

Did*_*rts 15

这是使用包gridExtra和的解决方案grid.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")
Run Code Online (Sandbox Code Playgroud)

现在你可以从第一个带有g_legend()@Luciano Selzer借用的函数的情节得到传说回答这个问题.

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)
Run Code Online (Sandbox Code Playgroud)

现在,您可以将图表和图例与功能arrangeGrob()和结合起来grid.arrange().在arrangeGrob()你可以设置宽度为列,从而获得所需的情节和传说之间的比例.

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

在此输入图像描述

UPDATE

要将所有图表放在同一行中:

grid.arrange(arrangeGrob(p1,p2,leg,ncol=3,widths=c(3/7,3/7,1/7)))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 您不必手动猜测图例宽度:https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs (3认同)