es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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 llamado legend_df para incluir solo los datos necesarios para la leyenda. Este data frame está agrupado por carb y vs y se resume.

    Luego modificamos la función ggplot de la siguiente manera:
    – Agregamos las estéticas fill = factor(carb) y shape = factor(vs) tanto a geom_boxplot como a geom_point.
    – Eliminamos el argumento outlier.shape de geom_boxplot.
    – Establecemos shape = 1 en geom_point con una estética fill basada en carb.
    – Agregamos scale_fill_discrete y scale_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.

Comments are closed.