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.

¿Por qué ggplot solo está rellenando algunas de mis barras apiladas y no otras?

Estoy haciendo un gráfico de barras apiladas utilizando ggplot, pero por alguna razón, sigue dejando 2 barras sin llenar a pesar de llenar otras utilizando los mismos criterios. ¿Por qué está ocurriendo esto y cómo puedo evitar que suceda?

biblioteca(ggplot2)
biblioteca(dplyr)
biblioteca(scales)

Código para replicar:
“`
data <- tibble(team = factor(c(rep(“Equipo 1”, 10), rep(“Equipo 2”, 10), rep(“Equipo 3”, 10), rep(“Equipo 4”, 10)), levels = c(“Equipo 1”, “Equipo 2”, “Equipo 3”, “Equipo 4”)),
state = factor(c(rep(c(“Ganado”, “Empatado”,
“Repetido”, “Pospuesto”, “Forfeit”,
“Perdido”, “Retirado”, “En curso”,
“Indeterminado”, “Desconocido”), 4)), levels = c(“Ganado”, “Empatado”,
“Repetido”, “Pospuesto”, “Forfeit”,
“Perdido”, “Retirado”, “En curso”,
“Indeterminado”, “Desconocido”)),
count = c(1920, 80, 241, 5, 310, 99, 2, 127, 20, 33,
48, 1, 8, 0, 11, 3, 0, 4, 3, 3,
140, 5, 8, 0, 17, 2, 0, 5, 3, 7,
477, 20, 59, 1, 106, 1, 0, 33, 7, 10))

data <- data %>%
group_by(team) %>%
mutate(percentage = round((count/sum(count, na.rm = TRUE)), 2))

data %>%
ggplot(aes(fill= state, y = percentage, x = team)) +
geom_col(position=”stack”, width = 0.4) +
coord_flip() +
scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = c(0, 1)) +
geom_text(aes(label = scales::percent(percentage, accuracy = 1)),
position = position_stack(vjust = .5),
check_overlap = TRUE )
~~~~~

Aquí tienes cómo se ve; el 75% flotante y el 59% para el Equipo 3 y el Equipo 2, respectivamente, deberían estar en el color salmón que se utiliza para los Equipos 4 y 1. Sé que no es un error tipográfico porque estoy utilizando el mismo título para cada uno.

Enlace de imagen

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón por la que las barras del 75% y 59% para el Equipo 3 y el Equipo 2, respectivamente, no se están llenando en el gráfico de barras apiladas se debe a que no hay filas en los “datos” para esos equipos con un “estado” de “Pospuesto” o “Retirado”, que son las dos categorías que faltan en esas barras. Por lo tanto, no hay nada para llenar esas barras.

    Para evitar que esto suceda, asegúrese de que cada “equipo” tenga al menos una fila con cada valor posible de “estado”, incluso si el recuento es cero. Puede hacer esto creando un nuevo conjunto de datos con todas las combinaciones posibles de “equipo” y “estado” y fusionándolo con sus “datos” usando “left_join”.

    Aquí tienes un ejemplo de implementación:

    # Crear un nuevo tibble con todas las combinaciones posibles de equipo y estado
    all_combinations <- expand.grid(
      equipo = levels(datos$equipo),
      estado = levels(datos$estado)
    )
    
    # Fusionar con los datos originales utilizando left_join y rellenar NA con 0
    datos_rellenados <- all_combinations %>%
      left_join(datos, by = c("equipo", "estado")) %>%
      mutate(cantidad = ifelse(is.na(cantidad), 0, cantidad))
    
    # Recalcular la columna de porcentaje
    datos_rellenados <- datos_rellenados %>%
      group_by(equipo) %>%
      mutate(porcentaje = round(cantidad / sum(cantidad), 2))
    
    # Graficar los datos rellenados
    ggplot(datos_rellenados, aes(fill = estado, y = porcentaje, x = equipo)) + 
      geom_col(position = "stack", width = 0.4) +
      coord_flip() +
      scale_fill_brewer(palette = "Set1") +
      scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = c(0, 1)) +
      geom_text(aes(label = scales::percent(porcentaje, accuracy = 1)),
                position = position_stack(vjust = 0.5),
                check_overlap = TRUE)
    

    Esto debería crear un gráfico de barras apiladas con todas las barras llenas, incluso si no hay recuentos para ciertas categorías.

Comments are closed.