Gráfico 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
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), ")"))
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 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"))
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 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)
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)
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)
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)
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)
smoothScatter(x, y, pch = 19,
transformation = function(x) x ^ 0.5, # Escala
colramp = colorRampPalette(c("#f7f7f7", "aquamarine"))) # Colores
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")))
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)
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
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
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
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
En caso de que tengas grupos que categoricen los datos, puedes crear estimaciones de regresión para cada grupo:
scatterplot(y ~ x | grupo)
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
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)
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)
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)
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
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")
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))
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")
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