ggplot2:少于视口数量的网格绘图

8
library( ggplot2 )
library( gridExtra )
p1 <- qplot( rnorm( 10 ), rnorm( 10 ) )
p2 <- qplot( rnorm( 10 ), rnorm( 10 ) )
p3 <- qplot( rnorm( 10 ), rnorm( 10 ) )
p4 <- qplot( rnorm( 10 ), rnorm( 10 ) )
p5 <- qplot( rnorm( 10 ), rnorm( 10 ) )
grid.arrange( p1, p2, p3, p4, p5, nrow=2 )

我想把下面的两个图居中。怎样才能做到呢?我可以使用split.screen来实现,但我不知道如何使用ggplot2来实现。 ggplot2有更酷炫的图形。
提前感谢!
PK
2个回答

12

你可以使用gtable包来实现灵活且方便的网格布局,或者直接嵌套两个arrangeGrobs

ng = nullGrob()
grid.arrange(arrangeGrob(p1, p2, p3, nrow=1),
             arrangeGrob(ng, p4, p5, ng, nrow=1, widths=c(0.5, 1, 1, 0.5)),
             nrow=2)

输入图片描述


编辑:如果你想让底部的绘图横跨整个宽度,你只需要在上面的解决方案中删除虚拟的nullGrobs()。

grid.arrange(arrangeGrob(p1, p2, p3, nrow=1),
             arrangeGrob(p4, p5, nrow=1),
             nrow=2)

这里输入图片描述


1
喜欢这个答案,但也很想看看你讨论的 gtable 答案。+1 - Tyler Rinker
谢谢。如果底部的图表填满空间会更好。 - polarise

7

以下是使用 gtable 的另一种方法:

library(gtable)
gtable_add_grobs <- gtable_add_grob #misleading name

g <- gtable(widths = unit(rep(1, 6), "null"), # need lcm(3,2)=6 for the matrix rows
            heights = unit(rep(1, 2), "null"))

#gtable_show_layout(g)

g <- gtable_add_grobs(g, lapply(list(p1, p2, p3, p4, p5), ggplotGrob),
                     t = c(1, 1, 1, 2, 2),
                     l = c(1, 3, 5, 2, 4),
                     r = c(2, 4, 6, 3, 5))

grid.newpage()
grid.draw(g)

编辑:为了使底部图表跨越整个宽度,您只需要修改相应的左侧和右侧索引位置。

g <- gtable_add_grobs(g, lapply(list(p1, p2, p3, p4, p5), ggplotGrob),
                      t = c(1, 1, 1, 2, 2),
                      l = c(1, 3, 5, 1, 4),
                      r = c(2, 4, 6, 3, 6))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接