Комбинируйте и объединяйте легенды в ggplot2 с помощью пэчворка (дискретные / категориальные данные)

Я собрал 3 графика ggplot2 в одну фигуру, используя функциональные возможности пакета patchwork. Я попытался собрать легенды, и они появились одна за другой. Но все же это 3 отдельные легенды, и я ожидал, что это будет одна легенда. Итак, как я могу объединить легенды, содержащие идентичные значения одной и той же факторной переменной, в одну легенду?

Примечания:

  1. И я не хочу убирать легенды отдельных графиков, используя, например, theme(legend.position = "none") в случае появления некоторого дополнительного уровня фактора. Я ожидаю конкретного лоскутного решения.
  2. На аналогичный вопрос был дан ответ в Объедините и объедините легенды в ggplot2 с помощью пэчворка но данные были непрерывными. А в моем случае у меня есть категоричные данные.

Код:

library(ggplot2)
library(patchwork)

iris_1 <-
  ggplot(iris, aes(x = Sepal.Length, fill = Species, color = Species)) +
  geom_density(alpha = 0.3, adjust = 1.5)

iris_2 <-
  ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
  geom_point()

iris_3 <-
  ggplot(iris, aes(x = Species, y = Sepal.Width, fill = Species)) +
  geom_boxplot()


(iris_1 + iris_2 + iris_3) + plot_layout(guides = "collect")

Создано 14 октября 2020 г. пакетом REPEX (v0.3.0)


Обновить

Я попытался использовать те же эстетические сопоставления (fill = Species и color = Species), как это было предложено в комментариях ниже, но это не дало результата:

library(tidyverse)
library(patchwork)

iris_1 <-
  ggplot(iris, aes(x = Sepal.Length, color = Species, fill = Species)) +
  geom_density(alpha = 0.3, adjust = 1.5)

iris_2 <-
  ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, fill = Species)) +
  geom_point()

iris_3 <-
  ggplot(iris, aes(x = Species, y = Sepal.Width, color = Species, fill = Species)) +
  geom_boxplot(color = "black")

(iris_1 + iris_2 + iris_3) + plot_layout(guides = "collect")

Создано 14 октября 2020 г. пакетом REPEX (v0.3.0)


person GegznaV    schedule 13.10.2020    source источник
comment
Это связано с тем, что вы установили несовместимые значения заливки и цвета между графиками - если вы добавите fill = Species и color = Species ко всем графикам, лоскутное одеяло должно иметь возможность собирать легенды.   -  person mlcyo    schedule 14.10.2020
comment
@mlcyo, у меня не сработало. Работает ли это для вас? (См. Обновленный вопрос). Может быть, я сделал что-то другое, чем вы предложили?   -  person GegznaV    schedule 14.10.2020


Ответы (1)


К сожалению, установка одинаковых значений AES - это только одно условие. лоскутное шитье объединит легенды только в том случае, если они идентичны. Поэтому мы должны сделать так, чтобы легенды были одинаковыми для каждого сюжета. Для этого я добавляю слой guides, который делает вид каждой легенды одинаковым, устанавливая color, shape, size и alpha. Кроме того, мы должны выбрать один и тот же глиф для каждой геометрии, используя аргумент key_glyph. После этих корректировок три легенды сливаются в одну.

library(ggplot2)
library(patchwork)

g <- guides(fill = guide_legend(override.aes = list(color = scales::hue_pal()(3),
                                                    shape = c(16, 16, 16), 
                                                    size = c(1, 1, 1),
                                                    alpha = c(1, 1, 1)),))

iris_1 <-
  ggplot(iris, aes(x = Sepal.Length)) +
  geom_density(aes(fill = Species, color = Species), key_glyph = "point", alpha = 0.3, adjust = 1.5) +
  g

iris_2 <-
  ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point(aes(fill = Species, color = Species), key_glyph = "point") +
  g

iris_3 <-
  ggplot(iris, aes(x = Species, y = Sepal.Width)) +
  geom_boxplot(aes(fill = Species, color = Species), key_glyph = "point") +
  scale_color_manual(values = c("black", "black", "black")) +
  g


(iris_1 + iris_2 + iris_3) + plot_layout(guides = "collect")

person stefan    schedule 14.10.2020