13  Sistema Gráfico Base de R

La representación gráfica de la información constituye un componente indispensable para la comprensión, la comunicación y la validación de resultados estadísticos. El sistema gráfico base de R ofrece un conjunto de herramientas versátiles que permiten construir visualizaciones de alta calidad siguiendo un enfoque incremental, en el cual cada elemento puede añadirse o modificarse de forma independiente (Murrell, 2018). A continuación se describe, de manera detallada y pedagógica, la arquitectura de este sistema y las funciones esenciales para el análisis exploratorio y la comprobación de supuestos en la estadística clásica.

El propósito principal de la visualización es facilitar la detección de patrones, tendencias y anomalías que resultan difíciles de advertir mediante inspección numérica (Cleveland, 1993). Además, las gráficas permiten evaluar supuestos tales como normalidad, homocedasticidad y linealidad, que son cruciales para la validez de métodos paramétricos como la regresión lineal y el ANOVA (Venables & Ripley, 2002). Bajo esta perspectiva, la elaboración de gráficos debe regirse por principios de claridad, precisión y economía visual (Tufte, 2001).

13.1 Arquitectura del sistema gráfico base

El sistema gráfico base de R se sustenta en tres principios operativos:

  1. Modularidad: cada elemento (ejes, marcas, títulos, objetos geométricos) puede añadirse o modificarse sin rehacer el gráfico desde cero.

  2. Jerarquía: los componentes se dibujan en capas sucesivas sobre un “lienzo” inicial.

  3. Persistencia: las modificaciones se aplican sobre el dispositivo gráfico activo hasta que este se cierra o se restablecen los parámetros originales (Murrell, 2018).

# Ejemplo ilustrativo de construcción modular
plot(NULL,                         # Lienzo vacío
     xlim = c(0, 10), ylim = c(0, 10),
     xlab = "Eje X", ylab = "Eje Y",
     main = "Demostración de modularidad")

grid(col = "gray90")               # Capa 1: cuadrícula

# Capa 2: puntos de datos simulados
set.seed(123)
x <- runif(50, 0, 10)
y <- 0.8 * x + rnorm(50, 0, 1)
points(x, y, pch = 16, col = "navy")

# Capa 3: línea de tendencia
abline(lm(y ~ x), col = "red", lwd = 2, lty = 2)

13.2 Funciones gráficas básicas de R

El sistema gráfico base de R constituye una de las herramientas más accesibles y versátiles para la visualización de datos en estadística clásica. Estas funciones permiten crear gráficos de manera rápida y flexible, facilitando tanto la exploración inicial de los datos como la comprobación de supuestos estadísticos fundamentales. El enfoque de R base se basa en la construcción secuencial de gráficos, donde cada elemento puede ser añadido o modificado mediante argumentos y funciones auxiliares, lo que resulta especialmente útil en el análisis exploratorio y diagnóstico (Murrell, 2018; Venables & Ripley, 2002).

Entre las funciones más utilizadas se encuentran:

  1. plot(): función genérica para gráficos de dispersión, líneas y otros tipos de visualizaciones.

  2. hist(): para la creación de histogramas que muestran la distribución de variables cuantitativas.

  3. boxplot(): para diagramas de caja que resumen la dispersión y los valores atípicos.

  4. barplot(): para gráficos de barras de frecuencias o proporciones.

  5. qqnorm() y qqline(): para gráficos Q-Q que evalúan la normalidad de los datos.

  6. pairs(): para matrices de gráficos de dispersión entre varias variables.

Estas funciones son la base para la mayoría de los análisis gráficos en estadística clásica, permitiendo una rápida inspección visual de los datos y la validación de supuestos (Venables & Ripley, 2002).

13.3 Funciones esenciales para la exploración de datos

La exploración visual de los datos es una etapa fundamental en cualquier análisis estadístico, ya que permite identificar patrones, tendencias, anomalías y posibles errores en los datos antes de aplicar modelos formales. El sistema gráfico base de R proporciona funciones versátiles y personalizables para la creación de gráficos exploratorios, facilitando la comprensión y la comunicación de los resultados (Venables & Ripley, 2002; Murrell, 2018).

13.3.1 Histogramas

El histograma es una herramienta gráfica que permite representar la distribución de una variable numérica, facilitando la identificación de asimetrías, curtosis, valores atípicos y posibles multimodalidades (Cleveland, 1993). En R, la función principal para crear histogramas es hist().

Sintaxis general:

hist(x, 
     breaks = "Sturges", 
     freq = TRUE, 
     col = NULL, 
     border = NULL, 
     main = NULL, 
     xlab = NULL, 
     ylab = NULL, 
     ...)

