R

R

Tutorial R: Gráficos univariantes en R

Aprende a crear y personalizar gráficos univariantes en R para analizar distribuciones numéricas y categóricas con histogramas, boxplots y violines.

Aprende R y certifícate

Histogramas y densidades para variables numéricas

Los gráficos univariantes nos permiten explorar la distribución de una sola variable. Cuando trabajamos con variables numéricas (como edad, altura, temperatura o ingresos), los histogramas y las curvas de densidad son herramientas fundamentales para visualizar su distribución.

Histogramas

Un histograma divide los datos en intervalos (o "bins") y muestra la frecuencia de observaciones en cada intervalo mediante barras. Es ideal para entender la forma de la distribución, identificar valores atípicos y detectar patrones en los datos.

Para crear un histograma básico en R, utilizamos la función hist():

# Creamos un vector de datos numéricos
edades <- c(23, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 37, 39, 41, 45, 47, 48, 52, 55, 60)

# Creamos un histograma básico
hist(edades)

Este código genera un histograma simple, pero podemos personalizarlo para mejorar su interpretación:

hist(edades, 
     main = "Distribución de edades",    # Título
     xlab = "Edad (años)",               # Etiqueta eje X
     ylab = "Frecuencia",                # Etiqueta eje Y
     col = "skyblue",                    # Color de las barras
     border = "white",                   # Color del borde
     breaks = 8)                         # Número de intervalos

El parámetro breaks es crucial en los histogramas, ya que determina cuántos intervalos se utilizan para agrupar los datos. Un número inadecuado puede ocultar patrones importantes o crear patrones artificiales:

  • Si usamos pocos intervalos: podríamos perder detalles importantes de la distribución
  • Si usamos demasiados intervalos: el histograma puede volverse ruidoso y difícil de interpretar

Podemos especificar breaks de diferentes formas:

# Especificando el número de intervalos
hist(edades, breaks = 10)

# Especificando los puntos de corte exactos
hist(edades, breaks = c(20, 30, 40, 50, 60))

Para datos más realistas, usemos un conjunto de datos incorporado en R:

# Histograma con el conjunto de datos mtcars (consumo de combustible)
hist(mtcars$mpg, 
     main = "Distribución del consumo de combustible",
     xlab = "Millas por galón (mpg)",
     ylab = "Frecuencia",
     col = "lightgreen",
     border = "darkgreen")

Curvas de densidad

Las curvas de densidad son una alternativa más suave a los histogramas. Representan una estimación continua de la distribución de probabilidad de los datos y son especialmente útiles para comparar distribuciones.

Para crear una curva de densidad básica:

# Calculamos la densidad
densidad <- density(mtcars$mpg)

# Dibujamos la curva de densidad
plot(densidad, 
     main = "Densidad del consumo de combustible",
     xlab = "Millas por galón (mpg)",
     ylab = "Densidad",
     col = "blue",
     lwd = 2)  # Grosor de la línea

Una práctica común es combinar histogramas y curvas de densidad para obtener una visión más completa de la distribución:

# Creamos el histograma con frecuencias relativas
hist(mtcars$mpg, 
     freq = FALSE,  # Usamos densidad en lugar de frecuencia
     main = "Distribución del consumo de combustible",
     xlab = "Millas por galón (mpg)",
     col = "lightblue",
     border = "white")

# Añadimos la curva de densidad
lines(density(mtcars$mpg), 
      col = "darkblue", 
      lwd = 2)

El parámetro freq = FALSE es esencial para que el histograma y la curva de densidad estén en la misma escala.

Personalización avanzada con ggplot2

La librería ggplot2 ofrece mayor flexibilidad para crear visualizaciones más elegantes:

# Cargamos la librería
library(ggplot2)

# Histograma básico
ggplot(mtcars, aes(x = mpg)) +
  geom_histogram(binwidth = 2, fill = "skyblue", color = "white") +
  labs(title = "Distribución del consumo de combustible",
       x = "Millas por galón (mpg)",
       y = "Frecuencia")

Para crear una curva de densidad con ggplot2:

ggplot(mtcars, aes(x = mpg)) +
  geom_density(fill = "skyblue", alpha = 0.5) +
  labs(title = "Densidad del consumo de combustible",
       x = "Millas por galón (mpg)",
       y = "Densidad")

Y para combinar ambos en un solo gráfico:

