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

Gráfico de barras con la función plot
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)

Añadir líneas para crear un climograma
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)

Gráfico de barras con números representando la frecuencia de cada
clase
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)

Rejilla (grid) en un gráfico de barras en R
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

Gráfico de barras personalizado en R .
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"))

Cambiar las etiquetas de los grupos de un un barplot en R
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. Para el espacio entre grupos
consulta la sección correspondiente de este tutorial.
par(mfrow = c(1, 2))
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))
Cambiar el ancho o el espacio entre las barras de un barchart en
R
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"))

Barchart a partir de una lista o data frame
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 barras en R a partir de una variable continua
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

Gráfico de barras horizontal en R con la función barplot
Leyenda del gráfico de barras
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

Añadir leyenda a un gráfico de barras en R con el argumento
legend.text
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"))

Cambiar posición a la leyenda del diagrama de barras en R
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

Añadir leyenda a un gráfico de barras sin superponerse
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.
dev.off()
opar <- par(no.readonly = TRUE)
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))

dev.off()
on.exit(par(opar))
Agreagar leyenda debajo de un gráfico de barras en R
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(am)
Cambiamos los niveles del factor
levels(am) <- c("Automatica", "Manual")
Tabla cilindros - tipo de transmisión
tabla_variables <- table(cyl, 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

Crear gráfico de barras por grupos en R
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.
barplot(table(cut(x, breaks = seq(0, 45, by = 5))))

Gráfico barras en R a partir de una variable continua
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

Gráfico de barras horizontal en R con la función barplot
Leyenda del gráfico de barras
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

Añadir leyenda a un gráfico de barras en R con el argumento
legend.text
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"))

Cambiar posición a la leyenda del diagrama de barras en R
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

Añadir leyenda a un gráfico de barras sin superponerse
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.
dev.off()
opar <- par(no.readonly = TRUE)
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))

