Stripchart en R
Los stripcharts o stripplots son diagramas de dispersión unidimensionales. Cuando se trabaja con tamaños de muestra pequeños (pocos puntos de datos), los stripcharts son alternativas a los diagramas de caja o diagramas de dispersión para representar las observaciones. El stripchart en R también es útil para añadir los datos a otros gráficos, con el fin de mostrar la distribución de los datos. En este tutorial explicaremos con ejemplos cómo hacer y personalizar un stripchart en el lenguaje de programación R.
La función stripchart() en R
La función stripchart
de R permite crear gráficos de dispersión unidimensionales. Para crear un stripchart con los argumentos por defecto, pasa una variable numérica a la función:
# Fijamos semilla de generación
set.seed(1)
# Generamos 20 número pseudoaleatorios normales
x <- rnorm(20)
# Creamos el strip chart
stripchart(x)
También puedes personalizar el símbolo pch usado para crear el gráfico, el ancho de línea y su color con los argumentos pch
, lwd
y col
, respectivamente. Ten en cuenta que los símbolos 21 a 25 permiten modificar el color de fondo del símbolo con el argumento bg
.
stripchart(x, pch = 21, col = 1, bg = 2, lwd = 2)
Por defecto, la función dibuja una caja con las etiquetas correspondientes del eje X. Sin embargo, puedes eliminar la caja y los ejes estableciendo el argumento axes
como FALSE
. Entonces podrías usar la función axis
para añadir los ejes que prefieras.
stripchart(x, axes = FALSE)
axis(1)
axis(2)
Una alternativa es borrar la caja estableciendo el argumento frame
como FALSE
, que mantendrá el eje X.
stripchart(x, frame = FALSE)
Stripchart vertical
El stripchart en R se dibuja por defecto en horizontal. No obstante, puedes girar el gráfico estableciendo el argumento vertical
como TRUE
para crear un gráfico como el siguiente:
stripchart(x, vertical = TRUE)
Además, ten en cuenta que si estableces el argumento las = 2
, las etiquetas del eje vertical se mostrarán en vertical.
stripchart(x, vertical = TRUE, las = 2)
Métodos gráficos
La función stripchart
tiene tres métodos diferentes para dibujar los datos. Por defecto se usa el método 'overplot'
, que en caso de empates en los datos, los puntos se solapan unos encima de otros. Otros métodos son 'stack'
, que apila las observaciones creando un gráfico similar a un histograma y el método 'jitter'
, que añade ruido aleatorio para dibujar las observaciones. Considera, como ejemplo, los siguientes datos con empates:
set.seed(1)
# Generamos 100 datos con empates
x <- round(runif(100, 0 , 10))
Overplot
Como señalamos anteriormente, el método overplot
es usado por defecto por la función stripchart
. Ten en cuenta que en este caso, como existen empates, aunque hay 100 puntos de datos, solo podemos ver 11 en el gráfico.
stripchart(x, pch = 19, col = 4, main = "method = 'overplot'")
Stack
Para mostrar todos los datos, puedes configurar el argumento method
como 'stack'
. Esta configuración apilará los puntos de datos repetidos, creando un gráfico que representa la distribución de los datos.
stripchart(x, pch = 19, method = "stack",
col = 4, main = "method = 'stack'")
Jitter
La última alternativa es usar el método 'jitter'
, que agrega ruido blanco en el eje vertical si el gráfico es horizontal, o en el eje X si el gráfico es vertical, para intentar mostrar todos los datos.
stripchart(x, pch = 19, method = "jitter",
col = 4, main = "method = 'jitter'")
Si estableces este método, puedes personalizar el argumento jitter
, que aumentará (para valores mayores que 0.2) o disminuirá (para valores menores que 0.2) la cantidad de ruido aleatorio aplicado a los puntos por defecto.
# Dividimos la ventana gráfica
par(mfrow = c(1, 2))
# jitter = 0.2
set.seed(2)
stripchart(x, pch = 19, method = "jitter",
col = 4, main = "method = 'jitter', jitter = 0.2")
axis(2)
# jitter = 0.5
set.seed(2)
stripchart(x, pch = 19, method = "jitter", jitter = 0.5,
col = 4, main = "method = 'jitter', jitter = 0.5")
axis(2)
# Volvemos a la ventana original
par(mfrow = c(1, 1))
En la gráfica anterior puedes observar la diferencia mirando la escala del eje vertical. No obstante, si hay muchas observaciones algunas de ellas se superpondrán. En caso de que quieras evitar la superposición de los puntos, recomendamos buscar información sobre gráficos beeswarm.
Stripchart en R por grupo
Con la función stripchart
también puedes usar una fórmula de la forma numérica ~ categórica
, donde numérica
es una variable numérica y categórica
una variable categórica o factor que representa grupos. Para crear un stripchart en base a un factor puedes escribir:
set.seed(1)
# Variable numérica
x <- rnorm(100)
# Grupos (Variable categórica)
groups <- sample(c("A", "B", "C"), 100, replace = TRUE)
stripchart(x ~ groups, group.names = c("A", "B", "C"), pch = 19, method = "jitter",
jitter = 0.2, vertical = TRUE, col = rainbow(length(unique(groups))))
Ten en cuenta que pasamos un vector con colores (tantos como número de grupos) al argumento col
para agregar colores por grupo.
Añadir la media a un stripchart
A veces puede ser interesante mostrar la media de los puntos dibujados con un stripchart. Para un solo stripplot tienes dos opciones: agregar un punto medio o una línea media con las funciones points
o lines
, respectivamente.
set.seed(3)
y <- rexp(50)
par(mfrow = c(1, 2))
# Agregamos la media con un punto
stripchart(y, pch = 16, col = 5, method = "jitter")
points(mean(y), col = 1, pch = 7, cex = 2, lwd = 2)
# Agregamos la media con una línea
stripchart(y, pch = 16, col = 5, method = "jitter")
abline(v = mean(y), col = 1, pch = 7, cex = 2, lwd = 2, lty = 2)
par(mfrow = c(1, 1))
Para un stripchart basado en un factor deberás calcular la media de cada grupo y agregar las medias a cada uno de la siguiente manera:
set.seed(3)
y <- rexp(100)
# Generamos grupos
groups <- sample(c("A", "B", "C"), 100, replace = TRUE)
par(mfrow = c(1, 2))
# Calculamos las medias
means <- sapply(levels(factor(groups)), function(i) mean(y[groups == i]))
# Stripchart horizontal
stripchart(y ~ groups, pch = 16, col = grey.colors(3),
method = "jitter", las = 1)
points(means, 1:3, col = "red", pch = 7, cex = 1.5, bg = 2, lwd = 2)
# Stripchart vertical
stripchart(y ~ groups, pch = 16, col = grey.colors(3),
method = "jitter", vertical = TRUE)
points(means, col = "red", pch = 7, cex = 1.5, bg = 2, lwd = 2)
par(mfrow = c(1, 1))
Añadir stripchart a un boxplot en R
Finalmente, cabe mencionar que los stripcharts en R se muestran habitualmente sobre diagramas de caja cuando hay pocas observaciones, debido a que los diagramas de caja ocultan la distribución subyacente de los datos. Para agregar un stripchart sobre un gráfico, debes crear un gráfico y luego ejecutar la función stripchart
, especificando add = TRUE
como argumento.
set.seed(4)
z <- rnorm(75)
par(mfrow = c(1, 2))
# Diagrama de cajas
boxplot(z)
stripchart(z, add = TRUE, vertical = TRUE,
method = "jitter", col = 2, pch = 19)
# Boxplot por grupo
g <- sample(c("A", "B"), 75, replace = TRUE)
boxplot(z ~ g)
# Agregamos los stripcharts
stripchart(z ~ g, add = TRUE, vertical = TRUE,
method = "jitter", col = 3:4, pch = 19)
par(mfrow = c(1, 1))
Nótese que el argumento at
permite modificar la posición en la que se dibuja el stripchart, por lo que no es estrictamente necesario dibujar el gráfico encima del principal.
set.seed(4)
z <- rnorm(75)
boxplot(z, horizontal = TRUE, xlim = c(0.5, 2))
# Stripchart centrado en el valor 1.75 del eje Y
stripchart(z, add = TRUE, method = "jitter", col = 2, pch = 19, at = 1.75)