ggplot2: 在一行中使用不同变量创建多个图,有单独的分组图例

10

虽然有一些与我问题同方向的话题,但我没有找到任何一个可以具体解决我的问题。因此,我开了一个新话题,在此提前感谢所有的帮助。

情况

我有两个图形需要水平并排放在同一张图中,例如:

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()函数可以很好地呈现没有图例的图形。然而,如果只需要一个图例,那么该函数将失败。因为其中一个图形将包含图例,而另一个图形不包含图例,两个图形的宽度将相对于彼此不同(请从链接中复制multiplot函数):

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

我发现的另一个潜在解决方案是包gridExtra,具体可参考代码示例。它几乎满足我的需求,但图形是垂直排列的。我尝试调整函数参数,但无法弄清如何水平排列绘图。希望有人对该软件包/问题有更多经验。谢谢!


谁看到这个问题:我曾经问过一个非常类似的问题,您可能会在那里找到非常有用的答案。https://dev59.com/IZPea4cB1Zd3GeqP-BD0 - mts
1个回答

16

以下是使用包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")

现在你可以使用从@Luciano Selzer的回答中借来的函数g_legend()仅从第一个图例中获取图例。他是为这个问题提出的解决方案。

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

这里输入图片描述


谢谢,Didzis。不幸的是,这不是我需要的。这是在gridExtra包的示例中提到的解决方案(至少具有相同的结果)。我需要的是将这些图形和图例水平排列,而不是垂直排列。你能否修改grid.arrange()调用以实现这一点?谢谢。 - Maxim.K
只需在代码的arrangeGrob(p1, p2)部分添加ncol=2即可(例如arrangeGrob(p1, p2, ncol=2))。 - smillig
更新了我的回答,将所有的图表放在一行。 - Didzis Elferts
3
您无需手动猜测图例的宽度:https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs - baptiste

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接