Gráfico de dispersión en R

Crea gráficos de dispersión en R

Los diagramas o gráficos de dispersión, también conocidos como nubes de puntos, scatter plots o scatter chart por su nombre en inglés, representan las observaciones de las variables (generalmente dos, pero también pueden ser tres). El uso principal de un gráfico de dispersión en R es verificar visualmente si existe alguna relación entre ciertas variables numéricas.

¿Cómo hacer un gráfico de dispersión en R?

Puedes crear un diagrama de dispersión en R con la función plot, especificando los valores de \(x\) en el primer argumento y los valores de \(y\) en el segundo, siendo \(x\) e \(y\) vectores numéricos de la misma longitud.

Al pasar estos parámetros, la función plot creará un gráfico de dispersión de forma predeterminada. También puedes especificar el símbolo de las observaciones de datos o incluso el color, entre otros parámetros gráficos. Puedes revisar cómo personalizar todos los argumentos disponibles en nuestro tutorial sobre la creación de plots en R.

Considera el modelo \(Y = 2 + 3X ^ 2 + \varepsilon\), siendo \(Y\) la variable dependiente, \(X\) la variable independiente y \(\varepsilon\) un término de error, tal que \(X \sim U (0, 1)\) y \(\varepsilon \sim N (0, 0.25)\).

set.seed(12)

n <- 100
x <- runif(n)
eps <- rnorm(n, 0, 0.25)

y <- 2 + 3 * x^2 + eps

Para dibujar las observaciones generadas podemos escribir:

plot(x, y, pch = 19, col = "black")
plot(y ~ x, pch = 19, col = "black") # Equivalente

Crear un gráfico de dispersión en R

Además, puedes usar la función identify para etiquetar manualmente algunas observaciones del gráfico, por ejemplo, algunos valores atípicos. En el argumento labels puedes especificar las etiquetas que quieras para los puntos.

En el siguiente ejemplo vamos a identificar las coordenadas de los puntos seleccionados. Cuando termines, deberás presionar la tecla Esc. En caso de que necesites buscar más argumentos o explicaciones más detalladas de la función escribe ?identify en la consola de comandos.

identify(y ~ x, labels = paste0("(", round(x, 2), ", ", round(y, 2), ")"))

Etiquetar puntos con la función identify

Nube de puntos en R con colores por grupo

Si tienes una variable que clasifica las observaciones en grupos, puedes establecerla como parámetro del argumento col para dibujar los puntos con diferentes colores dependiendo de su grupo, o incluso establecer diferentes símbolos según el grupo.

grupo <- as.factor(ifelse(x < 0.5, "Grupo 1", "Grupo 2"))
plot(x, y, pch = as.numeric(grupo), col = grupo)

Gráfico de dispersión con colores y símbolos por grupos

Gráfico de dispersión con curva de regresión

Como dijimos en la introducción, el uso principal de los diagramas de dispersión en R es verificar la relación entre variables. Para ese propósito, puedes añadir líneas de regresión (o agregar curvas en caso de estimaciones no lineales) con la función lines, que permite personalizar el ancho de línea con el argumento lwd o el tipo de línea con el argumento lty, entre otros argumentos.

En este ejemplo, vamos a ajustar un modelo lineal y otro no paramétrico con las funciones lm y lowess respectivamente, con los argumentos predeterminados.

plot(x, y, pch = 19, col = "gray52")

# Modelo subyacente
lines(seq(0, 1, 0.05), 2 + 3 * seq(0, 1, 0.05)^2, col = "2", lwd = 3, lty = 2)

# Ajsute lineal
abline(lm(y ~ x), col = "orange", lwd = 3)

# Ajuste suavizado
lines(lowess(x, y), col = "blue", lwd = 3)

# Leyenda
legend("topleft", legend = c("Teórico", "Lineal", "Suavizado"),
       lwd = 3, lty = c(2, 1, 1), col = c("red", "orange", "blue"))

Curvas de regresión en un diagrama de dispersión

Además, puedes agregar la correlación de Pearson que existe entre las variables, calculándola con la función cor. Luego puedes colocar la salida en algunas coordenadas del gráfico con la función text.

# Calculamos la correlación entre las variables
Corr <- cor(x, y)

# Creamos el gráfico y añadimos el valor calculado
plot(x, y, pch = 19)
text(paste("Correlación:", round(Corr, 2)), x = 0.2, y = 4.5)

