Colaborador: Ing. Francisco Valverde P.hD en informática

La función barplot en R

Para crear un gráfico de barras en R, puedes usar la función de R base barplot. En este ejemplo, vamos a crear un diagrama de barras a partir de un data frame. Concretamente vamos a usar el conocido conjunto de datos mtcars.

En primer lugar, carga los datos y crea una tabla para la columna cyl con la función de table.

Cargamos los datos:

library(ggplot2)
data(mtcars)
attach(mtcars)

Tabla de frecuencias

mi_tabla <- table(mtcars$cyl)
mi_tabla
## 
##  4  6  8 
## 11  7 14

Recuerda que para crear un diagrama de barras en R puedes usar la función barplot y establecer como parámetro la tabla creada anteriormente para mostrar la frecuencia absoluta de los datos.

Sin embargo, si prefieres un gráfico de barras con porcentajes en el eje vertical (la frecuencia relativa), puedes usar la función prop.table y multiplicar el resultado por 100 de la siguiente manera.

Una fila, dos columnas

par(mfrow = c(1, 2))

Gráfico de barras de frecuencia absoluta

barplot(mi_tabla, main = "Frequencia absoluta", col = rainbow(3))

Gráfico de barras de frecuencia relativa

barplot(prop.table(mi_tabla) * 100, main = "Frequencia relativa (%)",col = rainbow(3))

par(mfrow = c(1, 1))

Ten en cuenta que también puedes crear un diagrama de barras a partir de un factor con la función plot.

plot(factor(mtcars$cyl), col = rainbow(3))

Además, por una parte, podríamos agregar curvas sobre el gráfico de barras para representar otra variable, como sucede con la temperatura en el caso de los climogramas.

En este caso vamos a dibujar una línea sobre el gráfico que hemos hecho con nuestra tabla.

barp <- barplot(mi_tabla,                     # Guarda los valores de X que
main = "Frequencia absoluta", # representan el centro de
col = rainbow(3)) # cada barra        
lines(barp, c(5, 4, 12), type = "o", lwd = 3)

Asignar un gráfico de barras a una variable almacenará los valores del eje correspondientes al centro de cada barra.

Por otra parte, también podríamos mostrar los números correspondientes a la altura de las barras con la función text de la siguiente manera:

barp <- barplot(mi_tabla, col = rainbow(3), ylim = c(0, 15))

text(barp, mi_tabla + 0.5, labels = mi_tabla)

Por último, podría resultar interesante añadir un grid debajo de las barras del gráfico con la función grid.

barp <- barplot(mi_tabla, col = rainbow(3), ylim = c(0, 15))
grid(nx = NA, ny = NULL, lwd = 1, lty = 1, col = "gray")
barplot(mi_tabla, col = rainbow(3), ylim = c(0, 15), add = TRUE)

Título, etiquetas y colores del gráfico de barras

Al igual que otros gráficos, puedes especificar una amplia variedad de parámetros gráficos, como etiquetas de eje, un título o personalizar los ejes. En el bloque de código anterior personalizamos los colores del diagrama de barras con el parámetro col. Puedes establecer los colores que prefieras con un vector o usar la función rainbow con el número de barras como parámetro como lo hicimos nosotros o usar otras paletas de colores. También puedes cambiar el color del borde de las barras con el argumento border.

barplot(mi_tabla,                               # Datos
        main = "Gráfico de barras",             # Título
        xlab = "Número de cilindros",           # Etiqueta del eje X
        ylab = "Frecuencia",                    # Etiqueta del eje Y
        border = "black",                       # Color del borde de las barras
        col = c("darkgrey", "darkblue", "red")) # Color para cada barra

Cambiar las etiquetas de cada grupo

La etiqueta de cada grupo se puede cambiar con el argumento names.arg. En nuestro ejemplo, los grupos están etiquetados con números, pero podemos cambiarlos escribiendo algo como lo siguiente:

barplot(mi_tabla, names.arg = c("cuatro", "seis", "ocho"))

Espacio y ancho de las barras

También se puede modificar el espacio entre barras o el ancho de las barras con los argumentos width y space.

par(mfrow = c(1, 2))

Ancho de las barras (por defecto: width = 1)

#Ancho de las barras (por defecto: width = 1)

barplot(mi_tabla, main = "Cambiar el ancho de las barras",

        col = rainbow(3), width = c(0.4, 0.2, 1))

Espacio entre las barras

barplot(mi_tabla, main = "Cambiar el espacio entre barras",

        col = rainbow(3), space = c(1, 1.1, 0.1))

par(mfrow = c(1, 1))

El vector space representa el espacio de la barra respecto a la anterior, por lo que el primer elemento no se trendrá en cuenta.

Gráfico de barras a partir de una lista o un data frame

Además, puedes crear un diagrama de barras directamente con las variables de un data frame o incluso una matriz, pero ten en cuenta que la variable debe ser el recuento de algún evento o característica.

En el siguiente ejemplo, contamos el número de vehículos por color y los dibujamos con un gráfico de barras. Usaremos cada color de los coches para colorear las barras correspondientes.