ggplot(mtcars, aes(x = mpg)) +
  geom_histogram(aes(y = ..density..), binwidth = 2, 
                 fill = "skyblue", color = "white", alpha = 0.7) +
  geom_density(color = "darkblue", linewidth = 1) +
  labs(title = "Distribución del consumo de combustible",
       x = "Millas por galón (mpg)",
       y = "Densidad")

Interpretación de histogramas y densidades

Al analizar estos gráficos, debemos prestar atención a:

  • Forma de la distribución: ¿Es simétrica, sesgada a la derecha o a la izquierda?
  • Centralidad: ¿Dónde se concentran la mayoría de las observaciones?
  • Dispersión: ¿Los datos están muy concentrados o dispersos?
  • Modalidad: ¿Hay uno (unimodal), dos (bimodal) o más picos?
  • Valores atípicos: ¿Existen valores extremos alejados del resto?

Por ejemplo, con el conjunto de datos faithful que contiene información sobre las erupciones del géiser Old Faithful:

# Exploramos la duración de las erupciones
hist(faithful$eruptions, 
     main = "Duración de erupciones del géiser Old Faithful",
     xlab = "Duración (minutos)",
     col = "orange",
     breaks = 20)

# Añadimos la curva de densidad
lines(density(faithful$eruptions), col = "red", lwd = 2)

Este histograma muestra una distribución bimodal, lo que sugiere que las erupciones tienden a agruparse en dos duraciones distintas: erupciones cortas (alrededor de 2 minutos) y erupciones largas (alrededor de 4 minutos).

Comparación de distribuciones

Podemos comparar distribuciones de diferentes grupos usando curvas de densidad superpuestas:

library(ggplot2)

# Comparamos el peso de automóviles con transmisión automática vs. manual
ggplot(mtcars, aes(x = wt, fill = factor(am))) +
  geom_density(alpha = 0.5) +
  scale_fill_manual(values = c("skyblue", "pink"),
                    labels = c("Automático", "Manual"),
                    name = "Transmisión") +
  labs(title = "Distribución del peso según tipo de transmisión",
       x = "Peso (1000 lbs)",
       y = "Densidad")

Este gráfico nos permite ver que los automóviles con transmisión manual tienden a ser más ligeros que los automáticos.

Ajuste del ancho de banda en curvas de densidad

El parámetro bw (bandwidth o ancho de banda) controla la suavidad de la curva de densidad:

# Ancho de banda pequeño (menos suavizado)
plot(density(mtcars$mpg, bw = 0.5), 
     main = "Densidad con ancho de banda pequeño",
     col = "red")

# Ancho de banda grande (más suavizado)
plot(density(mtcars$mpg, bw = 5), 
     main = "Densidad con ancho de banda grande",
     col = "blue")

Un ancho de banda pequeño captura más detalles pero puede mostrar ruido, mientras que un ancho de banda grande produce una curva más suave pero puede ocultar características importantes de los datos.

Gráficos de barras para variables categóricas

Cuando trabajamos con variables categóricas (como género, país, tipo de producto o cualquier dato que represente categorías), los gráficos de barras son la herramienta más adecuada para visualizar su distribución. A diferencia de las variables numéricas, las categóricas no pueden representarse mediante histogramas o curvas de densidad.

Gráficos de barras básicos

Un gráfico de barras muestra la frecuencia o proporción de cada categoría mediante rectángulos de altura proporcional al valor que representan. En R, podemos crear gráficos de barras utilizando la función barplot():

# Creamos un vector con datos categóricos
tipos_vehiculos <- c("Sedán", "SUV", "Hatchback", "Sedán", "SUV", "Sedán", 
                    "Pickup", "SUV", "Sedán", "Hatchback", "SUV", "Sedán")

# Calculamos la tabla de frecuencias
tabla_frecuencias <- table(tipos_vehiculos)

# Creamos el gráfico de barras
barplot(tabla_frecuencias,
        main = "Tipos de vehículos",
        xlab = "Tipo de vehículo",
        ylab = "Frecuencia",
        col = "steelblue",
        border = "white")

Para datos más realistas, podemos utilizar conjuntos de datos incorporados en R:

# Usamos la variable 'gear' (número de marchas) del conjunto mtcars
tabla_marchas <- table(mtcars$gear)

# Creamos el gráfico de barras
barplot(tabla_marchas,
        main = "Distribución de vehículos por número de marchas",
        xlab = "Número de marchas",
        ylab = "Cantidad de vehículos",
        col = "lightgreen",
        border = "darkgreen")