Añadir correlación de las variables a un gráfico

Añadir múltiples series al gráfico de dispersión

También se pueden agregar más datos al gráfico original con la función points, que añadirá los nuevos puntos sobre el gráfico anterior, respetando la escala original.

set.seed(1)

plot(x, y, pch = 19)

n <- 200

x2 <- runif(n)
y2 <- 2.5 + x2 + rnorm(n, 0, 0.1)

points(x2, y2, col = "green", pch = 19)

Añadir múltiples series de datos a un diagrama de dispersión

También podrías agregar los datos al conjunto de datos original y clasificar las observaciones para dibujar todas al mismo tiempo y con colores diferentes para cada serie.

Diagrama de dispersión en R con barras de error

Agregar barras de error a un gráfico de dispersión en R es bastante sencillo. Considera que tienes 10 grupos con media gaussiana y desviación típica también gaussiana, como en el siguiente ejemplo. Puedes graficar los datos y especificar el límite del eje Y como el rango de la barra inferior y superior. Luego, deberás usar la función arrows de la siguiente manera para crear las barras de error.

mis_datos <- 1:10
media <- rnorm(10)
desv <- rnorm(10, 1, 0.1)

plot(mis_datos, media,
     ylim = range(c(media - desv, media + desv)),
     pch = 16)

# Barras de error
arrows(x0 = mis_datos, y0 = media - desv, x1 = mis_datos, y1 = media + desv,
       length = 0.15, code = 3, angle = 90)

Gráfico de dispersión con barras de error

Diagrama de dispersión conectado en R

Un gráfico de dispersión conectado es similar a un gráfico de líneas, pero los puntos de corte están marcados con puntos u otro símbolo. Para ese propósito, puedes establecer el argumento type como "b" y especificar el símbolo que prefieras con el argumento pch.

Recuerda usar este tipo de gráfico cuando tenga sentido (cuando las variables que quieras dibujar estén ordenadas correctamente), o los resultados no serán los esperados.

set.seed(1)

x3 <- 0:10
y3 <- (0:10) ^ 1.45 + rnorm(11)
y4 <- (0:10) ^ 1.15 + rnorm(11)
y5 <- (0:10) ^ 1.05 + rnorm(11)

plot(x3, y3,  type = "b", col = 2 , lwd = 3, pch = 1)
lines(x3, y4, type = "b", col = 3 , lwd = 3, pch = 1)
lines(x3, y5, type = "b", col = 4 , lwd = 3, pch = 1)

Scatter plot conectado en R

Si prefieres unir los puntos con flechas puedes usar la siguiente función:

# Función para conectar lo puntos con flechas
arrowsPlot <- function(x, y, lwd = 1, col = 1, angle = 20, length = 0.2) {
  invisible(sapply(1:length(x),
    function(i) arrows(x[i], y[i], x[i + 1], y[i + 1], lwd = lwd,
                       col = col, angle = angle, length = length)))
}

plot(x3, y3, col = 2, lwd = 3, pch = "")
arrowsPlot(x3, y3, col = 2, lwd = 3)

lines(x3, y4, col = 3, lwd = 3)
arrowsPlot(x3, y4, col = 3, lwd = 3)

lines(x3, y5, col = 4 , lwd = 3)
arrowsPlot(x3, y5, col = 4 , lwd = 3)

Scatter plot conectado con flechas en R

Este tipo de gráficos también son interesantes cuando quieres mostrar la trayectoria que dibujan dos variables a lo largo del tiempo.

Considera, como ilustración, que deseas mostrar la popularidad de un artista frente a los álbumes vendidos a lo largo del tiempo. Podrías dibujar algo como lo siguiente:

# Datos de ejemplo
x4 <- ifelse(x3 < 5, x3, rev(x3 / 3))
y5 <- ifelse(y3 < 5, y3 ^ 3, rev(y3 + 5))

# Creando el gráfico de puntos conectados
plot(x4, y5, yaxt = "n", xaxt = "n", pch = "",
     xlab = "Popularidad", ylab = "Ventas", xlim = c(-1, 5.5))
arrowsPlot(x4, y5, col = 3, lwd = 3)

# Añadiendo los años a cada punto
text(x4 + 0.3, y5, 1970:1980)

