Histograma en R

Usa la función hist para crear histogramas en R

Un histograma en R es el gráfico más habitual para representar datos continuos. Este tipo de gráfico es similar a un diagrama de barras, pero que representa las frecuencias en las que aparecen las mediciones agrupadas en ciertos intervalos y cuenta cuántas observaciones caen en cada intervalo. Además, la altura está determinada por el ratio entre la frecuencia y el ancho del intervalo.

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

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.

 # Frecuencia
hist(distancia, 
     main = "Histograma de frecuencias", ylab = "Frecuencia")

Histograma de frecuencias en R

Sin embargo, si estableces el argumento prob como TRUE, obtendrás un histograma de densidad.

# Densidad
hist(distancia,
     prob = TRUE, 
     main = "Histograma de 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.

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 de R

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 puedes 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, …

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.

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) implementado en la librería KernSmooth para seleccionar el ancho de las barras del histograma:

# Método plug-in
# 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:

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, puedes usar las funciones dnorm y lines de la siguiente manera:

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)

Histograma con curva normal en R

Añadir curva de densidad a un histograma en R

Para agregar una curva de densidad sobre un histograma, puedes usar la función lines para trazar la curva y la función density para calcular una estimación no paramétrica (tipo núcleo) de la distribución.

hist(distancia, freq = FALSE, main = "Curva densidad", ylab = "Densidad")
lines(density(distancia), lwd = 2, col = 'red')

Curva de densidad en un histograma de R

La selección de ventana para ajustar las densidades no paramétricas es un área de intensa investigación. Además, ten en cuenta que por defecto, la función density usa un núcleo gaussiano. Para obtener más información, ejecuta ?density.

Vamos a unir los códigos anteriores dentro de una función para crear automáticamente un histograma con curvas normales y de densidad.

histDenNorm <- function (x, ...) {
   hist(x, ...) # Histograma
   lines(density(x), col = "blue", lwd = 2) # Densidad
   x2 <- seq(min(x), max(x), length = 40)
   f <- dnorm(x2, mean(x), sd(x))
   lines(x2, f, col = "red", lwd = 2) # Normal
   legend("topright", c("Histograma", "Densidad", "Normal"), box.lty = 0,
          lty = 1, col = c("black", "blue", "red"), lwd = c(1, 2, 2))
}

Ahora puedes verificar el comportamiento de la función anterior con datos de muestra.

set.seed(1)

# Datos normales
x <- rnorm(n = 5000, mean = 110, sd = 5)

# Datos exponenciales
y <- rexp(n = 3000, rate = 1)
  
par(mfcol = c(1, 2))

histDenNorm(x, prob = TRUE, main = "Histograma de X")
histDenNorm(y, prob = TRUE, main = "Histograma de Y")

par(mfcol = c(1, 1))

Histograma con curva normal y de densidad no paramétrica en R

Histograma y boxplot en R

Se puede agregar un diagrama de caja sobre un histograma escribiendo par(new = TRUE) entre los códigos de los dos gráficos.

hist(distancia, probability = TRUE, ylab = "", main = "",
     col = rgb(1, 0, 0, alpha = 0.5), axes = FALSE)
axis(1) # Añade el eje horizontal
par(new = TRUE)
boxplot(distancia, horizontal = TRUE, axes = FALSE,
        lwd = 2, col = rgb(0, 0, 0, alpha = 0.2))

Histograma con boxplot en R

También puedes agregar la curva normal o de densidad a la gráfica anterior.

Histograma en R con ggplot2

Para crear un histograma con el paquete ggplot2, debes usar las funciones ggplot junto con geom_histogram y pasar los datos como data frame. En el argumento aes debes especificar el nombre de la variable del data frame.

# install.packages("ggplot2")
library(ggplot2)

ggplot(data.frame(distancia), aes(x = distancia)) + 
       geom_histogram(color = "gray", fill = "white")

Histograma en ggplot2

Este gráfico devolverá un mensaje advirtiéndote de que el histograma se calculó utilizando 30 clases. Esto se debe a que, de manera predeterminada, ggplot no utiliza el método de Sturges.

Ahora vamos a calcular el número de barras con el método Sturges como lo hace la función hist y establecerlo con el argumento breaks. Ten en cuenta que también puedes establecer el argumento binwidth si lo prefieres.

# Calculando el número de barras como la función hist()
nbreaks <- pretty(range(distancia), n = nclass.Sturges(distancia),
                  min.n = 1)

ggplot(data.frame(distancia), aes(x = distancia)) + 
      geom_histogram(breaks = nbreaks, color = "gray", fill = "white")

Como puedes ver, el siguiente gráfico es igual al primer histograma.

Histograma en ggplot2 con el método Sturges

En ggplot2 también puedes agregar la curva de densidad con la función geom_density. Además, si quieres rellenar el área debajo de la curva, puedes indicar en el argumento fill el color que prefieras y en el argumento alpha el grado de transparencia del color. Ten en cuenta que necesitas establecer un nuevo aes dentro del geom_histogram de la siguiente manera:

ggplot(data.frame(distancia), aes(x = distancia)) +
       geom_histogram(aes(y = ..density..), breaks = nbreaks,
                      color = "gray", fill = "white") +
       geom_density(fill = "black", alpha = 0.2)

Histograma con densidad en ggplot2

Histograma en Plotly

Una alternativa para crear histogramas es usar el paquete plotly (una adaptación de la librería de JavaScript para R), que crea gráficos en formato interactivo. Para nuestro ejemplo podríamos ejecutar lo siguiente:

install.packages("plotly")
library(plotly)

# Histograma de frecuencias
fig <- plot_ly(x = distancia, type = "histogram")
fig

# Histograma de densidad
fig <- plot_ly(x = distancia, type = "histogram", histnorm = "probability")
fig