29 feb 2020

20 ejemplos de geom_boxplot en ggplot2 de R


En la siguiente entrada se colocan ejemplos de cómo utilizar el paquete ggplot2 para crear gráficos de cajas o boxplot. Este gráfico permite conocer rápidamente tanto la dispersión, como la asimetría, el centro y los datos atípicos de una variable. La interpretación del mismo se resume en el siguiente gráfico:


 Para tales fines se utiliza la data beght disponible en la librería wooldridge. En primer lugar, agregamos (usando el paquete dplyr) nuevas variables a la base de datos, puntualmente:

-          Funa: es una variable = 1 en caso de que la persona haya consumido al menos 1 caja de cigarrillo durante el embarazo.
-          qingre: es un factor que indica el quintil de ingresos al que pertenece la persona.
-          bwght se transforma de onzas a libras.
-          Pquintil es un vector lógico que se utiliza para identificar el primero y ultimo quintil.

Un diccionario completo sobre la base lo podemos encontrar: https://rdrr.io/cran/wooldridge/man/bwght.html. Aunque parezca trivial, considere estas variables se usaran con distintos fines a lo largo de la entrada, sería recomendable las entienda antes de continuar:

library(wooldridge)  #base de datos
library(ggplot2)     #Gráficos
library(dplyr)       #gestión de los datos

data(bwght)
attach(bwght)

bwght <- bwght %>%
  mutate(
         fuma = factor(packs>0, labels = c("Si", "No")),
         qingre = factor(ntile(faminc,5), labels = paste("Quintil", 1:5, sep=" ")),
         pquintil = factor(qingre %in% c("Quintil 1","Quintil 5")),
         bwght = bwght/16
         )

Ejemplo 1. Box-plot para una variable vertical u horizontalmente. Adicionalmente se muestra cómo combinar distintos gráficos de ggplot2:

g1 <- ggplot(bwght, aes(y=bwght)) +
  geom_boxplot() +
  theme_minimal()

#ggsave("g1", plot = last_plot())
      
g2 <- ggplot(bwght, aes(y=bwght)) +
  geom_boxplot() +
  coord_flip() +
  theme_minimal()

library(ggpubr)
ggarrange(g1, g2, 
          labels = c("Vertical", "Horizontal"),
          ncol = 2, nrow = 1)


Ejemplo 2. Box-plot para una variable, pero segmentado por grupos:

ggplot(bwght, aes(y=bwght, x=fuma)) +
  geom_boxplot() +
  theme_minimal()


Ejemplo 3. Resaltar la media (mean) dentro del grafico usando la función stat_summary:

ggplot(bwght, aes(y=bwght, x=fuma)) +
  geom_boxplot() +
  theme_minimal() +
  stat_summary(fun.y=mean, geom="point", color="red")


Ejemplo 4. Usar la función stat_summary también permite agregar texto como etiquetas a estadísticos frecuentes:

ggplot(bwght, aes(y=bwght, x=fuma)) +
  geom_boxplot() +
  theme_minimal() +
  stat_summary(geom = 'text', label = c("Si", "No"), fun.y = max, vjust = -1)


Ejemplo 5. Usar la función stat_summary también usar funciones propias. En el ejemplo siguiente se agrega una función que indica el límite inferior considerado para clasificar un dato como atípico:

ggplot(bwght, aes(y=bwght, x=fuma)) +
  geom_boxplot() +
  theme_minimal() +
  stat_summary(geom = 'text', label = "Q3+1.5*IQR", fun.y = function(z) { quantile(z,0.75)-1.5*IQR(z) }, hjust = -0.25, vjust = +4.5)


Ejemplo 6. Resaltar estadísticos incondicionales, es decir, que no correspondan a grupos específicos, sino a la serie completa utilizando la función geom_point:

bwght %>%
  ggplot(aes(y=bwght, x=fuma)) +
  geom_boxplot(color=4, fill = "#3366FF", alpha=0.4) +
  theme_minimal() +
  geom_point(aes(x = fuma, y = median(bwght)), size = 2, color = "red")


Ejemplo 7. En este ejemplo se combinan cuatro opciones de colores: 1) el color de las líneas de la caja y el bigote, usando el argumento color dentro de la función geom_boxplot; 2) el argumento fill colorea el contenido; 3) la función alpha asigna cierto nivel de trasparencia al contenido; por último, se muestra una forma distinta de asignar colores a partir de nombres y no de códigos.

cg1 <- ggplot(bwght, aes(y=bwght, x=fuma)) +
  geom_boxplot(color=4) +
  theme_minimal()

cg2 <-ggplot(bwght, aes(y=bwght, x=fuma)) +
  geom_boxplot(color=4, fill = "#3366FF") +
  theme_minimal()

cg3 <-ggplot(bwght, aes(y=bwght, x=fuma)) +
  geom_boxplot(color=4, fill = "#3366FF", alpha = 0.5) +
  theme_minimal()

cg4 <-ggplot(bwght, aes(y=bwght, x=fuma)) +
  geom_boxplot(fill = "midnightblue") +
  theme_minimal()

ggarrange(cg1, cg2, cg3, cg4, 
          labels = NA,
          ncol = 2, nrow = 2)


Ejemplo 8. Resaltar los datos atípicos:

ggplot(bwght, aes(y=bwght, x=fuma)) +
  geom_boxplot(color=4, outlier.colour="red") +
  theme_minimal()


Ejemplo 9. Omitir los datos atípicos en la salida del gráfico:

ggplot(bwght, aes(y=bwght, x=fuma)) +
  geom_boxplot(color=4, outlier.colour=NA) +
  theme_minimal()