df <- data.frame(ColorCoche = c("rojo", "verde", "blanco", "azul"),

                 num = c(3, 5, 9, 1))

# df <- as.list(df) # Equivalente

 

barplot(height = df$num, names = df$ColorCoche,

        col = c("red", "green", "white", "blue"))

Gráfico de barras de una variable continua

En caso de que estés trabajando con una variable continua, deberás usar la función cut para clasificar los datos. De lo contrario, en caso de ausencia de empates, tendrás tantas barras como la longitud del vector y las alturas de las barras serán iguales a 1.

En el siguiente ejemplo, dividiremos nuestros datos de 0 a 45 en pasos de 5 con el argumento breaks.

x <- c(2.1, 8.6, 3.9, 4.4, 4.0, 3.7, 7.6, 3.1, 5.0, 5.5, 20.2, 1.7,

       5.2, 33.7, 9.1, 1.6, 3.1, 5.6, 16.5, 15.8, 5.8, 6.8, 3.3, 40.6)

 

barplot(table(cut(x, breaks = seq(0, 45, by = 5))))

Gráfico de barras horizontal en R

Por defecto, los gráficos de barras en R se dibujan verticalmente. Sin embargo, es común representar gráficos de barras horizontales. Puedes rotar 90º el gráfico y crear un gráfico de barras horizontales estableciendo el argumento horiz como TRUE.

barplot(mi_tabla, main = "Gráfico de barras horizontal",

        ylab = "Número de cilindros", xlab = "Frecuencia",

        horiz = TRUE) # Gráfico de barras horizontal

Leyenda del gráfico de barra

Se puede agregar una leyenda a un diagrama de barras en R con el argumento legend.text, donde puedes especificar los nombres que quieres agregar a la leyenda. Ten en cuenta que en RStudio la gráfica resultante puede ser ligeramente diferente, ya que por ejemplo el fondo de la leyenda será blanco en lugar de transparente.

barplot(mi_tabla, xlab = "Número de cilindros",

        col = rainbow(3),

        legend.text = rownames(mi_tabla)) # Leyenda

Nótese que, al usar el argumento legend.text, la leyenda puede superponerse al diagrama de barras .

El método más fácil para resolver este problema en este ejemplo es mover la leyenda a la izquierda. Esto se puede lograr con el argumento args.legend, donde puedes establecer parámetros gráficos dentro de una lista. Puedes establecer la posición en top, bottom, topleft, topright, bottomleft y bottomright.

barplot(mi_tabla, xlab = "Número de cilindros",

        col = rainbow(3),

        legend.text = rownames(mi_tabla),

        args.legend = list(x = "top"))

De manera equivalente, se puede lograr el diagrama anterior con la función legend de la siguiente manera, con los argumentos legend y fill.

barplot(mi_tabla, xlab = "Número de cilindros",

        col = rainbow(3))

legend("top", legend = rownames(mi_tabla), fill = rainbow(3))

Sin embargo, este enfoque solo funciona bien si la leyenda no se superpone a las barras en esas posiciones. Un mejor enfoque es mover la leyenda a la derecha, fuera del gráfico de barras. Puedes hacer esto configurando el argumento inset dentro de una lista pasada como parámetro al argumento args.legend de la siguiente manera.

par(mar = c(5, 5, 4, 10))
barplot(mi_tabla, xlab = "Número de cilindros",
        col = rainbow(3),
        legend.text = rownames(mi_tabla), # Valores de la leyenda
        args.legend = list(x = "topright", inset = c(-0.20, 0))) # Argumentos de la leyenda

También podrías cambiar los límites de los ejes con los argumentos xlim e ylim para gráficos horizontales y verticales, respectivamente, pero ten en cuenta que en este caso el valor que pases dependerá del número y del ancho de las barras. Recuerda que si asignas un barplot a una variable puedes conocer los puntos del eje X que representan el centro de cada barra.

barplot(mi_tabla, xlab = "Número de cilindos",
        col = rainbow(3),
        legend.text = rownames(mi_tabla), xlim = c(0, 4.25))

Otra alternativa para mover la leyenda es ponerla debajo del gráfico de barras con las funciones layout, par y plot.new. Este enfoque es más avanzado que los otros y es posible que debas borrar los parámetros gráficos antes de la ejecución del código para obtener la gráfica correcta, ya que éstos se cambiarán.

plot.new()
layout(rbind(1, 2), heights = c(10, 3))
barplot(mi_tabla, xlab = "Número de cilindros",
        col = rainbow(3))
par(mar = c(0, 0, 0, 0))
plot.new()
legend("top", rownames(mi_tabla), lty = 1,
       
       col = c("red", "green", "blue"), lwd = c(1, 2))

Gráfico de barras agrupadas en R

Una gráfica de barras agrupadas es una gráfica de barras en R con dos o más variables. El gráfico mostrará las barras para cada una de las múltiples variables.

Convertimos la variable ‘am’ en factor

am <- factor(mtcars$am)

Cambiamos los niveles del factor

