2013-05-28 41 views
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有更酷的圖形。ggplot2:繪製在比視口少的地塊上的網格

在此先感謝!

PK

回答

12

您可以使用gtable包靈活方便的網格佈局,或者乾脆窩2個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) 

enter image description here


編輯:對於底部繪製爲跨越整個寬度,您只需刪除上面的虛擬nullGrobs()解決方案:

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

enter image description here

+1

喜歡答案,但會有興趣看到t他也會討論你的問題。 +1 –

+0

謝謝。如果底部的地塊填滿了空間,會更好。 – polarise

+0

非常好!那裏有個答案... – 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) 

編輯:對於底部曲線跨越整個寬度,你只需要改變相應的L和R指數,

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))