27.4 Diagrama de barras para dos variables

Observe que la variable desemp_ingles es categórica ordinal:

table(saber$desemp_ingles)
## 
##   A-   A1   A2   B1   B+ 
## 2759 1492  814  329   68

Se pueden usar las barras para presentar la frecuencia de una variable, según dos variables categóricas.

Se usa la opción fill para incorporar la segunda variable:

ggplot(data = saber) + 
  aes(x= fami_estratovivienda, fill = desemp_ingles) +
  geom_bar() +
  labs(title = "Frecuencia por estrato", 
       x = "Estrato", y = "Frecuencia", fill = "Desempeño
inglés", caption = "Fuente: ICFES 2019") 
Barras apiladas.

Figura 27.1: Barras apiladas.

Ya se ha indicado que las barras apiladas (stacked bars) no suelen ser una buena opción, pero es la que genera por defecto.

Observe que la leyenda va de A- en color oscuro en la parte superior a B+ en color claro en la parte inferior. No es intuitivo. En nuestra cultura los colores más oscuros implican mayor cantidad o intensidad y el desempeño en inglés es más alto en B+. Hay que reversar los colores.

Actualmente la variable es categórica ordinal. ¿En qué orden?

levels(saber$desemp_ingles)
## [1] "A-" "A1" "A2" "B1" "B+"

Hay que reversar el orden:

saber$desemp_ingles %<>% factor(levels = rev(levels(saber$desemp_ingles)),
                                ordered = TRUE)
levels(saber$desemp_ingles)
## [1] "B+" "B1" "A2" "A1" "A-"
ggplot(data = saber) + 
  aes(x= fami_estratovivienda, fill = desemp_ingles) +
  geom_bar() +
  labs(title = "Frecuencia por estrato", 
       x = "Estrato", y = "Frecuencia", fill = "Desempeño
inglés")
Barras apiladas con dirección de la leyenda corregida.

Figura 27.2: Barras apiladas con dirección de la leyenda corregida.

Ahora es más intuitiva la lectura de la leyenda, en la misma dirección que los colores, y éstos de claro a más oscuro. Pero no necesariamente es fácil su lectura para todo tipo de público.

La paleta de colores se puede cambiar con una capa adicional:

ggplot(data = saber) + 
  aes(x= fami_estratovivienda, fill = desemp_ingles) +
  geom_bar() +
  scale_fill_brewer(palette = "Blues") +
  labs(title = "Frecuencia por estrato", 
       x = "Estrato", y = "Frecuencia", fill = "Desempeño
inglés", caption = "Fuente: ICFES 2019")
Barras apiladas con paleta predefinida pero seleccionada.

Figura 27.3: Barras apiladas con paleta predefinida pero seleccionada.

Como se observa, se utilizó la paleta de azules de la escala Brewer. La leyenda está en el orden deseado, pero no la saturación del tono azul. Se debe indicar la dirección:

ggplot(data = saber) + 
  aes(x= fami_estratovivienda, fill = desemp_ingles) +
  geom_bar() +
  scale_fill_brewer(palette = "Blues", direction = -1) +
  labs(title = "Frecuencia por estrato", 
       x = "Estrato", y = "Frecuencia", fill = "Desempeño
inglés", caption = "Fuente: ICFES 2019")
Barras apiladas con paleta predefinida pero seleccionada y dirección de leyenda corregida.

Figura 27.4: Barras apiladas con paleta predefinida pero seleccionada y dirección de leyenda corregida.

La paleta se puede configurar de manera manual:

ggplot(data = saber) + 
  aes(x= fami_estratovivienda, fill = desemp_ingles) +
  geom_bar() +
  scale_fill_manual(values = c("A-" = "#eaeccc",
                               "A1" = "#feda8b",
                               "A2" = "#fdb366",
                               "B1" = "#f67e4b",
                               "B+" = "#dd3d2d"),
                    breaks = c("B+","B1","A2","A1","A-"),
                    name   = "Desempeño Inglés") +
  labs(title = "Frecuencia por estrato", 
       x = "Estrato", y = "Frecuencia", fill = "Desempeño
inglés", caption = "Fuente: ICFES 2019")
Barras apiladas con paleta a voluntad.

Figura 27.5: Barras apiladas con paleta a voluntad.

El orden de los breaks indica el orden de la leyenda, de arriba hacia abajo.

La manera como se muestran las barras se puede modificar con el argumento position dentro de geom_bar

# saber$desemp_ingles %<>% factor(levels = rev(levels(saber$desemp_ingles)),
#                                 ordered = TRUE)
ggplot(data = saber) + 
  aes(x= fami_estratovivienda, fill = desemp_ingles) +
  geom_bar(position = "fill") +
  scale_fill_manual(values = c("A-" = "#eaeccc",
                               "A1" = "#feda8b",
                               "A2" = "#fdb366",
                               "B1" = "#f67e4b",
                               "B+" = "#dd3d2d"),
                    breaks = c("B+","B1","A2","A1","A-"),
                    name   = "Desempeño Inglés") +
  labs(title = "Frecuencia por estrato", 
       x = "Estrato", y = "Frecuencia", fill = "Desempeño
inglés", caption = "Fuente: ICFES 2019")
Barras apiladas porcentuales

Figura 27.6: Barras apiladas porcentuales

Las barras apiladas porcentuales son una opción que a veces vale la pena explorar, si bien tampoco es fácil de leer para el público en general.

Una tercera opción es la posición dodge, pero obliga a reversar el orden de los factores:

saber$desemp_ingles %<>% factor(levels = rev(levels(saber$desemp_ingles)),
                                ordered = TRUE)
levels(saber$desemp_ingles)
## [1] "A-" "A1" "A2" "B1" "B+"
ggplot(data = saber) + 
  aes(x= fami_estratovivienda, fill = desemp_ingles) +
  geom_bar(position = "dodge") +
  scale_fill_manual(values = c("A-" = "#eaeccc",
                               "A1" = "#feda8b",
                               "A2" = "#fdb366",
                               "B1" = "#f67e4b",
                               "B+" = "#dd3d2d"),
                    breaks = c("A-","A1","A2","B1","B+"),
                    name   = "Desempeño Inglés") +
  theme(legend.position  = "bottom") +
  labs(title = "Frecuencia por estrato", 
       x = "Estrato", y = "Frecuencia", fill = "Desempeño
inglés", caption = "Fuente: ICFES 2019")
Barras anidadas.

Figura 27.7: Barras anidadas.

Como las barras van de izquierda a derecha, se ubicó la leyenda en la parte inferior para que haya correspondencia y la lectura sea más natural.

Las barras adosadas es mejor opción, pero sería preferible una visualización de barras normal, pero faceteadas por la segunda variable categórica con el objeto de que queden separadas entre sí. Más adelante se presentará como facetear.