levels(am) <- c("Automatica", "Manual")

Tabla cilindros - tipo de transmisión

tabla_variables <- table(mtcars$cyl, mtcars$am)
tabla_variables <- xtabs(~cyl + am , data = mtcars) # Equivalente
barplot(tabla_variables,
main = "Gráfico de barras agrupado",
xlab = "Tipo de transmisión", ylab = "Frecuencia",
col = c("darkgrey", "darkblue", "red"),
legend.text = rownames(tabla_variables),
beside = TRUE) # Barras agrupadas

Nótese que si hubiéramos especificado table(am, cyl) en lugar de table(cyl, am), el eje X representaría el número de cilindros, por lo que habría tres grupos con dos barras cada uno.

Espacio entre grupo

Como revisamos anteriormente, se puede cambiar el espacio entre barras. En el caso de varios grupos, puedes establecer un vector de dos elementos donde el primer elemento es el espacio entre barras de cada grupo (0.4) y el segundo el espacio entre grupos (2.5).

barplot(tabla_variables,
        main = "Espacio entre grupos",
        xlab = "Tipo de transmisión", ylab = "Frecuencia",
        col = c("darkgrey", "darkblue", "red"),
        legend.text = rownames(tabla_variables),
        beside = TRUE,
        space = c(0.4, 2.5)) # Espacio

###Cambiar el espacio entre grupos de un barplot

Valores numéricos en grupos

Los gráficos de barras también se pueden usar para resumir una variable en grupos dados por uno o varios factores. Supón que quieres mostrar la cantidad de cilindros y el tipo de transmisión en función de la potencia media de los automóviles. Puedes utilizar la función tapply para crear la tabla correspondiente:

{r} View(mtcars) mtcars2 <- mtcars mtcars2\(am <- factor(mtcars2\)am) levels(mtcars2\(am) <- c("Automatica", "Manual") resumen_datos <- tapply(mtcars\)hp, list(cilindros = mtcars$cyl,

                                      transmision = mtcars2$am),
                      
                      FUN = mean, na.rm = TRUE)

resumen_datos

Ahora puedes crear el diagrama de barras correspondiente en R:

{r} par(mar = c(5, 5, 4, 10))

barplot(resumen_datos, xlab = “Tipo de transmisión”,

    main = "Media CV",
    
    col = rainbow(3),
    
    beside = TRUE,
    
    legend.text = rownames(resumen_datos),
    
    args.legend = list(title = "Cilindros", x = "topright",
                       
                       inset = c(-0.20, 0)))

###Resumen numérico por grupo >Gráfico de barras en R con barras de error

Por defecto, no puedes crear un diagrama de barras con barras de error. Sin embargo, la siguiente función te permitirá crear un diagrama de barras totalmente personalizable con barras de error estándar:

Argumentos:

  1. x: un único factor

  2. y: un vector numérico

  3. …: argumentos adicionales para ser pasados a la función barplot

{r} barplot.error <- function(x, y, …) {

mod <- lm(y ~ x)

reps <- sqrt(lengthSí/length(levels(x)))

sem <- sigma(mod)/reps

means <- tapply(y, x, mean)

upper <- max(means) + sem

lev <- levels(x)

barpl <- barplot(means, …)

invisible(sapply(1:length(barpl), function(i) arrows(barpl[i], means[i] + sem,

                                                   barpl[i], means[i] - sem, angle = 90, code = 3, length = 0.08)))

}

Llamamos a la función

{r} #barplot.error(factor(mtcars\(cyl), mtcars\)hp, col = rainbow(3), ylim = c(0, 250))

###Añadir barras de error Aunque puedes agregar barras de error a un diagrama de barras en R, cabe destacar que un diagrama de caja por grupo podría ser un mejor enfoque para resumir los datos en este escenario.

Gráfico de barras apiladas en R

Un gráfico de barras apiladas es como un diagrama de barras agrupado, pero la frecuencia de las variables está apilada. Este tipo de diagrama de barras se creará de forma predeterminada al pasar como argumento una tabla con dos o más variables, ya que el argumento beside por defecto es FALSE. {r} tabla_variables <- table(mtcars\(cyl, mtcars2\)am) barplot(tabla_variables,

    main = "Gráfico de barras apilado",
    
    xlab = "Tipo de transmisión", ylab = "Frecuencia",
    
    col = c("darkgrey", "darkblue", "red"),
    
    legend.text = rownames(tabla_variables),
    
    beside = FALSE) # Barras apiladas (opción por defecto)

###Barras apiladas en R Relacionado con los gráficos de barras apiladas, existen implementaciones similares, como el diagrama de espinas o spineplot y el gráfico de mosaico o mosaicplot. Este tipo de gráficos se pueden crear con las funciones spineplot y mosaicplot del paquete graphics.

El diagrama de tipo mosaico permite visualizar datos de dos o más variables cuantitativas, donde el área de cada rectángulo representa la proporción de esa variable en cada grupo.

{r} #install.packages(“graphics”)

library(graphics)

mosaicplot(tabla_variables, main = “Mosaico”)

