ggplot2: построение на сетке с меньшим количеством графиков, чем видовых экранов

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


person polarise    schedule 28.05.2013    source источник


Ответы (2)


Вы можете использовать пакет 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)

введите здесь описание изображения

person baptiste    schedule 28.05.2013
comment
Мне понравился ответ, но было бы интересно увидеть ответ gtable, который вы обсуждали. +1 - person Tyler Rinker; 28.05.2013
comment
Спасибо. Было бы лучше, если бы нижние участки заполняли пространство. - person polarise; 28.05.2013

Вот альтернативный способ использования 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))
person baptiste    schedule 28.05.2013