Проблемы с общей легендой в R - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь объединить легенды из серии из 22 сюжетов, но я просто не могу заставить ее работать.

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

Итак, последняя легенда показывает только легенду моего первого сюжета (в котором есть данные только за 2 месяца), и у меня нет другого сюжета с данными за все месяцы, которые будут использоваться для завершения легенды.,

Есть ли способ это исправить?

Попытка: ggarrange (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, ncol = 6, nrow = 4, common.legend = TRUE, legend = "bottom")

https://oregonstate.box.com/s/gxgo93mpva9wdx9lcfem26cer8ixpcs8

1 Ответ

0 голосов
/ 02 мая 2019

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

Недавно я увидел нечто подобное и сумел решить не очень изящно.

  1. Выполните организацию всех ваших сюжетов без легенды.

От 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" ( ссылка ).

  1. Вам необходимо создать объект (objx), чтобы у него был самый сложный заголовок, охватывающий все ваши достопримечательности. Для этого объекта вы должны получить заголовок, используя пакет cowplot с функцией get_legend ( link ).
objx <- ggplot2::ggplot(df) + 
                 ... +
              theme(legend.position = "bottom")

legend <- cowplot::get_legend(objx) 
  1. Как только это будет сделано, нужно только объединить интересующие вас объекты, сюжет (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 

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

...