###Gráfico de mosaico en R El diagrama de espina es un caso especial de un diagrama de mosaico y es una generalización del diagrama de barras apilado. En este caso, a diferencia de los gráficos de barras apiladas, cada barra suma uno. {r} spineplot(tabla_variables)

###Gráfico de espina en R Ten cuenta que, por defecto, los ejes se intercambian con respecto al diagrama de barras apiladas que creamos en la sección anterior. Puedes crear el gráfico equivalente transponiendo la tabla de frecuencias con la función t. {r} spineplot(t(tabla_variables))

###Gráfico de espinas vertical Gráfico de barras en R con ggplot2

El paquete ggplot2 es una biblioteca gráfica de R muy conocida. Puedes crear un diagrama de barras con esta biblioteca convirtiendo los datos en data frame y usando las funciones ggplot y geom_bar. En el argumento aes debes pasar los nombres de las variables del data frame, en x la variable categórica y en y la numérica. {r} # install.packages(“ggplot2”)

library(ggplot2)

mi_tabla <- table(mtcars$cyl)

df <- as.data.frame(mi_tabla) df

ggplot(data = df, aes(x = Var1, y = Freq)) + geom_bar(stat = “identity”)

###Crear diagrama de barras en R con ggplot2 >Gráfico de barras horizontal en ggplot2

En caso de que quieras rotar el diagrama de barras anterior, puedes usar la función coord_flip de la siguiente manera:

{r} ggplot(data = df, aes(x = Var1, y = Freq)) +

geom_bar(stat = “identity”) +

coord_flip() # Barras horizontales

###Crear gráfico de barras horizontal con ggplot2

Histograma en R

¿Cómo hacer un histograma en R? La función hist Para explicar los pasos para crear un histograma en R, vamos a utilizar los siguientes datos, que representan las distancia (en yardas) que recorre una pelota de golf después de ser golpeada. {r} distancia <- c(241.1, 284.4, 220.2, 272.4, 271.1, 268.3,

           291.6, 241.6, 286.1, 285.9, 259.6, 299.6,
           
           253.1, 239.6, 277.8, 263.8, 267.2, 272.6,
           
           283.4, 234.5, 260.4, 264.2, 295.1, 276.4,
           
           263.1, 251.4, 264.0, 269.2, 281.0, 283.2)

Puedes dibujar un histograma en R con la función hist. Por defecto, la función creará un histograma de frecuencias. {r} hist(distancia, main = “Histograma de frecuencias”, # Frecuencia

 ylab = "Frecuencia")

###Histograma de frencuencias en R Sin embargo, si estableces el argumento prob como TRUE, obtendrás un histograma de densidad. {r} hist(distancia, prob = TRUE, main = “Histograma de densidad”, # Densidad

 ylab = "Densidad")

###Histograma de densidad en R Además, puedes añadir un grid al histograma con la función grid de la siguiente manera. {r} hist(distancia, prob = TRUE, ylab = “Densidad”, main = “Grid”)

grid(nx = NA, ny = NULL, lty = 2, col = “gray”, lwd = 1)

hist(distancia, prob = TRUE, add = TRUE, col = “white”)

###Añadir grid a un histograma Ten en cuenta que hay que dibujar dos veces el histograma para que el grid salga por debajo de las barras en lugar de por encima.

Desde R 4.0.0 los histogramas son grises por defecto, no blancos.

Cambiar el color del histograma

Ahora que ya sabes crear un histograma en R, también puedes personalizarlo. Si quieres cambiar el color de las barras puede establecer el parámetro col al color que prefieras. Al igual que sucede con cualquier otro gráfico en R, puedes personalizar muchas características del gráfico, como el título, los ejes, el tamaño de fuente, la escala de los ejes, … {r} hist(distancia, main = “Cambiar color”, ylab = “Frecuencia”, col = “lightblue”)

###Cambiar el color en la función hist >El argumento breaks

Los histogramas son muy útiles para representar la distribución subyacente de los datos si el número de barras o clases se selecciona correctamente. Sin embargo, la selección del número de barras (o el ancho de las barras) puede ser complicada:

  1. Pocas clases agruparán demasiado las observaciones.

  2. Con demasiadas clases habrá pocas observaciones en cada una de ellas aumentando la variabilidad del gráfico obtenido.

Hay varias reglas para determinar el número de barras. En R, el método de Sturges se usa por defecto. Si quieres cambiar el número de barras, pasa al argumento breaks el número de clases que quieras. {r} par(mfrow = c(1, 3))

hist(distancia, breaks = 2, main = “Pocas clases”, ylab = “Frecuencia”)

hist(distancia, breaks = 50, main = “Demasiadas clases”, ylab = “Frecuencia”)

hist(distancia, main = “Método de Sturges”, ylab = “Frecuencia”)

par(mfrow = c(1, 1))

###Número de clases con el argumento breaks También puedes usar el método plug-in (Wand, 1995) implementando en la librería KernSmooth para seleccionar el ancho de las barras del histograma:

Método plug-in

