20

我正在尝试使用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 轴的长度)在图表中保持不变。

我知道我可以在这里使用构面,但我还需要组合各种图表,(我认为)使用构面很难实现..

有可能做到grid.arrange吗?还有其他可以帮助的解决方案吗?

4

3 回答 3

27

试试这个,它使用cbind.gtable

grid.draw(cbind(ggplotGrob(p3), ggplotGrob(p2), size="last"))

在此处输入图像描述

于 2013-05-03T21:58:20.000 回答
12

不像@Josh 的解决方案那样优雅简单,但您可以使用 grid.arrange 来做到这一点,它允许您保留或指定绘图的纵横比,但您需要tableGrob为您的图例制作一个。我在这里回答了一个类似的问题,在这里我得到了从 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()

在此处输入图像描述

于 2013-05-03T22:22:25.603 回答
2

我想我会更新这个线程,因为grid.arrange现在有这个功能:

grid.arrange(p3, p2, ncol = 2, widths = c(1,1.2))

同样大小的面板

于 2020-03-27T09:56:46.617 回答