9

虽然有一些主题朝着相同的大方向发展,但我还没有找到任何可以专门解决我的问题的主题。因此,一个新的话题,并提前感谢所有的帮助。

情况

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

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带有此代码示例的包。它几乎可以满足我的需求,只是图表是垂直排列的。我尝试使用函数参数,但不知道如何水平排列图。希望有人对该软件包/问题有更多经验。谢谢!

4

1 回答 1

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 借来的函数的第一个情节中得到图例对这个问题的回答。

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

在此处输入图像描述

更新

要将所有图放在同一行:

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

在此处输入图像描述

于 2013-06-06T13:30:44.480 回答