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
2 ответа
Решение
Вы могли бы использовать gtable
пакет для гибких и удобных макетов сетки, или просто вложите два упорядоченных гроба,
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)
Вот альтернативный способ использования 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))