Personalización de gráficos de barras

Podemos personalizar nuestros gráficos de barras para mejorar su interpretación:

# Creamos un vector de colores
colores <- c("tomato", "gold", "skyblue")

# Creamos el gráfico con más opciones
barplot(tabla_marchas,
        main = "Distribución de vehículos por número de marchas",
        xlab = "Número de marchas",
        ylab = "Cantidad de vehículos",
        col = colores,
        border = "white",
        ylim = c(0, 20),           # Límites del eje Y
        names.arg = c("3 marchas", "4 marchas", "5 marchas"),  # Etiquetas personalizadas
        horiz = FALSE)             # Barras verticales (por defecto)

Para crear un gráfico de barras horizontal, que puede ser útil cuando tenemos nombres de categorías largos:

barplot(tabla_marchas,
        main = "Distribución de vehículos por número de marchas",
        xlab = "Cantidad de vehículos",
        ylab = "Número de marchas",
        col = colores,
        border = "white",
        horiz = TRUE,              # Barras horizontales
        las = 1)                   # Orientación de las etiquetas (0=paralelo, 1=horizontal)

Gráficos de barras con proporciones

A veces es más informativo mostrar las proporciones en lugar de las frecuencias absolutas:

# Calculamos las proporciones
proporciones <- prop.table(tabla_marchas) * 100  # Multiplicamos por 100 para obtener porcentajes

# Creamos el gráfico de barras con porcentajes
barplot(proporciones,
        main = "Distribución porcentual de vehículos por número de marchas",
        xlab = "Número de marchas",
        ylab = "Porcentaje (%)",
        col = colores,
        border = "white")

# Añadimos etiquetas con los porcentajes
text(x = 1:length(proporciones), 
     y = proporciones/2,  # Posicionamos en la mitad de cada barra
     labels = sprintf("%.1f%%", proporciones),
     col = "black")

Gráficos de barras con ggplot2

La librería ggplot2 ofrece mayor flexibilidad y opciones estéticas para crear gráficos de barras:

library(ggplot2)

# Convertimos los datos a un formato adecuado para ggplot2
datos_marchas <- data.frame(
  marchas = factor(c("3", "4", "5")),
  cantidad = as.vector(tabla_marchas)
)

# Creamos el gráfico de barras básico
ggplot(datos_marchas, aes(x = marchas, y = cantidad)) +
  geom_bar(stat = "identity", fill = "skyblue") +
  labs(title = "Distribución de vehículos por número de marchas",
       x = "Número de marchas",
       y = "Cantidad de vehículos")

Podemos personalizar aún más el gráfico con ggplot2:

ggplot(datos_marchas, aes(x = marchas, y = cantidad, fill = marchas)) +
  geom_bar(stat = "identity", width = 0.7) +
  geom_text(aes(label = cantidad), vjust = -0.5) +  # Añadimos etiquetas con valores
  scale_fill_manual(values = c("tomato", "gold", "skyblue")) +
  labs(title = "Distribución de vehículos por número de marchas",
       x = "Número de marchas",
       y = "Cantidad de vehículos") +
  theme_minimal() +
  theme(legend.position = "none")  # Eliminamos la leyenda

Trabajando con factores

En R, las variables categóricas se representan mediante el tipo de dato factor. Los factores permiten controlar el orden de las categorías, lo que es útil para la visualización:

# Creamos un factor con niveles ordenados
cilindros <- factor(mtcars$cyl, levels = c(4, 6, 8))

# Creamos una tabla de frecuencias
tabla_cilindros <- table(cilindros)

# Gráfico de barras con categorías ordenadas
barplot(tabla_cilindros,
        main = "Distribución de vehículos por número de cilindros",
        xlab = "Número de cilindros",
        ylab = "Cantidad de vehículos",
        col = c("lightblue", "lightgreen", "salmon"))

Con ggplot2, el manejo de factores es aún más sencillo:

# Creamos un dataframe con los datos
mtcars_df <- mtcars
mtcars_df$cyl <- factor(mtcars_df$cyl, levels = c(4, 6, 8))

# Gráfico con ggplot2
ggplot(mtcars_df, aes(x = cyl, fill = cyl)) +
  geom_bar() +
  scale_fill_manual(values = c("lightblue", "lightgreen", "salmon")) +
  labs(title = "Distribución de vehículos por número de cilindros",
       x = "Número de cilindros",
       y = "Cantidad de vehículos") +
  theme_minimal() +
  theme(legend.position = "none")