Explicación de los argumentos principales:

  1. x: Vector numérico con los datos a graficar.

  2. breaks: Define el número de intervalos (bins) o el método para calcularlos. Puede ser un número, un vector de puntos de corte, o un método como “Sturges”, “Scott”, “FD”.

  3. freq: Si es TRUE, el eje Y muestra frecuencias absolutas; si es FALSE, muestra densidades.

  4. col: Color de las barras.

  5. border: Color del borde de las barras.

  6. main: Título principal del gráfico.

  7. xlab, ylab: Etiquetas de los ejes X e Y.

  8. : Otros argumentos gráficos adicionales.

Ejemplo:

# Simulación de datos: calificaciones de 200 estudiantes
set.seed(123)
notas <- rnorm(200, mean = 70, sd = 10)

# Creación de un histograma personalizado
hist(notas,
     breaks = 15,         # Número de intervalos (bins)
     freq = TRUE,         # Mostrar frecuencias absolutas en el eje Y
     col = "lightblue",   # Color de las barras
     border = "darkblue", # Color del borde de las barras
     main = "Histograma de calificaciones", # Título principal
     xlab = "Puntaje",    # Etiqueta del eje X
     ylab = "Frecuencia") # Etiqueta del eje Y

La elección del número de intervalos (breaks) es crucial para evitar interpretaciones erróneas: intervalos muy amplios pueden ocultar detalles importantes, mientras que intervalos muy estrechos pueden generar ruido visual (Venables & Ripley, 2002).

13.3.2 Diagramas de caja (boxplots)

El diagrama de caja, o boxplot, es una herramienta gráfica que resume la dispersión, la mediana y la presencia de valores atípicos en una o varias muestras. Es especialmente útil para comparar grupos y detectar asimetrías (Tukey, 1977).

Sintaxis general:

boxplot(formula, 
        data = NULL, 
        main = NULL, 
        xlab = NULL, 
        ylab = NULL, 
        col = NULL, 
        border = NULL, 
        notch = FALSE, 
        outline = TRUE, 
        ...)
  1. formula: Expresión del tipo y ~ grupo para comparar grupos.

  2. data: Data frame donde buscar las variables.

  3. main, xlab, ylab: Títulos y etiquetas.

  4. col: Colores de las cajas.

  5. border: Color del borde de las cajas.

  6. notch: Si es TRUE, añade una muesca para comparar medianas.

  7. outline: Si es TRUE, muestra valores atípicos.

  8. : Otros argumentos gráficos.

Ejemplo:

# Simulación de datos para dos grupos
set.seed(123)
grupo <- factor(rep(c("Control", "Tratamiento"), each = 100))
valores <- c(rnorm(100, 70, 8), rnorm(100, 75, 10))

# Creación de un boxplot personalizado
boxplot(valores ~ grupo,
        main = "Comparación entre Grupos",
        xlab = "Grupo",
        ylab = "Valores",
        col = c("lightgreen", "lightcoral"), # Colores para cada grupo
        border = "darkgray",          # Color del borde
        notch = TRUE,                 # Muesca para comparar medianas
        outline = TRUE)               # Mostrar valores atípicos

La muesca en el boxplot ayuda a comparar visualmente las medianas: si las muescas no se superponen, existe evidencia de diferencia significativa entre los grupos (Murrell, 2018).

13.3.3 Gráficos de dispersión

El gráfico de dispersión es fundamental para analizar la relación entre dos variables cuantitativas, permitiendo identificar tendencias lineales, no lineales, agrupamientos y valores atípicos (Cleveland, 1993).

Sintaxis general:

plot(x, y, 
     type = "p", 
     main = NULL, 
     sub = NULL, 
     xlab = NULL, 
     ylab = NULL, 
     pch = 1, 
     col = NULL, 
     cex = 1, 
     ...)

Explicación de los argumentos principales:

  1. x, y: Vectores numéricos de igual longitud.

  2. type: Tipo de gráfico (“p” para puntos, “l” para líneas, “b” para ambos).

  3. main, sub: Título principal y subtítulo.

  4. xlab, ylab: Etiquetas de los ejes.

  5. pch: Tipo de símbolo para los puntos (1: círculo, 16: círculo sólido, 17: triángulo, etc.).

  6. col: Color de los puntos.

  7. cex: Tamaño relativo de los puntos.

  8. : Otros argumentos gráficos.

Ejemplo:

# Simulación de datos correlacionados
set.seed(123)
x <- rnorm(100, mean = 10, sd = 2)
y <- 2 * x + rnorm(100, 0, 3)

# Gráfico de dispersión personalizado
plot(x, y,
     type = "p",                  # Tipo de gráfico: puntos
     main = "Relación entre X e Y",
     sub = "Datos simulados",
     xlab = "Variable X",
     ylab = "Variable Y",
     pch = 16,                    # Círculo sólido
     col = "navy",                # Color de los puntos
     cex = 1.2)                   # Tamaño de los puntos

