【问题标题】:ggplot2: multiple plots with different variables in a single row, single grouping legendggplot2:在单行中具有不同变量的多个图,单个分组图例
【发布时间】:2013-06-06 13:15:40
【问题描述】:

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

情况

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

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 函数):

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

我发现的另一个潜在解决方案是包gridExtra,带有这个code example。它几乎可以满足我的需求,只是图表是垂直排列的。我尝试使用函数参数,但不知道如何水平排列图。希望有人对该软件包/问题有更多经验。谢谢!

【问题讨论】:

标签: r ggplot2


【解决方案1】:

这是使用包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)))

更新

将所有地块放在同一行:

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

【讨论】:

  • 谢谢你,Didzis。不幸的是,这不是我需要的。这是gridExtra 包的示例中提到的解决方案(至少它具有相同的结果)。我需要的是让这些图表和图例水平排列,而不是垂直排列。您能否修改grid.arrange() 调用来实现这一点?谢谢。
  • 只需将ncol=2 添加到代码的arrangeGrob(p1, p2) 部分即可。 (例如arrangeGrob(p1, p2, ncol=2))。
  • 更新了我的答案,将所有图放在一行中。
  • 您不必手动猜测图例宽度:github.com/hadley/ggplot2/wiki/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 2023-01-26
  • 2021-01-15
  • 1970-01-01
相关资源
最近更新 更多