R 'ggplot2' Организация общих и уникальных легенд с несколькими (сеточными) объектами сюжета.

редактировать - воспроизводимый пример включен ниже

Я использовал эту функцию с пакетом ggplot2, чтобы добавить общую легенду для комбинированных ggplots, которая отлично работает, когда на каждом графике есть только 1 тип легенды, например, для ...,color =, ...,

Тем не менее, я пытаюсь организовать несколько сюжетов, которые имеют общую легенду, но у каждого есть дополнительная уникальная легенда, например:

  ggplot(df1, aes(x=Site, y=RESULT, color=Position , shape=DETNAME)) +
        geom_point(size=5) + ylab ("concentration (mg/L)") +
        labs (shape = "Determinand")

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

У меня есть три раза, где легенда позиции является общей, но легенды Determinand уникальны.

Поэтому я хочу знать, есть ли дополнительный аргумент, который я могу передать grid_arrange_shared_legend() которая сохранит детерминант и легенды (shape = DETNAME то есть нанесение их над каждым графиком на сетке, используя что-то вроде legend.position = "top" но иметь общую легенду для позиции (color = position)

Я знаю, что могу добавить + guides(shape = FALSE ) к каждому объекту сюжета, а затем использовать grid_arrange_shared_legend() который дает мне общую легенду позиции, но я хочу добиться чего-то подобного, но с уникальной легендой Determinand для каждого сюжета:

Или кто-нибудь может посоветовать, какая часть исходного кода для grid_arrange_shared_legend() функция нуждается в редактировании, чтобы выполнить это?

редактировать - воспроизводимый пример

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

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

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

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

   # shared legend function

  grid_arrange_shared_legend <- function(..., ncol = length(list(...)), nrow     = 1, position = c("bottom", "right")) {

    plots <- list(...)
    position <- match.arg(position)
    g <- ggplotGrob(plots[[1]] + theme(legend.position = position))$grobs
    legend <- g[[which(sapply(g, function(x) x$name) == "guide-box")]]
    lheight <- sum(legend$height)
    lwidth <- sum(legend$width)
    gl <- lapply(plots, function(x) x + theme(legend.position="none"))
    gl <- c(gl, ncol = ncol, nrow = nrow)

    combined <- switch(position,
                 "bottom" = arrangeGrob(do.call(arrangeGrob, gl),
                                        legend,
                                        ncol = 1,
                                        heights = unit.c(unit(1, "npc") -  lheight, lheight)),
                       "right" = arrangeGrob(do.call(arrangeGrob, gl),
                                       legend,
                                       ncol = 2,
                                       widths = unit.c(unit(1, "npc") - lwidth, lwidth)))

    grid.newpage()
    grid.draw(combined)

    # return gtable invisibly
    invisible(combined)

    }

    grid_arrange_shared_legend (p1,p2)

С использованием grid_arrange_shared_legend() Функция здесь означает, что уникальная легенда верна только для одного из графиков сетки.

Вопрос Как сохранить (извлечь?) Уникальные легенды и расположить их над каждым графиком на сетке, но сохранить общую легенду внизу?

1 ответ

Решение

Я бы посоветовал использовать cowplot Вот. В этом случае проще всего объединить два plot_grid звонки, а затем получить легенду с get_legend:

library(ggplot2)

#reduce the number of points to plot
diamonds2 <- diamonds[sample(nrow(diamonds), 500), ]

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

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

cowplot::plot_grid(
  cowplot::plot_grid(
    p1 + scale_color_discrete(guide = FALSE),
    p2 + scale_color_discrete(guide = FALSE),
    align = 'h'
  ),
  cowplot::get_legend(p1 + scale_shape(guide = FALSE) + theme(legend.position = "bottom")),
  nrow = 2, rel_heights = c(4, 1)
)

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