Gráficos de barras para variables ordinales

Las variables ordinales son un tipo especial de variables categóricas donde existe un orden natural entre las categorías (por ejemplo: bajo, medio, alto). Para estas variables, es importante mantener ese orden en la visualización:

# Creamos datos de satisfacción del cliente
satisfaccion <- factor(c("Muy insatisfecho", "Insatisfecho", "Neutral", 
                         "Satisfecho", "Muy satisfecho", "Satisfecho", 
                         "Neutral", "Satisfecho", "Muy satisfecho", 
                         "Satisfecho", "Satisfecho", "Neutral"),
                       levels = c("Muy insatisfecho", "Insatisfecho", 
                                 "Neutral", "Satisfecho", "Muy satisfecho"))

# Tabla de frecuencias
tabla_satisfaccion <- table(satisfaccion)

# Gráfico de barras para datos ordinales
barplot(tabla_satisfaccion,
        main = "Niveles de satisfacción del cliente",
        xlab = "Nivel de satisfacción",
        ylab = "Frecuencia",
        col = colorRampPalette(c("red", "yellow", "green"))(5),
        las = 2)  # Rotamos las etiquetas para mejor legibilidad

Con ggplot2, podemos crear un gráfico más elegante:

# Convertimos a dataframe
datos_satisfaccion <- data.frame(
  nivel = satisfaccion
)

ggplot(datos_satisfaccion, aes(x = nivel, fill = nivel)) +
  geom_bar() +
  scale_fill_manual(values = colorRampPalette(c("red", "yellow", "green"))(5)) +
  labs(title = "Niveles de satisfacción del cliente",
       x = "Nivel de satisfacción",
       y = "Frecuencia") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none")

Interpretación de gráficos de barras

Al analizar gráficos de barras, debemos prestar atención a:

  • Categoría más frecuente: ¿Cuál es la categoría que aparece con mayor frecuencia?
  • Distribución general: ¿Las categorías tienen frecuencias similares o hay grandes diferencias?
  • Patrones: ¿Existe algún patrón visible en la distribución de las categorías?
  • Categorías raras: ¿Hay categorías con muy pocas observaciones?

Por ejemplo, analizando los datos de transmisión (automática vs. manual) en el conjunto mtcars:

# Creamos el gráfico de barras para tipo de transmisión
transmision <- factor(mtcars$am, labels = c("Automática", "Manual"))
tabla_transmision <- table(transmision)

barplot(tabla_transmision,
        main = "Distribución de vehículos por tipo de transmisión",
        xlab = "Tipo de transmisión",
        ylab = "Cantidad de vehículos",
        col = c("skyblue", "pink"))

Este gráfico nos muestra que hay más vehículos con transmisión automática que manual en el conjunto de datos mtcars.

Gráficos de barras apiladas

Cuando queremos visualizar la distribución de dos variables categóricas simultáneamente, podemos usar gráficos de barras apiladas:

# Creamos una tabla de contingencia
tabla_cyl_am <- table(mtcars$cyl, mtcars$am)
rownames(tabla_cyl_am) <- c("4 cilindros", "6 cilindros", "8 cilindros")
colnames(tabla_cyl_am) <- c("Automática", "Manual")

# Gráfico de barras apiladas
barplot(tabla_cyl_am,
        main = "Distribución de vehículos por cilindros y transmisión",
        xlab = "Tipo de transmisión",
        ylab = "Cantidad de vehículos",
        col = c("lightblue", "lightgreen", "salmon"),
        legend.text = rownames(tabla_cyl_am),
        args.legend = list(x = "topright"))

Con ggplot2, podemos crear gráficos de barras apiladas más elegantes:

# Preparamos los datos
mtcars_df <- mtcars
mtcars_df$cyl <- factor(mtcars_df$cyl)
mtcars_df$am <- factor(mtcars_df$am, labels = c("Automática", "Manual"))

# Gráfico de barras apiladas
ggplot(mtcars_df, aes(x = am, fill = cyl)) +
  geom_bar() +
  scale_fill_manual(values = c("lightblue", "lightgreen", "salmon"),
                   name = "Cilindros") +
  labs(title = "Distribución de vehículos por transmisión y cilindros",
       x = "Tipo de transmisión",
       y = "Cantidad de vehículos") +
  theme_minimal()

