для лучшего понимания препятствий интересно, что вы приводите какой-то воспроизводимый пример, но по вашему тексту я думаю, что можно понять основы вашей проблемы.
Недавно я увидел нечто подобное и сумел решить не очень изящно.
- Выполните организацию всех ваших сюжетов без легенды.
От p1
до p22
с show.legend = FALSE
для каждой «строки» (nrow
) вашего набора сюжетов. Затем преобразуйте в grob
.
library(cowplot)
obj1 <- cowplot::plot_grid(p1, ..., p6, align = "hv", nrow = 1)
obj2 <- cowplot::plot_grid(p7, ..., p12, align = "hv", nrow = 1)
obj3 <- cowplot::plot_grid(p13, ..., p18, align = "hv", nrow = 1)
obj4 <- cowplot::plot_grid(p19, ..., p22, NULL, NULL, align = "hv", nrow = 1)
g1grob <- ggplot2::ggplotGrob(obj1)
g2grob <- ggplot2::ggplotGrob(obj2)
g3grob <- ggplot2::ggplotGrob(obj3)
g4grob <- ggplot2::ggplotGrob(obj4)
Вы можете продолжать использовать ggarrange
, но не обязательно помните, что вам нужно поделиться легендой. Я предлагаю наблюдать за функцией plot_grid
пакета cowplot
, используя аргумент align = "hv"
( ссылка ).
- Вам необходимо создать объект (
objx
), чтобы у него был самый сложный заголовок, охватывающий все ваши достопримечательности. Для этого объекта вы должны получить заголовок, используя пакет cowplot
с функцией get_legend
( link ).
objx <- ggplot2::ggplot(df) +
... +
theme(legend.position = "bottom")
legend <- cowplot::get_legend(objx)
- Как только это будет сделано, нужно только объединить интересующие вас объекты, сюжет (
obj
) и легенду (legend
).
lay <- rbind(c(1, 1, 1, 1, 1, 1),
c(2, 2, 2, 2, 2, 2),
c(3, 3, 3, 3, 3, 3),
c(4, 4, 4, 4, 4, 4))
plot_leila <- gridExtra::grid.arrange(g1grob, g2grob, g3grob, g4grob,
layout_matrix = lay)
lay <- rbind(c(rep(1,12)),
c(2))
plot_leila <- gridExtra::grid.arrange(plot_leila, legend,
layout_matrix = lay)
plot_leila
Возможны возможные смещения, но если вы будете терпеливы и протестируете пакеты, вы обязательно получите хороший результат.