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

Я пытаюсь выровнять левый и правый края карт choropleth из 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) 

enter image description here

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

Ответ 1

Вот пример:

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

enter image description here


Обновление

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

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)

enter image description here

Ответ 2

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

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

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