R 'cowplot' аккуратно создает сеточный сюжет с общими (общими) легендами и уникальными легендами

Смотрите мой связанный вопрос и принятый ответ здесь.

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

В частности, я хочу сетку из 3 строк и 1 столбца с 1 графиком в каждой строке. Как это:

Который был произведен со следующим кодом:

  library (ggplot2)
  library(gridExtra)
  library (grid)
  library(cowplot)


   diamonds2 <- diamonds[sample(nrow(diamonds), 500), ]

   # 3 ggplot plot objects with multiple legends 1 common legend and 3 unique legends

  p1<- ggplot(diamonds2, aes(x=price, y= depth, color= clarity , shape= cut )) +
geom_point(size=5) + labs (shape = "unique legend", color = "common legend")

  p2 <- ggplot(diamonds2, aes(x=price, y= depth, color= clarity , shape=   color )) +
geom_point(size=5) + labs (shape = "unique legend", color = "common legend")

  p3 <- ggplot(diamonds2, aes(x=price, y= depth, color= clarity , shape= clarity )) +
geom_point(size=5) + labs (shape = "unique legend", color = "common legend")

  cowplot::plot_grid(
  cowplot::plot_grid(
  p1 + scale_color_discrete(guide = FALSE),
  p2 + scale_color_discrete(guide = FALSE),
  p3 + scale_color_discrete(guide = FALSE),
  nrow=3, ncol = 1))

Но с общей легендой, которая относится к color = аргумент каждого сюжета объекта.

Я пробовал много вариантов приведенного ниже кода и добавил / скорректировал / удалил различные аргументы / параметры в консультации с cowplot документацию, но я не могу получить аккуратный график, подобный приведенному выше, с общей легендой внизу (или где-нибудь полезным!) - все, что я пробовал, возвращает переполненный график, как показано ниже.

Адаптация приведенного выше кода для включения общей легенды:

  cowplot::plot_grid(
   cowplot::plot_grid(
    p1 + scale_color_discrete(guide = FALSE),
    p2 + scale_color_discrete(guide = FALSE),
    p3 + scale_color_discrete(guide = FALSE),
    nrow=3, ncol = 1
   ),
   cowplot::get_legend(p1 + scale_shape(guide = FALSE) +   theme(legend.position = "bottom")), nrow=3)

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

Кто-нибудь может подсказать, где я могу пойти не так?

1 ответ

Решение

Каждый звонок plot_grid разбивает вашу область построения. Здесь вы вкладываете два вызова plot_grid, и вы просите 3 строки в каждой. cowplot поэтому разделяет область построения на две равные части:

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

Вы можете указать относительную высоту каждой области построения, предоставляя больше места для точечных диаграмм и меньше места для легенды внизу. Например, для 85% сюжетов и 15% легенд:

cowplot::plot_grid(
   cowplot::plot_grid(
    p1 + scale_color_discrete(guide = FALSE),
    p2 + scale_color_discrete(guide = FALSE),
    p3 + scale_color_discrete(guide = FALSE),
    ncol = 1, align = "v"
   ),
   cowplot::get_legend(p1 + scale_shape(guide = FALSE) + 
      theme(legend.position = "bottom")),
   ncol=1, rel_heights=c(.85, .15))

который производит:

Другие вопросы по тегам