我正在尝试使用grid.arrange
排列多个图表。
它完成了本书的工作,并在致电时:
p1 <- ggplot(subset(mtcars, cyl = 4), aes(wt, mpg, colour = cyl)) + geom_point()
p2 <- ggplot(subset(mtcars, cyl = 8), aes(wt, mpg, colour = cyl)) + geom_point()
grid.arrange(p1, p2, ncol = 2)
我得到了两个很好的图,大小对称:
我的图表引用了不同的参数,但它们对组共享相同的颜色编码。所以我想删除除了一个以外的所有传奇,找到一个不错的地方。
然而,当我尝试:
p3 <- ggplot(subset(mtcars, cyl = 8), aes(wt, mpg, colour = cyl)) + geom_point() + guides(colour=FALSE)
grid.arrange(p3, p2, ncol = 2)
没有图例的情节得到(正确)更大:
我想保持大小(作为x轴的长度)在图表中保持不变。
我知道我可以在这里使用分面,但我还需要结合各种图表(我认为)很难用facet实现..
是否可以使用grid.arrange
执行此操作?还有其他任何有用的解决方案吗?
答案 0 :(得分:24)
试试这个,使用cbind.gtable
:
grid.draw(cbind(ggplotGrob(p3), ggplotGrob(p2), size="last"))
答案 1 :(得分:12)
不像@Josh的解决方案那么简单,但你可以使用grid.arrange来保存或指定图的宽高比,但是你需要为tableGrob
做一个你的传奇。我回答了一个类似问题here,这是我从ggplot2传奇制作tableGrob的方便代码:
## Make a tableGrob of your legend
tmp <- ggplot_gtable(ggplot_build(p2))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
# Plot objects using widths and height and respect to fix aspect ratios
# We make a grid layout with 3 columns, one each for the plots and one for the legend
grid.newpage()
pushViewport( viewport( layout = grid.layout( 1 , 3 , widths = unit( c( 0.4 , 0.4 , 0.2 ) , "npc" ) ,heights = unit( c( 0.45 , 0.45 , 0.45 ) , "npc" ) , respect = matrix(rep(1,3),1) ) ) )
print( p1 + theme(legend.position="none") , vp = viewport( layout.pos.row = 1 , layout.pos.col = 1 ) )
print( p2 + theme(legend.position="none") , vp = viewport( layout.pos.row = 1, layout.pos.col = 2 ) )
upViewport(0)
vp3 <- viewport( width = unit(0.2,"npc") , x = 0.9 , y = 0.5)
pushViewport(vp3)
grid.draw( legend )
popViewport()
答案 2 :(得分:1)
我认为我会更新此线程,因为grid.arrange
现在具有此功能:
grid.arrange(p3, p2, ncol = 2, widths = c(1,1.2))