Как я могу выровнять несколько графиков по их названиям, а не по площади графика?

Я использую egg для выравнивания нескольких графиков на странице . Мне интересно, можно ли выровнять два столбца по заголовкам a) и c) вместо области графика? Спасибо!

Код:

library(egg)
library(grid)

p1 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
  geom_point() + ggtitle("a)")
p1

p2 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
  geom_point() + facet_wrap(~ cyl, ncol = 2, scales = "free") +
  guides(colour = "none") +
  theme() + ggtitle("b)")
p2

p3 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
  geom_point() + facet_grid(. ~ am, scales = "free") + guides(colour="none") +
  ggtitle("c)")
p3

g1 <- ggplotGrob(p1)

g2 <- ggplotGrob(p2)

g3 <- ggplotGrob(p3)

fg1 <- gtable_frame(g1, debug = TRUE)
fg2 <- gtable_frame(g2, debug = TRUE)
fg12 <- gtable_frame(gtable_rbind(fg1, fg2),
                     width = unit(2, "null"),
                     height = unit(1, "null"))
fg3 <-
  gtable_frame(
    g3,
    width = unit(2, "null"),
    height = unit(1, "null"),
    debug = TRUE
  )
grid.newpage()
combined <- gtable_cbind(fg12, fg3)
grid.draw(combined)  

Сюжет:

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


person Tung    schedule 06.12.2017    source источник


Ответы (2)


Я нашел другой способ, используя пакет cowplot

left_col <- cowplot::plot_grid(p1 + ggtitle(""), p2 + ggtitle(""), 
                               labels = c('a)', 'b)'), label_size = 14,
                               ncol = 1, align = 'v', axis = 'lr') 
cowplot::plot_grid(left_col, p3 + ggtitle(""), 
                   labels = c('', 'c)'), label_size = 14,
                   align = 'h', axis = 'b')

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

См. Также здесь

Изменить:

Недавно разработанный пакет patchwork для ggplot2 также может выполнить эту работу.

library(patchwork)

{
  p1 + {p2} + patchwork::plot_layout(ncol = 1)
} / p3 + patchwork::plot_layout(ncol = 2)

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

person Tung    schedule 06.12.2017
comment
Ваш левый столбец в решении коровьего графика не полностью выровнен. Я думаю, что ему нужно axis = 'lr' вместо axis = 'r', но я не пробовал это делать. - person Claus Wilke; 07.12.2017

Добавление пустой фиктивной переменной фасетирования к графику p1 / a) кажется самым простым решением.

p1 <- ggplot(data.frame(mtcars, dummy=''), 
             aes(mpg, wt, colour = factor(cyl))) +
  geom_point() + ggtitle("a)") +
  facet_wrap(~dummy)

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

person arvi1000    schedule 06.12.2017
comment
Огромное спасибо за помощь! Это довольно умный способ сделать это. Однако я ищу более общее решение. Смотрите ответ, который я только что нашел - person Tung; 06.12.2017