Boxplots y violines para distribuciones

Los boxplots (diagramas de caja) y los gráficos de violín son herramientas visuales fundamentales para entender la distribución de variables numéricas. A diferencia de los histogramas y las curvas de densidad, estos gráficos nos permiten identificar rápidamente características clave como la mediana, la dispersión y los valores atípicos.

Diagramas de caja (Boxplots)

Un boxplot resume la distribución de una variable numérica mostrando cinco estadísticos importantes:

  • El mínimo (excluyendo valores atípicos)
  • El primer cuartil (Q1, percentil 25)
  • La mediana (Q2, percentil 50)
  • El tercer cuartil (Q3, percentil 75)
  • El máximo (excluyendo valores atípicos)

Además, los boxplots identifican y muestran los valores atípicos (outliers) como puntos individuales.

Para crear un boxplot básico en R, utilizamos la función boxplot():

# Boxplot básico con el conjunto de datos mtcars
boxplot(mtcars$mpg,
        main = "Consumo de combustible",
        ylab = "Millas por galón (mpg)",
        col = "lightblue")

Podemos personalizar nuestro boxplot para mejorar su interpretación:

boxplot(mtcars$mpg,
        main = "Consumo de combustible",
        ylab = "Millas por galón (mpg)",
        col = "lightblue",
        border = "darkblue",
        horizontal = TRUE,     # Orientación horizontal
        notch = TRUE)          # Añade una muesca alrededor de la mediana

Las muescas (notches) proporcionan una aproximación visual del intervalo de confianza alrededor de la mediana. Si las muescas de dos boxplots no se solapan, es una evidencia de que las medianas son significativamente diferentes.

Interpretación de boxplots

Para interpretar correctamente un boxplot, debemos entender qué representa cada elemento:

  • La caja central abarca desde el primer cuartil (Q1) hasta el tercer cuartil (Q3), conteniendo el 50% central de los datos.
  • La línea dentro de la caja representa la mediana.
  • El rango intercuartílico (IQR) es la altura de la caja (Q3 - Q1).
  • Los bigotes (whiskers) se extienden hasta los valores más extremos dentro de 1.5 × IQR desde Q1 y Q3.
  • Los puntos individuales más allá de los bigotes representan valores atípicos.

Veamos un ejemplo con el conjunto de datos faithful que contiene información sobre las erupciones del géiser Old Faithful:

# Boxplot de la duración de las erupciones
boxplot(faithful$eruptions,
        main = "Duración de erupciones del géiser Old Faithful",
        ylab = "Duración (minutos)",
        col = "orange")

# Añadimos una línea para la media
abline(h = mean(faithful$eruptions), col = "red", lwd = 2, lty = 2)
legend("topright", legend = "Media", col = "red", lwd = 2, lty = 2)

En este boxplot podemos observar:

  • La mediana (línea dentro de la caja) no está en el centro de la caja, lo que indica asimetría.
  • La media (línea punteada roja) es diferente de la mediana, otra señal de asimetría.
  • La presencia de valores atípicos (si los hubiera) nos alertaría sobre observaciones inusuales.

Comparación de grupos con boxplots

Una de las grandes ventajas de los boxplots es que permiten comparar fácilmente distribuciones entre diferentes grupos:

# Comparamos el consumo de combustible según el número de cilindros
boxplot(mpg ~ cyl, data = mtcars,
        main = "Consumo de combustible según número de cilindros",
        xlab = "Número de cilindros",
        ylab = "Millas por galón (mpg)",
        col = c("lightgreen", "lightblue", "salmon"))

Este gráfico nos permite ver cómo el consumo de combustible (mpg) tiende a disminuir a medida que aumenta el número de cilindros.

Boxplots con ggplot2

La librería ggplot2 ofrece mayor flexibilidad para crear boxplots más elegantes:

library(ggplot2)

# Boxplot básico
ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
  geom_boxplot(fill = "lightblue") +
  labs(title = "Consumo de combustible según número de cilindros",
       x = "Número de cilindros",
       y = "Millas por galón (mpg)") +
  theme_minimal()

Podemos añadir puntos individuales para ver la distribución real de los datos:

ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
  geom_boxplot(fill = "lightblue", alpha = 0.7) +
  geom_jitter(width = 0.2, alpha = 0.5, color = "darkblue") +  # Añade puntos con ligero desplazamiento
  labs(title = "Consumo de combustible según número de cilindros",
       x = "Número de cilindros",
       y = "Millas por galón (mpg)") +
  theme_minimal()

