Stripchart en R

Usa la función stripchart() para crear strip charts en el lenguaje de programación 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)

stripchart en R base

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)

pch y colores stripchart

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)

Argumento axes

Una alternativa es borrar la caja estableciendo el argumento frame como FALSE, que mantendrá el eje X.

stripchart(x, frame = FALSE)

Eliminar caja stripchart

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)

Rotar stripchart en R

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)

Stripplot vertical in R

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'")

Método overplot stripchart

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'")

Método stack stripchart

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'")

Método jitter para añadir ruido aleatorio a los datos

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))

Modificando el argumento jitter

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))))

Stripchart en R por grupos y colores

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))

Añadir media a stripchart en R

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))

Agregar media stripchart por grupo en R

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))

Stripchart y boxplot en R

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)

Posición de un stripchart con el argumento at