虽然有些主题在同一个方向上进行,但我没有找到任何可以解决我的问题的具体方法。因此,一个新的主题,并提前感谢所有的帮助。
场合
我有两个图,需要水平放在一个图中,例如:
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。除了图表是垂直排列外,它几乎可以满足我的需要。我尝试使用函数参数,但无法想象如何水平排列图。希望有人对该包/问题有更多的经验。谢谢!
答案 0 :(得分: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")
现在你可以从第一个带有函数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)))