Настройка поля для текста оси в ggplot2

Какое свойство в ggplot управляет
шириной (или количеством пустого пространства) текста оси?


В приведенном ниже примере моей конечной целью является «втолкнуть» левую часть верхнего графика так, чтобы он совпал с нижним графиком.

Я попробовал theme(plot.margin=..), но это влияет на поля всего графика.
facet тоже не помогает, так как масштабы по y разные.

В крайнем случае я понимаю, что могу изменить сам текст оси, но тогда мне также нужно будет вычислить разрезы для каждого графика.

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

Воспроизводимый пример:

library(ggplot2)
library(scales)

D <- data.frame(x=LETTERS[1:5],  y1=1:5, y2=1:5 * 10^6)

P.base <- ggplot(data=D, aes(x=x)) + 
            scale_y_continuous(labels=comma)

Plots <- list(
    short = P.base + geom_bar(aes(y=y1), stat="identity", width=.5)
  , long  = P.base + geom_bar(aes(y=y2), stat="identity", width=.5) 
  )

do.call(grid.arrange, c(Plots, ncol=1, main="Sample Plots"))

person Ricardo Saporta    schedule 10.03.2014    source источник
comment
grid.arrange не годится для выравнивания графиков, для этого всегда следует использовать gtable.   -  person baptiste    schedule 10.03.2014
comment
Спасибо @baptiste, кажется, это именно то, что я искал. Не стесняйтесь опубликовать свой собственный ответ. Кроме того, мне любопытно, почему rbind_gtable не является экспортируемой функцией?   -  person Ricardo Saporta    schedule 11.03.2014
comment
rbind.gtable экспортируется как метод, но вызывает эту функцию с Reduce для нескольких gtables. Либо так, либо у Хэдли слабость к символам подчеркивания.   -  person baptiste    schedule 11.03.2014


Ответы (1)


Вот одно из решений.

Идея была заимствована из "Наличие горизонтальных меток вместо вертикальных на фасетах 2x1 и разделение метки Y Определение функции

align_plots1 <- function (...) {
    pl <- list(...)
    stopifnot(do.call(all, lapply(pl, inherits, "gg")))
    gl <- lapply(pl, ggplotGrob)
    bind2 <- function(x, y) gtable:::rbind_gtable(x, y, "first")
    combined <- Reduce(bind2, gl[-1], gl[[1]])
    wl <- lapply(gl, "[[", "widths")
    combined$widths <- do.call(grid::unit.pmax, wl)
    grid::grid.newpage()
    grid::grid.draw(combined)
}

short <- P.base + geom_bar(aes(y=y1), stat="identity", width=.5)
long <- P.base + geom_bar(aes(y=y2), stat="identity", width=.5) 

#Now, align the plots
align_plots1(short, long)

Вот результат.

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

person Jd Baba    schedule 10.03.2014
comment
это полезно и хороший этикет - ссылаться на исходный вопрос, когда вы берете решение откуда-то еще. - person baptiste; 10.03.2014
comment
Спасибо за напоминание. Я забыл прикрепить ссылку, где я нашел это решение. Я добавил ссылку. - person Jd Baba; 10.03.2014