Gráfico de dispersión con flechas

Diagrama de dispersión suavizado

La función smoothScatter es una función de R base que colorea el diagrama de dispersión según una estimación tipo núcleo de la densidad.

Los siguientes ejemplos muestran cómo usar los argumentos más básicos de la función. Ten en cuenta que, como otros métodos no paramétricos, deberás seleccionar una ventana. Aunque la función proporciona un ventana predeterminada, puedes personalizarla con el argumento de bandwidth.

smoothScatter(x, y)

Gráfico de dispersión suavizado con la función smoothscatter

smoothScatter(x, y, pch = 19,
              transformation = function(x) x ^ 0.5, # Escala
              colramp = colorRampPalette(c("#f7f7f7", "aquamarine"))) # Colores

Nube de puntos suavizada con la función smoothScatter

Mapa de calor con un scatterplot

Con la función smoothScatter también puedes crear un mapa de calor. Para ello, deberás especificar una paleta de colores de la siguiente manera:

smoothScatter(x, y, transformation = function(x) x ^ 0.4,
              colramp = colorRampPalette(c("#000099", "#00FEFF", "#45FE4F",
                                           "#FCFF00", "#FF9400", "#FF3100")))

Mapa de calor en R

Incluso puedes agregar curvas de nivel con la función contour.

# install.packages("MASS")
library(MASS)
kern <- kde2d(x, y)

contour(kern, drawlabels = FALSE, nlevels = 6,
        col = rev(heat.colors(6)), add = TRUE, lwd = 3)

Mapa de calor en R con curvas de nivel

La función scatterplot

Una alternativa para crear gráficos de dispersión en R es usar la función scatterplot del paquete car, que muestra automáticamente las curvas de regresión y permite agregar boxplots marginales al diagrama de dispersión.

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

scatterplot(y ~ x)
scatterplot(x, y) # Equivalente

Ejemplo de la función scatterplot en R

Por defecto, la función dibuja tres estimaciones (estimación de la media lineal y no paramétrica y la varianza condicional) con gráficos de de caja marginales, todo con el mismo color.

Para personalizar el diagrama de dispersión, utiliza los argumentos col y pch para cambiar el color y el símbolo de los puntos, respectivamente. Además, puedes pasar los argumentos como lista a los argumentos regLine y smooth para personalizar los parámetros gráficos de las estimaciones correspondientes.

scatterplot(x, y,
           col = 1,   # Color de los puntos
           pch = 15,  # Símbolo
           regLine = list(col = "green", # Color de la regresión lineal
                          lwd = 3),      # Ancho de la línea
           smooth = list(col.smooth = "red",   # Color de la estimación no paramétrica de la media
                         col.spread = "blue")) # Color de la estimación no paramétrica de la varianza

Cambiar los colores de las estimaciones en la función scatterplot del paquete car

Asimismo, en caso de que quieras eliminar alguna de las estimaciones, establece el argumento correspondiente como FALSE.

scatterplot(x, y,
            smooth = FALSE,  # Borra la estimación suavizada
            regLine = FALSE) # Borra la estimación lineal

Eliminar estimaciones en la función scatterplot del paquete car

También puedes poner un solo boxplot marginal con el argumento boxplots, que por defecto es "xy". Si lo configuras como "x", solo se mostrará el diagrama de caja del eje X y si establece el argumento en "y" solo se mostrará el del eje Y. Si no quieres ningún diagrama de caja, pasa "" al argumento.

scatterplot(x, y,
            boxplots = "x") # Boxplot marginal del eje X

Agregar o eliminar boxplots del gráfico de dispersión de la función scatterplot

En caso de que tengas grupos que categoricen los datos, puedes crear estimaciones de regresión para cada grupo:

scatterplot(y ~ x | grupo)

Función scatterplot por grupos en R

Ten en cuenta que puedes deshabilitar la leyenda estableciendo legend = FALSE.

Además, puedes deshabilitar el grid o agregar una elipse con los argumentos grid y ellipse, respectivamente.

scatterplot(x, y,
            grid = FALSE,   # Eliminar el grid
            ellipse = TRUE) # Dibujar elipses

Añadir elipses a un gráfico de dispersión en R

Hay más argumentos que puedes personalizar, así que recuerda escribir ?scatterplot para obtener detalles adicionales.

