InicioGr谩ficosGr谩fico de dispersi贸n en R

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)

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

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 funcion 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
Cabiar 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. Lo mismo para el eje Y, si establece el argumento en "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 puede 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 leyena
  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