Ggplot2: Grid overlay with fewer graphs than viewports

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 ) 

I would like to focus the bottom two plots. How can I do that? I can do this with split.screen , but I can't figure out how to do this with ggplot2 . ggplot2 has ggplot2 graphics.

Thanks in advance!

PC

+8
r ggplot2 gridextra gtable
source share
2 answers

You can use the gtable package for flexible and convenient grid layouts or just nest two conventions,

 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


Edit: in order for the lower charts to cover the entire width, you just need to remove the dummy nullGrobs () in the solution above:

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

enter image description here

+12
source share

Here's an alternative way to use 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) 

Edit: in order for the lower charts to cover the entire width, you just need to change the corresponding l and r indices,

 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)) 
+7
source share

All Articles