{r} #install.packages(“KernSmooth”)

library(KernSmooth)

ancho_barras <- dpih(distancia)

nbarras <- seq(min(distancia) - ancho_barras,

           max(distancia) + ancho_barras, by = ancho_barras)

hist(distancia, breaks = nbarras, main = “Plug-in”, ylab = “Frecuencia”)

###Método plug in de Wand para seleccionar el número de clases >Histograma en R con dos variables

Establecer el argumento add como TRUE permite añadir un histograma sobre otro gráfico. Como ejemplo, puedes crear un histograma en R por grupo con el código del siguiente bloque: {r} set.seed(1)

x <- rnorm(1000) # Primer grupo

y <- rnorm(1000, 1) # Segundo grupo

hist(x, main = “Dos variables”, ylab = “Frecuencia”)

hist(y, add = TRUE, col = rgb(1, 0, 0, alpha = 0.5))

###Histograma en R con dos variables La función rgb permite establecer colores en canal RGB. El argumento alpha determina la transparencia. De hecho, cuando se combinan gráficos es una buena idea añadir colores con transparencia para no ocultar las representaciones entre si.

Histograma con curva normal

Para dibujar una curva normal sobre un histograma, puede usar las funciones dnorm y lines de la siguiente manera:

{r} hist(distancia, prob = TRUE,

   main = "Histograma con curva normal", ylab = "Densidad")

x <- seq(min(distancia), max(distancia), length = 40)

f <- dnorm(x, mean = mean(distancia), sd = sd(distancia))

lines(x, f, col = “red”, lwd = 2) # Gráfico de densidad con ggplot2

Puedes crear unas gráficas de densidad con el paquete de R ggplot2 con las funciones ggplot y geom_density de la siguiente manera:

{r} library(ggplot2)

{r} #df <- data.frame(x = x) #ggplot(df, aes(x = x)) + # geom_density(color = “red”, # Color de la curva # fill = “red”, # Color del área sombreada # alpha = 0.5) # Transparencia del color

Si quieres agregar más curvas, puedes establecer los límites del eje X con la función xlim y agregar una leyenda con scale_fill_discrete de la siguiente manera:

{r} #df <- data.frame(x = x, y = y) #df <- stack(df)

#dx <- density(x) #dy <- density

{r} #ggplot(df, aes(x = values, fill = ind)) + # geom_density(alpha = 0.5) + # Densidades con transparencia # xlim(c(min(dx\(x, dy\)x), # Límites del eje X # c(max(dx\(x, dy\)x)))) + # scale_fill_discrete(name = “Título de la leyenda”, # Cambiar el título de la leyenda # labels = c(“A”, “B”)) # + # Cambiar las etiquetas de la leyenda # theme(legend.position = “none”) # Eliminar leyenda

{r} # Equivalente

#ggplot(df, aes(x = values)) + # geom_density(aes(group = ind, fill = ind), alpha = 0.5) + # xlim(c(min(dx\(x, dy\)x), c(max(dx\(x, dy\)x)))) + # scale_fill_discrete(name = “Título de la leyenda”, # labels = c(“A”, “B”))

{r} #¿Cómo interpretar un diagrama de caja y bigotes en R? #La caja de un boxplot comienza en el primer cuartil (25%) y termina en el #tercero (75%). Por lo tanto, la caja representa el 50% de los datos #centrales, con una línea dentro que representa la mediana. A cada lado de #la caja se dibuja un segmento con los datos más lejanos sin contar los #valores atípicos (outliers) del box plot, que, en caso de existir, se #representarán con círculos.

Un dato atípico es aquella observación que está muy distante del resto de los datos.

Se dice que un valor es un valor atípico si es mayor que Q3 + 1.5 * IQR o <Q1 – 1.5 * IQR (valor atípico a la derecha), o es menor que Q1 – 1.5*IQR (valor atípico a la izquierda), siendo Q1 el primer cuartil, Q3 el tercer cuartil y IQRIQR el rango intercuartil (Q_3Q3 – Q_1Q1) que representa el ancho de la caja para diagramas de caja horizontales.

La función boxplot en R

En R base se puede crear un gráfico caja y bigotes con la función boxplot. Puedes dibujar este tipo de gráfico desde diferentes entradas, como vectores o data frames, como revisaremos en las siguientes subsecciones. En caso de dibujar diagramas de caja para múltiples grupos en el mismo gráfico también puedes especificar una fórmula como entrada. Además, es posible personalizar el gráfico de cajas resultante con varios argumentos, como veremos a continuación.

Boxplot de un vector

Si te preguntas cómo hacer un boxplot en R a partir de un vector, solo necesitas pasar el vector a la función boxplot. Por defecto, el diagrama de caja será vertical, pero puedes cambiar la orientación estableciendo el argumento horizontal como TRUE.

Datos de muestra

{r} x <- c(8, 5, 14, -9, 19, 12, 3, 9, 7, 4,4, 6, 8, 12, -8, 2, 0, -1, 5, 3)

{r} boxplot(x, horizontal = TRUE)