Matriz de dispersión en R

Cuando se trabaja con múltiples variables, es común dibujar múltiples diagramas de dispersión dentro de una matriz de dispersión, que mostrarán cada variable frente a otra para visualizar la correlación entre las variables.

En R se puede crear un diagrama de dispersión con múltiples variables con la función pairs. El nombre de la función viene del inglés (pares), ya que estos gráficos también se conocen como “diagramas de dispersión por pares”.

pairs(~disp + wt + mpg + hp, data = mtcars)

Matriz de dispersión con la función pairs

Además, en caso de que tu conjunto de datos contenga una variable de tipo factor, puedes especificar la variable en el argumento col de la siguiente manera para dibujar los grupos con un color diferente.

 pairs(~disp + wt + mpg + hp, col = factor(mtcars$am), pch = 19, data = mtcars)

Matriz de dispersión en R con colores por grupo

Una alternativa es utilizar la función scatterplotMatrix del paquete car, que añade estimaciones de densidad tipo kernel en la diagonal.

install.packages("car")
library(car)

scatterplotMatrix(~ disp + wt + mpg + hp, data = mtcars)

Ejemplo de uso de la función scatterplotMatrix en R

Para personalizarlo podemos usar los argumentos correspondientes:

scatterplotMatrix(~ disp + wt + mpg + hp, data = mtcars,
                  diagonal = FALSE,             # Eliminar las estimaciones tipo núcleo
                  regLine = list(col = "green", # Color de la línea de regresión
                                 lwd = 3),      # Ancho de la línea de regresión
                  smooth = list(col.smooth = "red",   # Color de la media no paramétrica
                                col.spread = "blue")) # Color de la varianza no paramétrica

Cambiar los colores de la función scatterplotMatrix

Otra alternativa es utilizar la función cpairs del paquete gclus.

# install.packages("gclus")
library(gclus)
data <- mtcars[c(1, 3, 5, 6)] # Variables numéricas
# cpairs(data) # Alternativa a pairs()

corr <- abs(cor(data)) # Correlación en valor absoluto
corr
colors <- dmat.color(corr)
order <- order.single(corr)

cpairs(data, order, panel.colors = colors, gap = 0.5,
       main = "Variables ordenadas y coloreadas por correlación")

Función cpairs en R del paquete gclus

Scatter plot en ggplot2

La creación de un gráfico de dispersión con la librería ggplot2 se puede lograr con la función geom_point. Además, puedes dividir los grupos por color pasando la función aes con el grupo como parámetro del argumento colour.

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

mi_df <- data.frame(x = x, y = y, grupo = grupo)

ggplot(mi_df, aes(x = x, y = y)) +
  geom_point(aes(colour = grupo)) + # Puntos y colores por grupo
  scale_color_discrete("Grupos") +  # Cambiar el título de la leyenda
  xlab("Variable X") +              # Etiqueta del eje X
  ylab("Variable Y")  +             # Etiqueta del eje Y
  theme(axis.line = element_line(colour = "black", # Cambia el tema por defecto
                                 size = 0.24))

Diagrama de dispersión con el paquete ggplot2

Gráfico de dispersión 3D

Con las librerías scatterplot3d y rgl se pueden crear gráficos de dispersión 3D en R. La función scatterplot3d permite crear un gráfico 3D estático de tres variables. Puedes ver la lista completa de argumentos de la función ejecutando ?scatterplot3d.

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

set.seed(2)
x <- rnorm(1000)
y <- rnorm(1000, mean = 100)
z <- rnorm(1000)

scatterplot3d(x, y, z, pch = 19, color = "blue")

Función scatterplot3d para crear un gráfico de dispersión 3D en R

Una alternativa es utilizar la función plot3d del paquete rgl que permite una visualización interactiva. Puedes rotar, acercar y alejar el diagrama de dispersión. Esto es muy útil para buscar patrones en datos tridimensionales.

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

plot3d(x, y, z,      # Datos
       type = "s",   # Tipo de gráfico
       radius = 0.1, # Radio de las observaciones
       col = "lightblue",   # Color de las observaciones
       xlab ="X axis lab",  # Etiqueta del eje X
       ylab = "Y axis lab", # Etiqueta del eje Y
       zlab = "Z axis lab") # Etiqueta del eje Z

Función plot3d del paquete rgl de R