Выровняйте края картограммы ggplot (название легенды варьируется)

Я пытаюсь выровнять левый и правый края 4-х картограмм ggplot, используя этот метод. Я не могу сделать это, хотя.

Исходный сюжет:

library(ggplot2); library(gridExtra)
crimes <- data.frame(state = tolower(rownames(USArrests)), USArrests)
states_map <- map_data("state")
plot1 <- ggplot(crimes, aes(map_id = state)) +
    geom_map(aes(fill = Murder), map = states_map) +
    expand_limits(x = states_map$long, y = states_map$lat) + 
    scale_fill_gradient(low="white", high="darkgreen", name="Really Long Name 1")


plot2 <- plot1 + scale_fill_gradient(name="Really Long Name 2 and then some")
plot3 <- plot1 + scale_fill_gradient(name="Short 3") 
plot4 <- plot1 + scale_fill_gradient(name="Really Long Name 4")

grid.arrange(plot1, plot3, plot2, plot4, ncol = 2)

Попытка выровнять края графика (тот же результат):

p1 <- ggplotGrob(plot1)
p2 <- ggplotGrob(plot2)
p3 <- ggplotGrob(plot3)
p4 <- ggplotGrob(plot4)

maxWidth <- grid::unit.pmax(p1$widths[2:3], p2$widths[2:3], p3$widths[2:3], p4$widths[2:3])
p1$widths[2:3] <- as.list(maxWidth)
p2$widths[2:3] <- as.list(maxWidth)
p3$widths[2:3] <- as.list(maxWidth)
p4$widths[2:3] <- as.list(maxWidth)

grid.arrange(p1, p3, p2, p4, ncol = 2) 

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

PS: Предположим, мне нужно использовать сетку, а легенды на самом деле не одного масштаба, поэтому facet_grid отсутствует и т. д.


person Tyler Rinker    schedule 04.07.2013    source источник
comment
Если проблема заключается только в заголовке легенды, рассматривали ли вы возможность размещения его горизонтально вверху или внизу? т.е. plot1 + theme(legend.position='bottom', legend.direction='horizontal')   -  person MrGumble    schedule 04.07.2013
comment
как было предложено в комментариях к ссылке, которую вы разместили, вы, вероятно, хотели использовать widths[2:5] повсюду, чтобы включить легенду в сравнение единиц. Обратите внимание, что это приведет к тому же центрированию легенды, что и в первом ответе @kohske, потому что направляющая grob центрируется в выделенном окне просмотра.   -  person baptiste    schedule 04.07.2013
comment
Я попробовал widths[2:5], и это привело к очень странным размещениям.   -  person Tyler Rinker    schedule 04.07.2013
comment
Я солгал, это работает. @Baptise, можете ли вы предоставить это в качестве ответа для будущих искателей?   -  person Tyler Rinker    schedule 04.07.2013
comment
я отредактировал исходный пост, поэтому лучше закрою ваш вопрос как дубликат :)   -  person baptiste    schedule 04.07.2013
comment
Это может быть разумно, но мы потеряем ответ Коске, если он не передаст его туда.   -  person Tyler Rinker    schedule 04.07.2013


Ответы (2)


Вот пример:

library(gtable)
grid.draw(cbind(rbind(p1, p2, size="last"), rbind(p3, p4, size="last"), size = "first"))

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


Обновлено

Это плохой хак, поэтому я не рекомендую использовать. Вероятно, в будущем это не сработает.

gt <- cbind(rbind(p1, p2, size="last"), rbind(p3, p4, size="last"), size = "first")
for (i in which(gt$layout$name == "guide-box")) {
  gt$grobs[[i]] <- gt$grobs[[i]]$grobs[[1]]
}
grid.draw(gt)

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

person kohske    schedule 04.07.2013
comment
+1 Хорошее решение. Интересно, можно ли и легенды выровнять, чтобы увеличивалось только пространство справа от графиков. - person Sven Hohenstein; 04.07.2013
comment
ой, gt это gt <- cbind(rbind(p1, p2, size="last"), rbind(p3, p4, size="last"), size = "first")) - person kohske; 04.07.2013
comment
Итак, позвольте мне попытаться понять: gt$grobs[[i]] - это gtable, но каким-то образом он просто обертывает другую gtable фактическими гробами, а дочерняя gtable находится в центре своего контейнера? - person baptiste; 04.07.2013
comment
@baptiste точно, gtable из gtable создает окно просмотра оболочки во время рисования. Это плохой хак, и теперь Пол реализовал новый хук grid::makeContext. Возможно, было бы лучше переписать некоторые части gtable. Вы можете найти наши усилия здесь: rpubs.com/kohske/815 . - person kohske; 04.07.2013
comment
да, я, к сожалению, забыл многое из этого обсуждения с прошлого года, и с тех пор, похоже, статус-кво остался прежним. Кстати, Пол Мюррелл переписал gtable, используя свои новые функции (см. его форк на github), но я не уверен, что это будет означать для существующей части руководств. - person baptiste; 04.07.2013
comment
Обратите внимание, что это будет частью будущего записи в блоге. проводка. Если у кого-то есть что добавить по сюжету (особенно финальному), пишите на @[email protected] - person Tyler Rinker; 04.07.2013

Использование пакета cowplot:

library(cowplot)
plot_grid(plot1, plot3, plot2, plot4, ncol = 2, align = "v")

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

person zx8754    schedule 01.10.2015