dev.off()
on.exit(par(opar))
Agregar leyenda debajo de un gráfico de barras en R
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(am)
Cambiamos los niveles del factor
levels(am) <- c("Automatica", "Manual")
Tabla cilindros - tipo de transmisión
tabla_variables <- table(cyl, 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

Crear gráfico de barras por grupos en R
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 grupos
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.
#Ahora puedes crear el diagrama de barras correspondiente en 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:
x: un único factor
y: un vector numérico
…: argumentos adicionales para ser pasados a la función barplot
barplot.error <- function(x, y, ...) {
mod <- lm(y ~ x)
reps <- sqrt(length(y)/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
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
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.
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.
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.
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.
install.packages(“ggplot2”)
library(ggplot2)
##
## Attaching package: 'ggplot2'
## The following object is masked from 'mtcars':
##
## mpg
df <- as.data.frame(mi_tabla)
ggplot(data = df, aes(x = cyl, 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:
ggplot(data = df, aes(x = cyl, 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.
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.
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.
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.
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, …
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) implementando en
la librería KernSmooth para seleccionar el ancho de las barras del
histograma:
Método plug-in
install.packages(“KernSmooth”)
library(KernSmooth)
## KernSmooth 2.23 loaded
## Copyright M. P. Wand 1997-2009
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, puede 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 + 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")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

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
Histograma de frecuencias
fig <- plot_ly(x = distancia, type = "histogram")
fig
Histograma de densidad
fig <- plot_ly(x = distancia, type = "histogram", histnorm = "probability")
fig
Función de densidad empírica en R
Para crear un gráfico de densidad en R, puedes pasar a la función
plot un objeto creado con la función density de R, que dibujará una
curva de densidad en una nueva ventana. Si lo prefieres, también puedes
superponer la línea de densidad sobre un histograma con la función
lines.
Datos de ejemplo
set.seed(1234)
Generamos datos
x <- rnorm(500)
par(mfrow = c(1, 2))
# Creamos un histograma
hist(x, freq = FALSE, main = "Histograma y densidad",
ylab = "Densidad")
# Calculamos la densidad
dx<- density(x)
# Añadimos la línea de densidad
lines(dx, lwd = 2, col = "red")
# Curva de densidad sin histograma
plot(dx, lwd = 2, col = "red",
main = "Densidad")
# Añadimos los datos con riudo en el eje X
rug(jitter(x))

Histograma y densidad en R
El resultado es la densidad de probabilidad empírica suavizada. Una
alternativa para crear una función de densidad en R es la función
epdfPlot del paquete EnvStats. Con esta función puedes pasar el vector
númerico directamente como parámetro.
Alternativa equivalente con el paquete EnvStats
install.packages(“EnvStats”)
library(EnvStats)
##
## Attaching package: 'EnvStats'
## The following objects are masked from 'package:stats':
##
## predict, predict.lm
## The following object is masked from 'package:base':
##
## print.default
epdfPlot(x, epdf.col = "red")

Ejemplo de uso de la función epdfPlot del paquete EnvStats
Selección de ventana para densidades tipo núcleo
Cuando dibujas una función de densidad de probabilidad en R, dibujas
una estimación de densidad tipo núcleo. El gráfico de densidad tipo
núcleo es un enfoque no paramétrico que necesita seleccionar una ventana
(bandwidth). Puedes establecer la ventana con el argumento bw de la
función density.
En general, una ventana grande suavizará la curva de densidad, y una
pequeña provocará un sobreajuste de la estimación de densidad tipo
núcleo En el siguiente bloque de código encontrarás un ejemplo que
describe este problema.
par(mfrow = c(1, 2))
Ventana grande
plot(density(x, bw = 20), lwd = 2,
col = "red", main = "Ventana demasiado grande")

Ventana pequeña
plot(density(x, bw = 0.05), lwd = 2,
col = "red", main = "Ventana demasiado pequeña")

Comparación de selección de ventana para la estimación de funciones
de densidad
De manera equivalente, puedes pasar argumentos de la función density
a epdfPlot dentro de una lista como parámetro del argumento
density.arg.list. En este caso, estamos pasando el argumento bw de la
función de densidad.
Alternativa equivalente con el paquete EnvStats
epdfPlot(x, epdf.col = "red", density.arg.list = list(bw = 0.05),
main = "Ventana demasiado pequeña")

La literatura sobre la selección de la ventana para estimar
funciones de densidad tipo núcleo es amplia. Sin embargo, hay tres
enfoques principales comunmente utilizados para seleccionar el
parámetro:
1. Por defecto, la función density utiliza el enfoque que se conoce
como la “regla del pulgar”.
2. Ussando el método plug-in, desarrollado por Sheather y Jones
(1991).
3. Usando el enfoque de validación cruzada.
En el siguiente código se muestra cómo aplicar cada uno de los
enfoques:
par(mfrow = c(1, 3))
Regla del pulgar
plot(density(x), main = "Regla del pulgar",
cex.lab = 1.5, cex.main = 1.75, lwd = 2)

Validación cruzada insesgada
plot(density(x, bw = bw.ucv(x)), col = 2, # Igual a: bw = "UCV"
main = "Validación cruzada", cex.lab = 1.5,
cex.main = 1.75, lwd = 2)

Plug-in
plot(density(x, bw = bw.SJ(x)), col = 4, # Igual a: bw = "SJ"
main = "Método plug-in",
cex.lab = 1.5, cex.main = 1.75, lwd = 2)

Métodos de estimación de la ventana en gráficos de densidad
La selección del parámetro ventana dependerá de los datos con los
que trabajes o de los objetivos de tu estudio. Elije el método de
selección con precaución.
También puedes cambiar la función núcleo con el argumento kernel,
que por defecto será gaussiano. Aunque no entraremos en más detalles,
los núcleos disponibles son “gaussiano”, “epanechnikov”, “rectangular”,
“triangular”, “biweight”, “cosine” y “optcosine”. La selección dependerá
de los datos con los que estés trabajando.
Multiples líneas de densidad en un gráfico
Con la función lines puedes dibujar múltiples curvas de densidad en
R. Solo necesitas crear un gráfico de densidad en R y añadir las nuevas
líneas que quieras.
par(mfrow = c(1, 1))
plot(dx, lwd = 2, col = "red",
main = "Multiples curvas", xlab = "")
# Nuevos datos
set.seed(2)
y <- rnorm(500) + 1
dy <- density(y)
# Nueva curva
lines(dy, col = "blue", lwd = 2)

Múltiples curvas de densidad en R
Sin embargo, puede que te hayas dado cuenta de que la curva azul
está cortada en el lado derecho. Para arreglar esto puedes establecer
los argumentos xlim e ylim entre el mínimo y el máximo para cada eje de
todas las densidades que vayas a dibujar.
plot(dx, lwd = 2, col = "red",
main = "Multiples curvas con los límites de los ejes corregidos", xlab = "",
xlim = c(min(dx$x, dy$x), c(max(dx$x, dy$x))), # Mínimo y máximo limites eje X
ylim = c(min(dx$y, dy$y), c(max(dx$y, dy$y)))) # Mínimo y máximo limites eje Y
lines(dy, col = "blue", lwd = 2)

Múltiples curvas de densidad evitando solapamiento
Al trazar varias líneas es una buena práctica establecer los límites
de los ejes con los argumentos xlim y ylim de la función plot , porque
los límites se establecerán de forma predeterminada en los límites de la
primera curva que dibujes .
Gráficos de comparación de densidades en R
Hay varias formas de comparar densidades. Un enfoque es utilizar la
función densityPlot del paquete car. Esta función crea estimaciones de
densidad no paramétricas condicionadas por un factor si se especifica.
Escribe ?densityPlot para obtener información adicional sobre la función
y el método.
Datos de ejemplo con grupos
Grupos
set.seed(1)
grupos <- factor(sample(c(1, 2), 100, replace = TRUE))
variable <- numeric(100)
Comparando densidades por grupo
install.packages(“car”)
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:EnvStats':
##
## qqPlot
densityPlot(variable, grupos)

Comparación de densidades en R con la función densityPlot
Otra alternativa es utilizar la función sm.density.compare del
paquete sm, que compara las densidades en un contraste de
permutaciones.
install.packages(“sm”)
library(sm)
## Package 'sm', version 2.2-5.7: type help(sm) for summary information
sm.density.compare(variable, grupos)
legend("topleft", levels(grupos), col = 2:4, lty = 1:2)

Función smcompare en R para comparar gráficos de densidad
Ten en cuenta que los gráficos de densidad son diferentes debido a
que los métodos para calcular las densidades son diferentes. #####
Consulta la bibliografía de cada método, disponible en la documentación
de cada función, para obtener detalles adicionales.
Colorear el área bajo las curvas de densidad
Con R base puedes usar la función polygon para sombrear el área bajo
las curvas de densidad. Si usas la función rgb en el argumento col en
lugar de un color básico, puedes establecer la transparencia del área
del diagrama de densidad con el argumento alpha, que va desde 0, que es
transparencia total hasta 1, que dibuja el color opaco.
par(mfrow = c(1, 2))
——————————–
Sombrear el área bajo la curva
——————————–
plot(dx, lwd = 2, main = "", xlab = "",
col = "red", xlim = c(-4, 6), ylim = c(0, 0.5))
polygon(dx, col = "red")
polygon(dx$x, dx$y, col = "red") # Equivalente
set.seed(2)
y <- rnorm(500) + 2
dy <- density(y)
lines(dy, lwd = 2, col = "blue")
polygon(dy, col = "blue")

————————————————–
Sombrear el área bajo la curva con transparencia
————————————————–
plot(dx, lwd = 2, main = "", xlab = "",
col = "red", xlim = c(-4, 6), ylim = c(0, 0.5))
polygon(dx, col = rgb(1, 0, 0, alpha = 0.5))
lines(dy, lwd = 2, col = "blue")
polygon(dy, col = rgb(0, 0, 1, alpha = 0.5))

Cambiar la transparencia del área de la densidad con la función
rgb
Si estás utilizando el paquete EnvStats, puedes configurar los
colores con el argumento curve.fill.col de la función epdfPlot.
Alternativa equivalente con el paquete EnvStats
library(EnvStats)
epdfPlot(x, # Vector con datos
curve.fill = TRUE, # Colorear el área
curve.fill.col = rgb(1, 0, 0, alpha = 0.5), # Color del área
epdf.col = "red") # Color de la curva
epdfPlot(y, curve.fill = TRUE,
curve.fill.col = rgb(0, 0, 1, alpha = 0.5),
epdf.col = "blue",
add = TRUE) # Añadir la densidad sobre el plot anterior

También puedes sombrear solo un área específica debajo de la curva.
En el siguiente ejemplo, mostramos cómo colorear el área de la curva
para valores de x mayores que 0.
par(mfrow = c(1, 1))
plot(dx, lwd = 2, main = "Densidad", col = "red")
polygon(c(dx$x[dx$x >= 0], 0), c(dx$y[dx$x >= 0], 0),
col = rgb(1, 0, 0, alpha = 0.5), border = "red", main = "")

Colorear cierta área bajo una curva en R
Gráfico de densidad con ggplot2
Puedes crear una gráficas de densidad con el paquete de R ggplot2
con las funciones ggplot y geom_density de la siguiente manera:
library(ggplot2)
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

Gráfico de densidad en R con la librería ggplot2
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:
df <- data.frame(x = x, y = y)
df <- stack(df)
dx <- density(x)
dy <- density(y)
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
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"))

Múltiples diagramas de densidad en ggplot2
¿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.
Interpretación del diagrama de caja y bigotes
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 Q_3Q3 + 1.5 IQR⋅IQR (valor atípico a la derecha), o es menor
que Q_1Q1 – 1.5 IQR⋅IQR (valor atípico a la izquierda), siendo Q_1Q1 el
primer cuartil, Q_3Q3 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
x <- c(8, 5, 14, -9, 19, 12, 3, 9, 7, 4,
4, 6, 8, 12, -8, 2, 0, -1, 5, 3)
boxplot(x, horizontal = TRUE)
# Boxplot básico en R horizontal
# 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:
stripchart(x, method = "jitter", pch = 19, add = TRUE, col = "blue")

Boxplot con datos con la función stripchart de R
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
Boxplot en R con intervalo de confianza para la mediana
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_categorica). Para este ejemplo, vamos a
utilizar el conjunto de datos chickwts de R base.
head(chickwts)
## weight feed
## 1 179 horsebean
## 2 160 horsebean
## 3 136 horsebean
## 4 227 horsebean
## 5 217 horsebean
## 6 168 horsebean
Output
weight feed
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 datasets puedes llamar directamente a los nombres de las
variables si especificas el nombre del data frame en el argumento
data.
boxplot(chickwts$weight ~ chickwts$feed)

boxplot(weight ~ feed, data = chickwts) # Equivalente
# Gráfico de cajas y bigotes por grupos en R
# Además, en este ejemplo, podrías agregar puntos a cada diagrama de caja de la siguiente manera:
stripchart(chickwts$weight ~ chickwts$feed, vertical = TRUE, method = "jitter",
pch = 19, add = TRUE, col = 1:length(levels(chickwts$feed)))

Boxplot por grupos y datos con la función stripchart
Multiples boxplots
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.
head(trees)
## Girth Height Volume
## 1 8.3 70 10.3
## 2 8.6 65 10.3
## 3 8.8 63 10.2
## 4 10.5 72 16.4
## 5 10.7 81 18.8
## 6 10.8 83 19.7
Output
Girth Height Volume
Output
values ind
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.
Boxplot del conjunto de datos ‘trees’
boxplot(trees, col = rainbow(ncol(trees)))

Equivalente a:
boxplot(stacked_df$values ~ stacked_df$ind,
col = rainbow(ncol(trees)))

Boxplots múltiples en R
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 boxplots de forma individual. La función
invisible evita mostrar el texto de salida de la función lapply.
par(mfrow = c(1, ncol(trees)))
invisible(lapply(1:ncol(trees), function(i) boxplot(trees[, i])))

Gráficos de caja múltiples separados
Reordenar boxplot en R
De más bajo a más alto
medianas <- reorder(chickwts$feed, chickwts$weight, median)
De más alto a más bajo
medianas <- reorder(chickwts$feed, -chickwts$weight, median)
Boxplots reordenados en R
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 ?bxp o
help(bxp).
plot.new()
set.seed(1)
# Fondo gris claro
rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4],
col = "#ebebeb")
# Añadimos un grid blanco
grid(nx = NULL, ny = NULL, col = "white", lty = 1,
lwd = par("lwd"), equilogs = TRUE)

Boxplot
par(new = TRUE)
## Warning in par(new = TRUE): llamada par(new=TRUE) sin gráfico
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)
# 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

Boxplot personalizado en R base
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.
—————–
Boxplot vertical
—————–
boxplot(x)
# 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
# Añadir punto con la media
points(mean(x), col = 3, pch = 19)

——————-
Boxplot horizontal
——————-
boxplot(x, horizontal = TRUE)
# 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
# Añadir punto con la media
points(mean(x), 1, col = 3, pch = 19)

par(mfrow = c(1, 1))
Añadir la media a un gráfico de cajas y bigotes
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.
—————————-
Boxplot vertical por grupo
—————————-
boxplot(mi_df, col = rgb(0, 1, 1, alpha = 0.25))
# 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)))
# 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)

—————————–
Boxplot horizontal por grupo
—————————–
boxplot(mi_df, col = rgb(0, 1, 1, alpha = 0.25),
horizontal = TRUE)
# 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)))
# 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))
Añadir media a boxplots por grupos en R
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:
res <- boxplot(trees)

res
## $stats
## [,1] [,2] [,3]
## [1,] 8.30 63 10.2
## [2,] 11.05 72 19.4
## [3,] 12.90 76 24.2
## [4,] 15.25 80 37.3
## [5,] 20.60 87 58.3
##
## $n
## [1] 31 31 31
##
## $conf
## [,1] [,2] [,3]
## [1,] 11.70814 73.72979 19.1204
## [2,] 14.09186 78.27021 29.2796
##
## $out
## [1] 77
##
## $group
## [1] 3
##
## $names
## [1] "Girth" "Height" "Volume"
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.
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.
par(mfrow = c(1, 1))
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)
Histograma
hist(dat, probability = TRUE, ylab = "", col = "grey",
axes = FALSE, main = "")
# Eje
axis(1)
# Densidad
lines(density(dat), col = "red", lwd = 2)

Boxplot
par(new = TRUE)
## Warning in par(new = TRUE): llamada par(new=TRUE) sin gráfico
boxplot(dat, horizontal = TRUE, axes = FALSE,
lwd = 2, col = rgb(0, 1, 1, alpha = 0.15))

Superponer boxplot a un histograma un otro gráfico en R
Los boxplots no están diseñados para detectar multmodalidad 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.
install.packages(“ggplot2”)
library(ggplot2)
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:
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 por grupos
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:
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))