Gráficos de violín

Los gráficos de violín combinan las ventajas de los boxplots y las curvas de densidad. Muestran la distribución completa de los datos y, al mismo tiempo, estadísticos clave como la mediana.

Para crear un gráfico de violín con ggplot2:

ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
  geom_violin(fill = "lightblue") +
  labs(title = "Distribución del consumo según número de cilindros",
       x = "Número de cilindros",
       y = "Millas por galón (mpg)") +
  theme_minimal()

La forma del "violín" representa la densidad estimada de los datos a diferentes valores. Las partes más anchas del violín indican valores donde hay más observaciones concentradas.

Combinando violines y boxplots

Una práctica común es combinar gráficos de violín con boxplots para obtener lo mejor de ambos mundos:

ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
  geom_violin(fill = "lightblue", alpha = 0.5) +
  geom_boxplot(width = 0.2, fill = "white", alpha = 0.7) +  # Boxplot más estrecho dentro del violín
  labs(title = "Distribución del consumo según número de cilindros",
       x = "Número de cilindros",
       y = "Millas por galón (mpg)") +
  theme_minimal()

Esta combinación nos permite ver tanto la distribución completa (violín) como los estadísticos clave (boxplot).

Personalización de gráficos de violín

Podemos personalizar los gráficos de violín para mostrar información adicional:

ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
  geom_violin(aes(fill = factor(cyl)), alpha = 0.7) +
  geom_boxplot(width = 0.1, fill = "white", outlier.shape = NA) +  # Ocultamos outliers del boxplot
  stat_summary(fun = "mean", geom = "point", shape = 23, size = 3, fill = "white") +  # Añadimos la media
  scale_fill_manual(values = c("lightgreen", "lightblue", "salmon")) +
  labs(title = "Distribución del consumo según número de cilindros",
       x = "Número de cilindros",
       y = "Millas por galón (mpg)") +
  theme_minimal() +
  theme(legend.position = "none")  # Eliminamos la leyenda

En este gráfico:

  • Los violines muestran la distribución completa
  • Los boxplots internos muestran la mediana y los cuartiles
  • Los puntos blancos representan las medias de cada grupo

Boxplots y violines para detectar distribuciones bimodales

Tanto los boxplots como los gráficos de violín son útiles para detectar distribuciones bimodales (con dos picos), aunque los violines son especialmente efectivos para esto:

# Creamos datos con distribución bimodal
set.seed(123)
datos_bimodales <- c(rnorm(100, mean = 2), rnorm(100, mean = 6))

# Creamos un dataframe
df_bimodal <- data.frame(valor = datos_bimodales)

# Comparamos boxplot y violín
par(mfrow = c(1, 2))  # Dividimos el área de gráfico en 1 fila y 2 columnas

# Boxplot
boxplot(df_bimodal$valor, main = "Boxplot", col = "lightblue")

# Volvemos a la configuración normal
par(mfrow = c(1, 1))

# Gráfico de violín con ggplot2
ggplot(df_bimodal, aes(x = "", y = valor)) +
  geom_violin(fill = "lightblue") +
  geom_boxplot(width = 0.1, fill = "white") +
  labs(title = "Gráfico de violín",
       x = "",
       y = "Valor") +
  theme_minimal()

Observamos que el boxplot no muestra claramente la bimodalidad, mientras que el gráfico de violín revela los dos picos en la distribución.

Aplicación práctica: análisis de datos reales

Veamos un ejemplo con el conjunto de datos iris, que contiene medidas de diferentes especies de flores:

# Boxplots para comparar la longitud del sépalo entre especies
boxplot(Sepal.Length ~ Species, data = iris,
        main = "Longitud del sépalo por especie",
        xlab = "Especie",
        ylab = "Longitud del sépalo (cm)",
        col = c("lightpink", "lightblue", "lightgreen"))

Con ggplot2, podemos crear un gráfico más informativo:

ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species)) +
  geom_violin(alpha = 0.7) +
  geom_boxplot(width = 0.2, alpha = 0.7) +
  scale_fill_manual(values = c("lightpink", "lightblue", "lightgreen")) +
  labs(title = "Distribución de la longitud del sépalo por especie",
       x = "Especie",
       y = "Longitud del sépalo (cm)") +
  theme_minimal() +
  theme(legend.position = "none")

