Autor: Álvaro Alonso Fernández
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)
Queremos realizar un gráfico tipo Boxplot. Es un gráfico adecuado para mostrar los valores de una variable cuantitativa dependiente a lo largo de varios niveles de un factor cualitativo. Es decir, es adecuado por ejemplo para mostrar el % de supervivencia frente a varias concentraciones de un tóxico, o el crecimiento de una planta en varios niveles de luz, etc.
Cargamos nuestra matriz de datos, que tendrá el siguiente aspecto:
setwd(dir = "F:/R/MARKDOWN-ggplot2/boxplot")
datos<-read.table("boxplot.csv", sep = ";", header = TRUE, dec = ".")
datos
## Treatment Var1 Var2
## 1 1 0.9 0.20
## 2 1 2.3 0.30
## 3 1 3.5 0.40
## 4 1 4.5 0.50
## 5 1 6.9 0.20
## 6 1 8.7 0.40
## 7 1 5.4 0.40
## 8 1 3.9 1.00
## 9 1 6.3 0.90
## 10 1 8.1 0.80
## 11 2 0.0 0.90
## 12 2 0.0 0.80
## 13 2 4.0 0.90
## 14 2 5.0 1.20
## 15 2 12.9 1.30
## 16 2 8.0 1.30
## 17 2 9.0 1.20
## 18 2 8.0 1.40
## 19 2 0.0 2.00
## 20 2 9.0 2.00
## 21 3 9.0 3.20
## 22 3 8.0 3.40
## 23 3 7.8 4.50
## 24 3 8.9 5.60
## 25 3 12.0 6.50
## 26 3 2.0 5.40
## 27 3 12.0 4.50
## 28 3 11.0 6.40
## 29 3 14.0 6.70
## 30 3 3.0 6.90
## 31 4 45.0 9.00
## 32 4 54.0 9.80
## 33 4 46.0 9.80
## 34 4 56.0 9.80
## 35 4 76.0 9.90
## 36 4 54.0 9.00
## 37 4 54.0 7.00
## 38 4 34.0 8.00
## 39 4 45.0 9.00
## 40 4 44.0 6.00
## 41 5 22.0 6.80
## 42 5 43.0 9.00
## 43 5 36.0 9.00
## 44 5 37.0 9.90
## 45 5 30.0 9.89
## 46 5 33.0 9.90
## 47 5 32.0 6.90
## 48 5 34.0 9.90
## 49 5 69.0 9.99
## 50 5 72.0 9.80
str(datos)
## 'data.frame': 50 obs. of 3 variables:
## $ Treatment: int 1 1 1 1 1 1 1 1 1 1 ...
## $ Var1 : num 0.9 2.3 3.5 4.5 6.9 8.7 5.4 3.9 6.3 8.1 ...
## $ Var2 : num 0.2 0.3 0.4 0.5 0.2 0.4 0.4 1 0.9 0.8 ...
En este caso tenemos cinco grupos (=tratamientos) y dos variables dependientes (Var1 y Var2). Las variables dependientes con cuantitativas, mientras que el tratamiento es categórico.
Vamos a hacer el boxplot más sencillo posible, en este caso solamente vamos a representar los valores que toma la Var1 sin tener en cuenta el tratamiento. Veamos que aspecto toma nuestro gráfico:
library(ggplot2)
gr1 <- ggplot(datos, aes(x=0, y=Var1))
gr1
Ahora añadimos el elemento boxplot por medio de + geom_boxplot()
gr1+ geom_boxplot()
Podemos hacer lo mismo con la Var2 de otra manera (sin crear el objeto, de todas maneras es más útil la primera forma, esta es simplemnete para ver todo el código junto):
ggplot(datos, aes(x = 0, y = Var2)) +
geom_boxplot()
Podemos superponer las observaciones por medio de geom_jitter:
ggplot(datos, aes(x = 0, y = Var2)) +
geom_boxplot()+
geom_jitter()
La interpretación no es muy compleja. La línea de dentro de la caja representa la mediana, la caja representa en la parte inferior el cuartil 1 y el cuartil 3, es decir el 50% de los valores de la variable se encuentran dentro de la caja, y las barras representan el valor máximo y mínimo sin los outliers, que son los puntos negros (la var 1 tiene pero la var 2 no).
Tomamos el Treatment y lo incluimos en nuestro boxplot utilizando la Var1. Tenemos primero que transformar en factor la variable Treatment:
datos$Treatment<-factor(datos$Treatment)#transformamos una variable númerica en un factor categórico
ggplot(datos, aes(x = Treatment, y = Var1)) +
geom_boxplot()
Lo primero es dar un color a cada uno de los niveles del factor, para ello utilizamos fill=Treatment:
gr2<-ggplot(datos, aes(x = Treatment, y = Var1, fill=Treatment)) +
geom_boxplot()
gr2
Ahora vamos a cambiar el nombre de la leyenda, utilizamos guides. Vemos la utilidad de incluir nuestra figura en un objeto, ahora solamente hay que sumarle a gr2 lo que queremos hacer (en este caso el nombre de la caja de la leyenda):
gr2+guides(fill = guide_legend(title = "Ciudades"))
Y ahora pongamos los nombres de las ciudades con scale_fill_hue:
gr2 + guides(fill = guide_legend(title = "Ciudades")) +
scale_fill_hue(labels = c("La Coruña", "Bilbao", "Gerona", "Madrid", "Toledo"))
Y ahora toca arreglar los ejes, pongamos los nombres de la variable y quitemos los números del eje X:
gr2 + guides(fill = guide_legend(title = "Ciudades")) +
scale_fill_hue(labels = c("La Coruña", "Bilbao", "Gerona", "Madrid", "Toledo")) +
labs(x='Ciudades', y='Una variable cualquiera')
Pongamos los nombres de las ciudades en el eje x en lugar de los números que aparecen. Para ello utilizamos scale_x_discrete:
gr2 + guides(fill = guide_legend(title = "Ciudades")) +
scale_fill_hue(labels = c("La Coruña", "Bilbao", "Gerona", "Madrid", "Toledo")) +
labs(x='Ciudades', y='Una variable cualquiera')+
scale_x_discrete("Ciudades", labels = c("La Coruña", "Bilbao", "Gerona", "Madrid", "Toledo"))
Ahora no tiene mucho sentido tener la leyenda, la podemos quitar por medio de theme(legend.position = "none"):
gr3<-gr2 + guides(fill = guide_legend(title = "Ciudades")) +
scale_fill_hue(labels = c("La Coruña", "Bilbao", "Gerona", "Madrid", "Toledo")) +
labs(x='Ciudades', y='Una variable cualquiera')+
scale_x_discrete("Ciudades", labels = c("La Coruña", "Bilbao", "Gerona", "Madrid", "Toledo"))
gr3 + theme(legend.position = "none")
Tal vez se vea mejor si giramos nuestra figura por medio de coord_flip(), del siguiente modo:
gr4<-gr3 + theme(legend.position = "none")
gr5<-gr4+ coord_flip()
gr5
Ahora vamos a cambiar el fondo de nuestra figura. Hay varias opciones theme_classic(), theme_minimal(), theme_light(), etc. Aquí un resumen:
Vamos a ver como queda:
library(patchwork)
grA<- gr5 + theme_classic()+ theme(legend.position = "none")
grB<- gr5 + theme_minimal()+ theme(legend.position = "none")
grC<- gr5 + theme_light()+ theme(legend.position = "none")
grD<- gr5 + theme_dark()+ theme(legend.position = "none")
grE<- gr5 + theme_gray()+ theme(legend.position = "none")
grF<- gr5 + theme_linedraw()+ theme(legend.position = "none")
(grA | grB | grC ) / (grD | grE | grF )
Finalmente vamos a mejorar los colores de las barras utilizando algunas de las combinaciones de tonos que ofrece ggplot2 por medio de scale_fill_brewer(palette="Pastel2"):
grA<- gr5 + theme_classic()+ theme(legend.position = "none") + scale_fill_brewer(palette="Pastel2")
## Scale for 'fill' is already present. Adding another scale for 'fill', which
## will replace the existing scale.
grB<- gr5 + theme_classic()+ theme(legend.position = "none") + scale_fill_brewer(palette="Reds")
## Scale for 'fill' is already present. Adding another scale for 'fill', which
## will replace the existing scale.
grC<- gr5 + theme_classic()+ theme(legend.position = "none") + scale_fill_brewer(palette="Green")
## Warning in pal_name(palette, type): Unknown palette Green
## Scale for 'fill' is already present. Adding another scale for 'fill', which
## will replace the existing scale.
grD<- gr5 + theme_classic()+ theme(legend.position = "none") + scale_fill_brewer(palette="Greys")
## Scale for 'fill' is already present. Adding another scale for 'fill', which
## will replace the existing scale.
(grA | grB ) / (grC | grD )
Las paletas de colores son casi infinitas:
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)