Ejemplo 10. Obtener el gráfico comparando el peso por grupos de ingresos y según condición de consumo, pero segmentados por una categoría distinta, en este caso para cada quintil de ingresos (1 gráfico para cada uno usando la función facet_wrap):

ggplot(bwght, aes(y=bwght, x=fuma, color=fuma)) +
  geom_boxplot(outlier.colour="red") +
  theme_minimal() +
  theme(legend.position="none") +
  facet_wrap(~qingre)

# para modificar las opciones de este gráfico:
   ... +
  xlab("x-axis") + ylab("y-axis") + ggtitle("Title") +
  guides(fill=guide_legend(title="Legend_Title"))


Ejemplo 11. Se repite el ejemplo anterior, pero combinando todos los boxplot en un solo gráfico. Adicionalmente se muestra como ajustar los límites del eje, modificar la posición de la leyenda, agregar etiquetas de ejes, textos y fuentes:

g3 <- ggplot(bwght, aes(x=qingre, y=bwght, fill=fuma)) +
  geom_boxplot(alpha = 0.7) +
  #ylim(NA,NA) +       
  theme_minimal() +
  theme(legend.position="bottom",
        plot.title=element_text(hjust=0.5)
        )+
  labs(title="Box plot peso del niño",
           x="Quintil de ingreso",
           y="Peso (Lbs)",
     caption="Fuente: Wooldridge data set")
 
g3
Ejemplo 12. Otra alternativa es generar una variable que represente la interacción entre las categorías que deseamos representar y posteriormente graficarlas. Agregándole colores mediante el argumento fill para poder generar mejor apariencia en el gráfico y se modifica la opción linetype para modificar el estilo de la línea de las cajas:

bwght %>%
  mutate(fumaIngr = interaction(fuma, qingre))

ggplot(bwght, aes(y=bwght, x=fumaIngr, fill = fuma)) +
  geom_boxplot(outlier.colour="red" , linetype="dashed") +
  theme_minimal() +
  coord_flip()


Un conjunto importante de argumentos que se pueden modificar se muestran en: https://stackoverflow.com/questions/53170465/how-to-make-a-base-r-style-boxplot-using-ggplot2/53170810.

Ejemplo 13. Otro ejemplo de modificación de leyenda, cambiando posición y orientación:

g3 +
  theme(legend.position = c(0.2, 0.9),
        legend.direction = "horizontal")


Ejemplo 14. Modificando los colores.

# Colores
gc5 <- g3 +
  scale_fill_brewer(palette="Blues")

gc6 <- g3 +
  scale_fill_brewer(palette="Accent")

gc7 <- g3 +
  scale_fill_manual(values=c("#999999", "#E69F00"))

gc8 <- g3 +
  scale_fill_brewer(palette="Dark2")

arrG1 <- ggarrange(gc5, gc6, gc7, gc8,
          labels = NA,
          ncol = 2, nrow = 2)

arrG1


Ejemplo 15.

gc7  +
  geom_jitter(shape=10,
              position=position_jitter(),
              alpha = 0.6)


Ejemplo 16.

annotate_figure(arrG1,
            top = text_grob("Gráfico box", color = "red", face = "bold", size = 11)
                 )


Ejemplo 17.

ocoa <- imager::load.image('ocoa.png')

ggplot(bwght, aes(y=bwght, x=fuma)) +
  background_image(ocoa)+
  geom_boxplot(color=2)


Ejemplo 18. Resaltando grupos particulares:

bwght %>%
ggplot(aes(y=bwght, x=qingre, fill=pquintil, alpha=pquintil)) +
  geom_boxplot() +
  theme_minimal() +
  scale_fill_manual(values=c("grey", "blue")) +
  scale_alpha_manual(values=c(1,0.1)) +
  theme(legend.position = "none") +
  xlab("")


Ejemplo 19. Boxplot notches

ggplot(bwght, aes(x=qingre, y=bwght, fill=fuma)) +
  geom_boxplot(notch=TRUE, notchwidth = 0.5,
               color="blue", alpha = 0.7,
               outlier.colour="red", outlier.size=0.7)


Ejemplo 20.

library(plotly)
ggplotly(g1)

Referencias

-          Plot.ly (nd). geom_boxplot in ggplot2. Consultado 28-2-2020. Disponible en: https://plot.ly/ggplot2/box-plots/.

-          Prabhakaran, S. (nd). The Complete ggplot2 Tutorial.  Consultado 28-2-2020. Disponible en: http://r-statistics.co/Complete-Ggplot2-Tutorial-Part2-Customizing-Theme-With-R-Code.html.

-          STHDA (nd). ggplot2 box plot: Quick start guide - R software and data visualization. Consultado 29-2-2020. Disponible en: http://www.sthda.com/english/wiki/ggplot2-box-plot-quick-start-guide-r-software-and-data-visualization.

-          STHDA (2017). ggplot2 - Easy Way to Mix Multiple Graphs on The Same Page. Consultado 29-2-2020. Disponible en: http://www.sthda.com/english/articles/24-ggpubr-publication-ready-plots/81-ggplot2-easy-way-to-mix-multiple-graphs-on-the-same-page/.

-          Redactyl (2016). Creating plots in R using ggplot2 - part 10: boxplots. Consultado 29-2-2020. Disponible en: http://t-redactyl.io/blog/2016/04/creating-plots-in-r-using-ggplot2-part-10-boxplots.html.

-          Stackoverflow (2019). Labeling individual boxes in a ggplot boxplot. Consultado 29-2-2020. Disponible en: https://stackoverflow.com/questions/48029549/labeling-individual-boxes-in-a-ggplot-boxplot.

Creando variables por grupos en dplyr (group_by + mutate)

  Simulemos una base de hogares, donde se identifica el hogar, el sexo (1 mujer) y provincia y edad para cada miembro.   # Definir la lista ...