Combinar y fusionar leyendas en ggplot2 con patchwork (datos discretos / categóricos)

Oct 14 2020

Arreglé 3 parcelas de ggplot2 en una sola figura usando la funcionalidad de patchwork de paquetes . Traté de recopilar las leyendas y aparecieron una al lado de la otra. Pero aún así, son 3 leyendas separadas y esperaba una sola leyenda. Entonces, ¿cómo puedo fusionar las leyendas que contienen valores idénticos de la misma variable de factor en una sola leyenda?

Notas:

  1. Y no quiero eliminar las leyendas de gráficos separados usando, por ejemplo, theme(legend.position = "none")en caso de que aparezca algún nivel de factor adicional. Espero una solución específica de patchwork .
  2. Se respondió una pregunta similar en Combinar y fusionar leyendas en ggplot2 con mosaico, pero los datos fueron continuos. Y en mi caso, tengo datos categóricos.

El 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")

Creado el 14/10/2020 por el paquete reprex (v0.3.0)


Actualizar

Intenté usar las mismas asignaciones estéticas ( fill = Speciesy color = Species) que se propusieron en los comentarios a continuación, pero no tuvo ningún efecto:

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")

Creado el 14/10/2020 por el paquete reprex (v0.3.0)

Respuestas

1 stefan Oct 14 2020 at 17:03

Desafortunadamente, establecer las mismas aes es solo una condición. patchwork fusionará leyendas solo si son idénticas. Por lo tanto, debemos asegurarnos de que las leyendas sean las mismas para cada trama. Con este fin agrego una guidescapa que hace que el aspecto de cada leyenda de la misma mediante el establecimiento color, shape, sizey alpha. Además, tenemos que elegir el mismo glifo para cada geom usando argumento key_glyph. Después de estos ajustes, las tres leyendas se fusionan en una.

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")