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:
-
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.