Este gráfico nos permite observar que:

  • Iris setosa tiene sépalos más cortos que las otras especies
  • Iris virginica tiende a tener los sépalos más largos
  • La variabilidad (dispersión) es similar entre las tres especies

Cuándo usar cada tipo de gráfico

  • Boxplots: Son ideales cuando queremos comparar rápidamente estadísticos clave (mediana, cuartiles) entre grupos y detectar valores atípicos.

  • Gráficos de violín: Son mejores cuando queremos ver la forma completa de la distribución, especialmente para detectar bimodalidad o asimetrías.

  • Combinación de ambos: Proporciona la información más completa, mostrando tanto estadísticos clave como la forma de la distribución.

Para datos con pocos puntos, podemos añadir los puntos individuales:

ggplot(mtcars, aes(x = factor(cyl), y = mpg, fill = factor(cyl))) +
  geom_violin(alpha = 0.5) +
  geom_boxplot(width = 0.1, alpha = 0.5) +
  geom_jitter(width = 0.1, alpha = 0.7) +  # Añade puntos individuales
  scale_fill_manual(values = c("lightgreen", "lightblue", "salmon")) +
  labs(title = "Distribución del consumo según número de cilindros",
       x = "Número de cilindros",
       y = "Millas por galón (mpg)") +
  theme_minimal() +
  theme(legend.position = "none")

Este enfoque es especialmente útil cuando trabajamos con conjuntos de datos pequeños, donde cada observación individual es importante.

Aprende R online

Otros ejercicios de programación de R

Evalúa tus conocimientos de esta lección Gráficos univariantes en R con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de R

Accede a todas las lecciones de R y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Instalación De R Y Rstudio

R

Introducción Y Entorno

Introducción A R

R

Introducción Y Entorno

Operadores

R

Sintaxis

Estructuras De Datos

R

Sintaxis

Funciones

R

Sintaxis

Estructuras De Control Iterativo

R

Sintaxis

Scopes Y Closures

R

Sintaxis

Estructuras De Control Condicional

R

Sintaxis

Funciones Anónimas

R

Sintaxis

Tipos De Datos Y Variables

R

Sintaxis

Sistema R6: Clases Referenciales Y Encapsulamiento

R

Programación Orientada A Objetos

Sistema S4: Clases Formales Y Validación

R

Programación Orientada A Objetos

Herencia Y Polimorfismo En R

R

Programación Orientada A Objetos

Sistemas De Oop En R

R

Programación Orientada A Objetos

Sistema S3: Clases Implícitas Y Métodos Genéricos

R

Programación Orientada A Objetos

Tidyverse Para Transformación De Datos

R

Manipulación De Datos

Lubridate Para Fechas Y Tiempo

R

Manipulación De Datos

Group_by Y Summarize Para Agrupación Y Resumen

R

Manipulación De Datos

Stringr Para Expresiones Regulares

R

Manipulación De Datos

Tidyr Para Limpieza De Valores Faltantes

R

Manipulación De Datos

Joins En R Para Combinación Y Relaciones De Tablas

R

Manipulación De Datos

Pivot_longer Y Pivot_wider Para Reestructuración

R

Manipulación De Datos

Mutate Y Transmute Para Transformación

R

Manipulación De Datos

Dplyr Para Filtrado Y Selección

R

Manipulación De Datos

Readr Y Read.csv Para Importar Datos

R

Manipulación De Datos

Gráficos Bivariantes En R

R

Visualización De Datos

Gráficos Univariantes En R

R

Visualización De Datos

Facetas En Ggplot2

R

Visualización De Datos

Personalización Y Temas

R

Visualización De Datos

Ggplot2 Para Visualización De Datos

R

Visualización De Datos

Gráficos Multivariantes En R

R

Visualización De Datos

Correlación En R

R

Estadística

Regresión Lineal En R

R

Estadística

Pruebas De Hipótesis En R

R

Estadística

Anova En R

R

Estadística

Estadística Descriptiva En R

R

Estadística

Accede GRATIS a R y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender y crear histogramas y curvas de densidad para variables numéricas en R.
  • Construir y personalizar gráficos de barras para variables categóricas, incluyendo variables ordinales.
  • Interpretar y comparar distribuciones usando boxplots y gráficos de violín.
  • Utilizar la librería ggplot2 para crear visualizaciones avanzadas y combinadas.
  • Identificar características clave de las distribuciones como asimetría, multimodalidad y valores atípicos mediante gráficos univariantes.