2017-11-26

Diagrama de barras en ggplot - Preservar orden del data frame

Title

Problema

Cuando creamos un diagrama de barras, ggplot2 ordena por defecto el eje x alfabéticamente, de manera que en el gráfico aparecen desordenadas las categorías.

library("ggplot2") 
ggplot(df, aes(x = palabra, y= contar, fill = categoria)) + geom_bar(stat = "identity")
  • Datos
  •  palabras contar categoria palabra
    1       BI  67452    Defect      BI
    2       Bu  47279    Defect      Bu
    3       Re  38530    Defect      Re
    4      dvd   2554    Defect     dvd
    5    Techn  34044  Digitaal   Techn
    6   Retour  12190  Digitaal  Retour
    7  Digital  22102  Digitaal Digital
    8     Kobo   1234  Digitaal    Kobo
    
    # Data frame
    df <- structure(list(palabras = structure(c(1L, 2L, 6L, 4L, 8L, 7L, 
    3L, 5L), .Label = c("BI", "Bu", "Digital", "dvd", "Kobo", "Re", 
    "Retour", "Techn"), class = "factor"), contar = c(67452, 47279, 
    38530, 2554, 34044, 12190, 22102, 1234), categoria = structure(c(1L, 
    1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("Defect", "Digitaal"), class = "factor")), .Names = c("palabras", 
    "contar", "categoria"), row.names = c(NA, -8L), class = "data.frame")
    

    Solución

    Ordenamos el factor palabra conforme al orden en el que aparecen en el data frame.

    df$palabra <- factor(df$palabra, levels = df$palabra)
    ggplot(df, aes(x = palabra, y= contar, fill = categoria)) + geom_bar(stat = "identity")
    

    Referencias

    2017-11-16

    Cambiar el color y añadir leyenda en un diagrama de barras por subgrupos en ggplot2

    Problema

    Cuando creamos un diagrama de barras por subgrupos (facet_grid), aunque especifiquemos color para el eje x, ggplot2 crea un gráfico monocromático, sin cambiar el color de cada columna.

    library("ggplot2")    
    ggplot(data = diamonds) + 
          geom_bar(mapping = aes(x = color, y = ..prop.., group = 2)) + 
          scale_y_continuous(labels=scales::percent) +
          facet_grid(~cut)
    

    Solución

    Al calcular la proporción por grupo, necesitamos especificar en una aesthetics (aes) diferente el color para alterar el comportamiento por defecto de ggplot2. Una dentro de la función ggplot y otra dentro de geom_bar con fill.

    ggplot(data = diamonds, aes(x = color, y = ..prop.., group = cut)) + 
      geom_bar(aes(fill = factor(..x.., labels = LETTERS[seq(from = 4, to = 10 )]))) + 
      labs(fill = "color") + 
      scale_y_continuous(labels = scales::percent) + 
      facet_grid(~ cut)
    

    Referencias

    Nube de datos