# Añadir línea de regresión lineal
abline(lm(y ~ x), col = "red", lwd = 2, lty = 2)

La adición de la línea de regresión ayuda a identificar la dirección y fuerza de la relación entre las variables (Venables & Ripley, 2002).

13.3.4 Gráficos de líneas

Los gráficos de líneas son ideales para representar la evolución de una variable a lo largo del tiempo o en función de un orden secuencial, permitiendo detectar tendencias, ciclos y cambios abruptos (Murrell, 2018).

plot(x, y, 
     type = "l", 
     main = NULL, 
     xlab = NULL, 
     ylab = NULL, 
     col = NULL, 
     lwd = 1, 
     ...)
  1. type = “l”: Dibuja una línea.

  2. lwd: Grosor de la línea.

Ejemplo:

# Simulación de una serie temporal
set.seed(123)
tiempo <- 1:50
medidas <- cumsum(rnorm(50))

# Gráfico de líneas
plot(tiempo, medidas,
     type = "l",                  # Tipo de gráfico: línea
     main = "Serie temporal simulada",
     xlab = "Tiempo",
     ylab = "Medida",
     col = "darkred",
     lwd = 2)                     # Grosor de la línea

# Añadir puntos sobre la línea para enfatizar cada observación
points(tiempo, medidas, pch = 16, col = "black")

La combinación de líneas y puntos facilita la identificación de valores individuales y la tendencia global de la serie.

13.4 Visualización para la comprobación de supuestos estadísticos

La validación gráfica de los supuestos estadísticos es un paso esencial para garantizar la validez de los análisis en la estadística clásica. Antes de aplicar pruebas como ANOVA o modelos de regresión lineal, es fundamental verificar visualmente la normalidad, la homocedasticidad y la linealidad de los datos. El sistema gráfico base de R proporciona herramientas específicas para evaluar estos supuestos de manera eficiente y pedagógica (Venables & Ripley, 2002; Murrell, 2018).

13.4.1 Gráficos Q-Q: Evaluación visual de la normalidad

El gráfico Q-Q (quantile-quantile) es una herramienta visual poderosa para comparar la distribución de los datos observados con una distribución teórica, generalmente la normal. Si los puntos del gráfico se alinean sobre la diagonal, se puede inferir que los datos siguen la distribución de referencia. Las desviaciones sistemáticas de esta línea indican alejamientos de la normalidad, lo que puede requerir transformaciones de los datos o el uso de métodos no paramétricos (Cleveland, 1993).

Sintaxis básica y explicación:

  1. qqnorm(): Genera el gráfico Q-Q de los datos frente a la normal.

  2. qqline(): Añade la línea de referencia teórica.

Ejemplo:

# Simulación de tres conjuntos de datos con diferentes distribuciones
set.seed(123)
# Datos con distribución normal
datos_normales <- rnorm(100, mean = 0, sd = 1)   
# Datos con distribución exponencial (asimétrica)
datos_asimetricos <- rexp(100, rate = 1)        
# Datos con distribución uniforme
datos_uniformes <- runif(100, min = -3, max = 3)   

# Configuración para mostrar tres gráficos en una fila
par(mfrow = c(1, 3))

# Gráfico Q-Q para datos normales
qqnorm(datos_normales,
       main = "Normal",
       pch = 16,                # Círculo sólido
       col = "navy")            # Color de los puntos
qqline(datos_normales, col = "red", lwd = 2)  # Línea de referencia

# Gráfico Q-Q para datos asimétricos
qqnorm(datos_asimetricos,
       main = "Exponencial",
       pch = 16,
       col = "darkgreen")
qqline(datos_asimetricos, col = "red", lwd = 2)

# Gráfico Q-Q para datos uniformes
qqnorm(datos_uniformes,
       main = "Uniforme",
       pch = 16,
       col = "purple")
qqline(datos_uniformes, col = "red", lwd = 2)

# Restaurar la configuración original de la ventana gráfica
par(mfrow = c(1, 1))

La interpretación de estos gráficos se basa en el patrón que forman los puntos en relación con la línea de referencia. Según Venables & Ripley (2002), las desviaciones más comunes incluyen:

  1. Colas pesadas: cuando los extremos se alejan de la línea.

  2. Asimetría: cuando se forma un patrón curvilíneo.

  3. Bimodalidad: cuando aparece un patrón en forma de S.

13.4.2 Gráficos de diagnóstico para modelos de regresión

La regresión lineal clásica asume linealidad, normalidad de los residuos, homocedasticidad (varianza constante) e independencia. R facilita la evaluación simultánea de estos supuestos mediante gráficos de diagnóstico automáticos generados con la función plot() aplicada a objetos de clase lm (Murrell, 2018).

Ejemplo:

# Simulación de datos para regresión lineal
set.seed(123)
x <- seq(1, 100)                    # Variable predictora
y <- 2 * x + rnorm(100, 0, 10)      # Variable respuesta
datos <- data.frame(x = x, y = y)   # Crear data frame

# Ajuste del modelo de regresión lineal
modelo <- lm(y ~ x, data = datos)          # Ajustar modelo

# Configuración de la ventana gráfica para mostrar cuatro gráficos
par(mfrow = c(2, 2))
plot(modelo)                               # Generar gráficos diagnósticos

par(mfrow = c(1, 1))                       # Restaurar configuración

Descripción e interpretación de los gráficos generados:

  1. Residuos vs valores ajustados: Permite evaluar la linealidad y la homogeneidad de la varianza. Un patrón aleatorio indica que se cumplen los supuestos; patrones sistemáticos sugieren problemas de especificación del modelo.

  2. Q-Q de residuos: Evalúa la normalidad de los residuos. Desviaciones de la línea diagonal indican que los residuos no son normales.

  3. Scale-Location (raíz cuadrada de los residuos estandarizados vs valores ajustados): Permite examinar la homogeneidad de la varianza. Una banda horizontal indica homogeneidad de la varianza.

  4. Residuos vs leverage: Identifica observaciones influyentes. Puntos alejados o con gran leverage pueden indicar outliers o casos influyentes que afectan el ajuste del modelo (Murrell, 2018).

13.5 Personalización de gráficos en R base

La personalización de gráficos es un aspecto fundamental para lograr visualizaciones claras, informativas y estéticamente agradables. En el sistema gráfico base de R, la personalización se realiza mediante la modificación de los argumentos de las funciones gráficas principales y la incorporación de elementos adicionales a través de funciones auxiliares. Esta flexibilidad permite adaptar cada gráfico a las necesidades específicas del análisis y a los estándares de comunicación científica (Murrell, 2018).

13.5.1 Argumentos y funciones clave para la personalización

A continuación se describen los argumentos y funciones más relevantes para la personalización de gráficos en R base:

  1. main, sub, xlab, ylab: Permiten definir el título principal, subtítulo y las etiquetas de los ejes X e Y, respectivamente, facilitando la interpretación del gráfico.

  2. col, border, pch, lty, lwd: Controlan el color de los elementos, el color del borde, el tipo de símbolo para los puntos, el tipo de línea y el grosor de las líneas, respectivamente.

  3. cex, cex.axis, cex.lab, cex.main: Ajustan el tamaño relativo de los símbolos, los textos de los ejes, las etiquetas y el título principal.

  4. legend(): Añade leyendas explicativas en posiciones específicas del gráfico, mejorando la comprensión de los elementos representados.

  5. text(): Permite agregar texto en coordenadas específicas, útil para destacar valores o anotar observaciones relevantes.

  6. abline(): Añade líneas horizontales, verticales o de regresión, facilitando la identificación de tendencias o referencias.

  7. grid(): Incorpora una cuadrícula de fondo, lo que ayuda a la lectura precisa de las coordenadas y la comparación visual de los datos.

13.5.2 Ejemplo integral

A continuación se presenta un ejemplo completo que ilustra cómo combinar estos argumentos y funciones para lograr una visualización profesional y clara:

# Simulación de datos para el ejemplo
set.seed(123)
x <- rnorm(100, mean = 10, sd = 2)
y <- 2 * x + rnorm(100, 0, 3)

# Gráfico de dispersión personalizado
plot(x, y,
     main = "Gráfico personalizado",  # Título principal
     sub = "Datos simulados",         # Subtítulo
     xlab = "Variable X",             # Etiqueta eje X
     ylab = "Variable Y",             # Etiqueta eje Y
     col = "black",                   # Color de los puntos
     pch = 18,                        # Símbolo: rombo sólido
     cex = 1.5,                       # Tamaño de los puntos
     cex.main = 1.2,                  # Tamaño del título
     cex.lab = 1.1)                   # Tamaño de las etiquetas

# Añadir línea de regresión lineal
abline(lm(y ~ x), col = "red", lwd = 2, lty = 2)  # Línea de tendencia

# Añadir leyenda explicativa
legend("topleft",
       legend = c("Datos", "Ajuste lineal"),
       pch = c(18, NA),               # Símbolo para los datos
       lty = c(NA, 2),                # Línea discontinua para el ajuste
       col = c("black", "red"),
       bty = "n",                     # Sin borde en la leyenda
       cex = 0.8)                     # Tamaño de la leyenda

# Añadir cuadrícula de fondo
## Cuadrícula con líneas punteadas grises
grid(col = "gray80", lty = "dotted")     

La personalización adecuada de los gráficos no solo mejora la estética, sino que también facilita la interpretación y la comunicación de los resultados, permitiendo resaltar los aspectos más relevantes del análisis (Murrell, 2018; Venables & Ripley, 2002).