Ten en cuenta que los diagramas de caja ocultan la distribución subyacente de los datos. Para resolver este problema, puedes agregar puntos al diagrama de cajas con la función stripchart (el método jitter evitará dibujar sobre los datos atípicos) de la siguiente manera:

{r} # stripchart(x, method = “jitter”, pch = 19, add = TRUE, col = “blue”)

Desde R 4.0.0 los gráficos de caja son grises por defecto en lugar de blancos.

Intervalo de confianza para la mediana del boxplot

Puedes representar los intervalos de confianza al 95% para la mediana en un diagrama de caja de R estableciendo el argumento notch como TRUE.

{r} boxplot(x, notch = TRUE)

Nótese que si los intervalos de confianza de dos o más diagramas de caja no se superponen significa que hay una fuerte evidencia estadística de que las medianas son diferentes.

Gráfico de cajas por grupo

Si tu conjunto de datos tiene una variable categórica que contiene grupos, puedes crear un diagrama de caja especificando una fórmula (variable continua - variable categórica). Para este ejemplo, vamos a utilizar el conjunto de datos chickwts de R base.

{r} head(chickwts)

Ahora, puedes crear un diagrama de caja que muestre la variable weight (peso) contra el tipo de alimentación (feed). Ten en cuenta que al trabajar con data sets puedes llamar directamente a los nombres de las variables si especificas el nombre de la data frame en el argumento data.

{r} boxplot(chickwts\(weight ~ chickwts\)feed)

boxplot(weight ~ feed, data = chickwts) # Equivalente

Además, en este ejemplo, podrías agregar puntos a cada diagrama de caja de la siguiente manera:

{r} #stripchart(chickwts\(weight ~ chickwts\)feed, vertical = TRUE, method = “jitter”, # pch = 19, add = TRUE, col = 1:length(levels(chickwts$feed)))

Múltiples boxplot

En caso de que todas las variables de tu conjunto de datos sean variables numéricas, puedes crear directamente un diagrama de caja desde un data frame. Para ilustrarlo vamos a utilizar el conjunto de datos trees.

{r} head(trees)

Observa la diferencia con respecto al conjunto de datos chickwts. Sin embargo, puedes convertir este conjunto de datos como uno del mismo formato que el conjunto de datos chickwts con la función stack.

{r} stacked_df <- stack(trees) head(stacked_df)

Ahora puedes dibujar el diagrama de caja con el data frame original o con el apilado como lo hicimos en la sección anterior. Ten en cuenta que puedes cambiar el color del diagrama de caja por grupo con un vector de colores como parámetro del argumento col. Así, cada diagrama de caja tendrá un color diferente.

{r} # Boxplot del conjunto de datos ‘trees’

boxplot(trees, col = rainbow(ncol(trees)))

{r} # Equivalente a:

boxplot(stacked_df\(values ~ stacked_df\)ind,

    col = rainbow(ncol(trees)))

Puedes apilar columnas de un data frame con la función stack. En caso de que necesites dibujar un diagrama de caja diferente para cada columna de un data frame, puedes usar la función lapply e iterar sobre cada columna. En este caso, dividiremos el panel gráfico en una fila y tantas columnas como tenga el conjunto de datos. Otra alternativa sería dibujar boxplot de forma individual. La función invisible evita mostrar el texto de salida de la función lapply.

{r} par(mfrow = c(1, ncol(trees)))

invisible(lapply(1:ncol(trees), function(i) boxplot(trees[, i])))

Reordenar boxplot en R

Por defecto, los diagramas de caja se dibujarán con el orden de los factores en los datos. Sin embargo, puedes reordenar u ordenar un diagrama de caja en R reordenando los datos basándote en cualquier medida, como la mediana o la media, con la función reorder.

{r} par(mfrow = c(1, 2))

{r} # De más bajo a más alto

medianas <- reorder(chickwts\(feed, chickwts\)weight, median) # medianas <- with(chickwts, reorder(feed, weight, median)) # Equivalente boxplot(chickwts$weight ~ medianas, las = 2, xlab = ““, ylab =”“)

{r} # De más alto a más bajo

medianas <- reorder(chickwts\(feed, -chickwts\)weight, median)

medianas <- with(chickwts, reorder(feed, -weight, median)) # Equivalente

boxplot(chickwts$weight ~ medianas, las = 2, xlab = ““, ylab =”“)

{r} par(mfrow = c(1, 1))

Si quieres ordenar el diagrama de caja con otra métrica, simplemente cambia la función median por la que prefieras.

Personalizar un boxplot en R

Un diagrama de caja se puede personalizar completamente. En el siguiente bloque de código mostramos un ejemplo extenso de cómo personalizar un diagrama de caja en R. Ten en cuenta que hay incluso más argumentos que los del siguiente ejemplo para personalizar el diagrama de caja, como boxlty, boxlwd, medlty o staplelwd. Revisa la lista completa de parámetros gráficos de diagrama de caja en el argumento pars de la ayuda de o help(bxp).

{r} plot.new() set.seed(1)

