Histograma 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")
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")
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")
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")
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:
- Pocas clases agruparán demasiado las observaciones.
- 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))
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")
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))
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)
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')
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 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))
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")
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.
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 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