Combine e mescle legendas em ggplot2 com patchwork (dados discretos / categóricos)
Organizei 3 gráficos ggplot2 em uma única figura usando a funcionalidade de patchwork de pacote . Tentei coletar as lendas e elas apareceram uma ao lado da outra. Mesmo assim, são três lendas distintas e eu esperava uma única lenda. Então, como posso mesclar as legendas que contêm valores idênticos da mesma variável de fator em uma única legenda?
Notas:
- E eu não quero remover as legendas de plotagens separadas usando, por exemplo,
theme(legend.position = "none")no caso de algum nível de fator adicional aparecer. Espero solução específica de patchwork . - Uma pergunta semelhante foi respondida em Combine and merge legends in ggplot2 com patchwork, mas os dados eram contínuos. E, no meu caso, tenho dados categóricos.
O código:
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")
Criado em 2020-10-14 pelo pacote reprex (v0.3.0)
Atualizar
Tentei usar os mesmos mapeamentos estéticos ( fill = Speciese color = Species) propostos nos comentários abaixo, mas não surtiu efeito:
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")
Criado em 2020-10-14 pelo pacote reprex (v0.3.0)
Respostas
Infelizmente, definir o mesmo aes é apenas uma condição. patchwork unirá legendas somente se forem idênticas. Portanto, temos que garantir que as legendas sejam as mesmas para cada parcela. Para este fim, eu adicionar uma guidescamada que faz o olhar de cada legenda o mesmo, definindo color, shape, sizee alpha. Além disso, temos que escolher o mesmo glifo para cada geom usando o argumento key_glyph. Após esses ajustes, as três legendas são mescladas em uma.
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")