R 'Cowplot' аккуратно создает график с сеткой с общими (общими) легендами и уникальными легендами.

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

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

В частности, мне нужна сетка из 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)

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

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

Может ли кто-нибудь предложить, где я могу ошибаться?


person Tom Newton    schedule 20.10.2017    source источник


Ответы (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))

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

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

person sinQueso    schedule 20.10.2017
comment
Ах, теперь это очевидно. Очень понятно объяснил, спасибо. Я отредактировал ваш ответ, включив в него получившийся сюжет, надеюсь, вы не возражаете. - person Tom Newton; 20.10.2017