Fusionando 2 leyendas de una manera específica.
Tengo un gráfico de mis datos que incluye tanto un diagrama de caja como un gráfico de puntos (datos de mtcars como ilustración).
{r}
ggplot(mtcars, aes(x = factor(cyl), y = mpg), fill = factor(carb), shape = factor(vs)) +
geom_boxplot(data = subset(mtcars, am == 1), aes(x = factor(cyl), y = mpg, fill = factor(carb), shape = factor(vs)), outlier.shape = NA, alpha = 0.85, width = .65, colour = "BLACK") +
geom_point(data = subset(mtcars, am == 1 & vs == 1), aes(x = factor(cyl), y = mpg, fill = factor(carb), shape = factor(vs)), outlier.shape = NA, size = 5, alpha = .4, shape = 1, colour = "BLACK", position = position_dodge(width = 0.65))
Mi objetivo es:
1) tener una sola leyenda en lugar de dos
2) que muestre todos los colores asociados con el relleno (basado en carb) y un solo elemento que explique a qué corresponden los círculos abiertos (es decir, vs == 1).
3) para ese único elemento (que corresponde a geom_point) mostrar un círculo abierto (correspondiente al círculo abierto en el gráfico) y no diagramas de caja como se muestra actualmente.
Cualquier ayuda será muy apreciada.
davy.ai
Para lograr los objetivos mencionados anteriormente, podemos modificar el código de la siguiente manera:
“`{r}
Crear una variable para distinguir entre un gráfico de puntos y un diagrama de caja
mtcars$plot_type <- ifelse(mtcars$am == 1 & mtcars$vs == 1, “Gráfico de Puntos”, “Diagrama de Caja”)
Crear un nuevo data frame que incluya solo las columnas necesarias para la leyenda
legend_df <- mtcars %>% filter(plot_type == “Gráfico de Puntos”) %>%
group_by(carb, vs) %>%
summarize()
Crear el gráfico y agregar los elementos necesarios
ggplot(mtcars, aes(x = factor(cyl), y = mpg, fill = factor(carb), shape = factor(vs))) +
geom_boxplot(data = subset(mtcars, am == 1), aes(fill = factor(carb), shape = factor(vs)),
outlier.shape = NA, alpha = 0.85, width = .65, colour = “NEGRO”) +
geom_point(data = subset(mtcars, am == 1 & vs == 1), aes(fill = factor(carb)),
shape = 1, size = 5, alpha = .4, colour = “NEGRO”,
position = position_dodge(width = 0.65)) +
scale_fill_discrete(name = “Carb”, labels = levels(factor(mtcars$carb))) +
scale_shape_discrete(name = “Vs”, labels = levels(factor(mtcars$vs))) +
guides(shape = guide_legend(title = “Leyenda”, override.aes = list(fill = “blanco”)),
fill = guide_legend(title = “Leyenda”)) +
labs(x = “Cyl”, y = “Mpg”) +
theme_bw()
“`
En el código anterior, primero creamos una nueva variable llamada
plot_type
para identificar si cada punto de datos corresponde a un gráfico de caja o un gráfico de puntos. Luego creamos un nuevo data frame llamadolegend_df
para incluir solo los datos necesarios para la leyenda. Este data frame está agrupado porcarb
yvs
y se resume.Luego modificamos la función
ggplot
de la siguiente manera:– Agregamos las estéticas
fill = factor(carb)
yshape = factor(vs)
tanto ageom_boxplot
como ageom_point
.– Eliminamos el argumento
outlier.shape
degeom_boxplot
.– Establecemos
shape = 1
engeom_point
con una estéticafill
basada encarb
.– Agregamos
scale_fill_discrete
yscale_shape_discrete
para especificar las etiquetas de las estéticas fill y shape.– Agregamos
guides
para especificar el título de la leyenda y anular las estéticas para la leyenda del gráfico de puntos.– Agregamos
labs
para etiquetar los ejes x e y.– Utilizamos
theme_bw
para establecer un tema de fondo simple en blanco y negro.Con estas modificaciones, deberíamos obtener una sola leyenda que muestre todos los colores asociados con el fill basado en
carb
y un solo elemento que explique a qué corresponden los círculos abiertos (es decir,vs == 1
). Los círculos abiertos deben aparecer en la leyenda y en el gráfico.