{r} # Fondo gris claro #rect(par(“usr”)[1], par(“usr”)[3], par(“usr”)[2], par(“usr”)[4], # col = “#ebebeb”)

{r} # Fondo gris claro

#rect(par(“usr”)[1], par(“usr”)[3], par(“usr”)[2], par(“usr”)[4], # col = “#ebebeb”)

{r} # Añadimos un gris blanco

#gris(nx = NULL, ny = NULL, col = “white”, lty = 1, # lwd = par(“lwd”), equilogs = TRUE)

{r} # Boxplot

par(new = TRUE)

boxplot(rnorm(500), # Datos

    horizontal = FALSE, # Horizontal o vertical

    lwd = 2, # Lines width

    col = rgb(1, 0, 0, alpha = 0.4), # Color

    xlab = "Etiqueta eje X",  # Etiqueta eje X

    ylab = "Etiqueta eje Y",  # Etiqueta eje Y

    main = "Boxplot personalizado en R base", # Título

    notch = TRUE, # Añade intervalos de confianza para la mediana

    border = "black",  # Color del borde del boxplot

    outpch = 25,       # Símbolo para los outliers

    outbg = "green",   # Color de los datos atípicos

    whiskcol = "blue", # Color de los bigotes

    whisklty = 2,      # Tipo de línea para los bigotes

    lty = 1) # Tipo de línea (caja y mediana)

{r} # Agregamos una leyenda

#legend(“topright”, legend = “Boxplot”, # Posición y título # fill = rgb(1, 0, 0, alpha = 0.4), # Color # inset = c(0.03, 0.05), # Cambiamos los márgenes # bg = “white”) # Color de fondo de la leyenda

Añadir la media a un boxplot en R

Por defecto, cuando creas un diagrama de caja, se muestra la mediana. Sin embargo, *es posible que también quieras mostrar la media u otra característica de los datos. Para ese propósito, puedes usar la función segments si quieres mostrar una línea como la mediana, o la función points para agregar puntos. **Ten en cuenta que el código es ligeramente diferente si creas un diagrama de caja vertical o un diagrama de caja horizontal*. En el siguiente bloque de código, mostramos cómo agregar puntos y segmentos con la media a ambos tipos de diagramas de caja, cuando trabajes con un solo diagrama de caja.

{r} par(mfrow = c(1, 2))

{r} #—————–

Boxplot vertical

#—————– boxplot(x)

{r} # Añadir línea con la media

#segments(x0 = 0.8, y0 = mean(x), # x1 = 1.2, y1 = mean(x), # col = “red”, lwd = 2) # abline(h = mean(x), col = 2, lwd = 2) # Línea completa

{r} # Añadir línea con la media #segments(x0 = 0.8, y0 = mean(x), # x1 = 1.2, y1 = mean(x), # col = “red”, lwd = 2)

abline(h = mean(x), col = 2, lwd = 2) # Línea completa

{r} # Añadir punto con la media # points(mean(x), col = 3, pch = 19)

{r} #——————-

Boxplot horizontal

#——————- boxplot(x, horizontal = TRUE)

{r} # Añadir línea con la media

#segments(x0 = mean(x), y0 = 0.8, # x1 = mean(x), y1 = 1.2, # col = “red”, lwd = 2)

abline(v = mean(x), col = 2, lwd = 2) # Línea completa

{r} # Añadir punto con la media

points(mean(x), 1, col = 3, pch = 19)

par(mfrow = c(1, 1))

Nótese que en este caso la media y la mediana son casi iguales, ya que la distribución es simétrica. Puedes cambiar la función mean del código anterior por otra función para mostrar otra medida. También puedes agregar la media en boxplot por grupo. En este caso, puedes hacer uso de la función lapply y así evitar bucles. Para calcular la media de cada grupo se puede usar la función apply por columnas o la función colMeans, ya que es más eficiente. Puedes seguir el siguiente código para añadir los puntos y las líneas en boxplot horizontales y verticales.

{r} par(mfrow = c(1, 2)) mi_df <- trees

{r} #—————————-

Boxplot vertical por grupo

#—————————-

boxplot(mi_df, col = rgb(0, 1, 1, alpha = 0.25))

{r} # Añadir líneas con las medias

#invisible(lapply(1:ncol(mi_df), # function(i) segments(x0 = i - 0.4, # y0 = mean(mi_df[, i]), # x1 = i + 0.4, # y1 = mean(mi_df[, i]), # col = “red”, lwd = 2)))

{r} # Añadir puntos con la medias

#medias <- apply(mi_df, 2, mean) #medias <- colMeans(mi_df) # Equivalente (más eficiente)

#points(medias, col = “red”, pch = 19)

{r} #—————————–

Boxplot horizontal por grupo

#—————————–

boxplot(mi_df, col = rgb(0, 1, 1, alpha = 0.25), horizontal = TRUE)

{r} # Añadir líneas con la medias

#invisible(lapply(1:ncol(mi_df), # function(i) segments(x0 = mean(mi_df[, i]), # y0 = i - 0.4, # x1 = mean(mi_df[, i]), # y1 = i + 0.4, # col = “red”, lwd = 2)))

{r} # Añadir puntos con la medias

#medias <- apply(mi_df, 2, mean) #medias <- colMeans(mi_df) # Equivalente (más eficiente) #points(medias, 1:ncol(mi_df), col = “red”, pch = 19) #par(mfrow = c(1, 1))

Devolver valores de un boxplot

Si asignas el diagrama de caja a una variable, puedes devolver una lista con diferentes componentes. Crea un diagrama de caja con el conjunto de datos trees y almacénalo en una variable:

{r} res <- boxplot(trees) res

La salida contendrá seis elementos, descritos a continuación:

  • stats: cada columna representa el bigote inferior, el primer cuartil, la mediana, el tercer cuartil y el bigote superior de cada grupo.

  • n: número de observaciones de cada grupo.

  • conf: cada columna representa los extremos inferior y superior del intervalo de confianza de la mediana.

  • out: número total de valores atípicos.

  • group: número total de grupos.

  • names: nombres de cada grupo.

Es interesante destacar que puedes recrear el boxplot de la variable que hemos creado (res) con la función bxp.

{r} bxp(res)

Boxplot e histograma en R

Una limitación de los gráficos de caja y bigotes es que no están diseñados para detectar multimodalidad. Por esa razón, es recomendable dibujar diagramas de caja combinados con un histograma o una curva de densidad.

{r} par(mfrow = c(1, 1))

{r} # Datos multimodales

n <- 20000 ii <- rbinom(n, 1, 0.5) dat <- rnorm(n, mean = 110, sd = 11) * ii + rnorm(n, mean = 70, sd = 5) * (1 - ii)

{r} # Histograma

hist(dat, probability = TRUE, ylab = ““, col =”grey”, axes = FALSE, main = ““)

{r} # Eje # axis(1)

{r} # Densidad

#lines(density(dat), col = “red”, lwd = 2)

{r} # Boxplot

par(new = TRUE) boxplot(dat, horizontal = TRUE, axes = FALSE, lwd = 2, col = rgb(0, 1, 1, alpha = 0.15))

Los boxplot no están diseñados para detectar multimodalidad en los datos.

Como alternativas ante este problema puedes usar violin plots o beanplots.

Boxplot en ggplot2

Los diagramas de caja que creamos en las secciones anteriores también se pueden realizar con el paquete ggplot2.

Boxplot en ggplot2 a partir de un vector

El tipo de dato de entrada para usar la función ggplot tiene que ser un data frame, por lo que tendrás que convertir tu vector en clase data.frame. Una vez hecho podrás usar la función geom_boxplot para crear y personalizar la caja y la función stat_boxplot para añadir los bigotes

{r} # install.packages(“ggplot2”) library(ggplot2)

{r} # Transformar x en un data frame x <- data.frame(x)

{r} # Boxplot a partir de un vector

ggplot(data = x, aes(x = ““, y = x)) + stat_boxplot(geom =”errorbar”, # Bigotes width = 0.2) + geom_boxplot(fill = “#4271AE”, # Color de la caja outlier.colour = “red”, # Color de los valores atípicos alpha = 0.9) + # Transparencia del color de la caja ggtitle(“Boxplot a partir de un vector”) + # Título del plot xlab(““) + # Etiqueta del eje x coord_flip() # Boxplot horizontal

Boxplot en ggplot2 por grupo

Si quieres crear un diagrama de caja con ggplot2 por grupo, deberás especificar las variables en el argumento aes de la siguiente manera:

{r} # Boxplot por grupo

ggplot(data = chickwts, aes(x = feed, y = weight)) + stat_boxplot(geom = “errorbar”, # Bigotes width = 0.2) + geom_boxplot(fill = “#4271AE”, colour = “#1F3552”, # Colores alpha = 0.9, outlier.colour = “red”) + scale_y_continuous(name = “Peso”) + # Etiqueta de la variable continua scale_x_discrete(name = “Alimentación”) + # Etiqueta de los grupos ggtitle(“Boxplot por grupos en ggplot2”) + # Título del plot theme(axis.line = element_line(colour = “black”, # Personalización del tema size = 0.25))

Boxplot en ggplot2 desde un data frame

Finalmente, para crear un boxplot con ggplot2 directamente desde un conjunto de datos como el de trees deberás apilar primero los datos con la función stack:

{r} # Boxplot a partir de un data frame

ggplot(data = stack(trees), aes(x = ind, y = values)) +

   stat_boxplot(geom = "errorbar", # Bigotes

                width = 0.2) +

   geom_boxplot(fill = "#4271AE", colour = "#1F3552", # Colores

                alpha = 0.9, outlier.colour = "red") +

   scale_y_continuous(name = "Peso") +  # Etiqueta de la variable continua

   scale_x_discrete(name = "Alimentación") +        # Etiqueta de los grupos

   ggtitle("Boxplot a partir de un data frame") +   # Título del plot

   theme(axis.line = element_line(colour = "black", # Personalización del tema

                                  size = 0.25))