Gráfico de líneas en R
Los gráficos de líneas muestran datos ordenados conectados con líneas rectas (segmentos). En este tutorial aprenderás a dibujar gráficos de líneas en R base utilizando las funciones plot
, lines
, matplot
, matlines
y curve
, así como a modificar el estilo de los gráficos resultantes.
Dibujando un gráfico de líneas en R con la función plot
En R base se puede crear un gráfico de líneas con la función plot. Considera que tienes los datos que se muestran en la siguiente tabla:
x | y |
---|---|
1 | 200 |
2 | 400 |
3 | 600 |
4 | 700 |
5 | 500 |
Puedes dibujar los datos anteriores usando tres métodos diferentes: especificándolos como dos vectores, pasando los datos como data frame o como fórmula. Ten en cuenta que establecimos type = "l"
para conectar las observaciones con segmentos.
# Datos
x <- c(1, 2, 3, 4, 5)
y <- c(200, 300, 600, 700, 500)
# Vectores
plot(x, y, type = "l")
# Data frame
plot(data.frame(x, y), type = "l") # Equivalente
# Fórmula
plot(y ~ x, type = "l") # Equivalente
El estilo de los gráficos de líneas en R se puede personalizar configurando los parámetros gráficos. Por ejemplo, el color y el ancho de línea se pueden modificar con los argumentos col
y lwd
, respectivamente.
plot(x, y, type = "l",
col = "lightblue", # Color
lwd = 5) # Ancho de línea
Tipos de gráficos de líneas
Además de type = "l"
, existen tres tipos más de gráficos de líneas disponibles en R base. Estableciendo type = "s"
se creará un gráfico de escalera, type = "b"
creará un gráfico con segmentos y puntos y type = "o"
también mostrará segmentos y puntos, pero la línea aparecerá por encima de los puntos.
par(mfrow = c(1, 3))
plot(x, y, type = "s", main = 'type = "s"')
plot(x, y, type = "b", main = 'type = "b"')
plot(x, y, type = "o", main = 'type = "o"')
par(mfrow = c(1, 1))
Además, existen seis tipos diferentes de líneas, que pueden ser especificadas haciendo uso del argumento lty
, desde 1 hasta 6:
par(mfrow = c(2, 3))
plot(x, y, type = "l", lwd = 2, lty = 1, main = "lty = 1")
plot(x, y, type = "l", lwd = 2, lty = 2, main = "lty = 2")
plot(x, y, type = "l", lwd = 2, lty = 3, main = "lty = 3")
plot(x, y, type = "l", lwd = 2, lty = 4, main = "lty = 4")
plot(x, y, type = "l", lwd = 2, lty = 5, main = "lty = 5")
plot(x, y, type = "l", lwd = 2, lty = 6, main = "lty = 6")
par(mfrow = c(1, 1))
También puedes especificar el símbolo utilizado cuando type = "b"
o type = "o"
. Estos símbolos, también llamados símbolos pch, pueden ser seleccionados con el argumento pch
, que toma valores desde 0 (cuadrado) hasta 25. Consulta la lista de símbolos pch para más información. Los símbolos 1 a 25 son:
El color del símbolo se puede especificar con el argumento col
, que también modificará el color de la línea.
plot(x, y, type = "b", cex = 2, pch = 21, bg = "blue", col = "red")
Los símbolos 21 a 25 se pueden especificar con un color de fondo (distinto al del borde), haciendo uso del argumento bg
.
Sin embargo, también puedes agregar los puntos de forma separada utilizando la función points
. Este procedimiento permitirá personalizar todos los colores como quieras.
plot(x, y, type = "l",
col = "red") # Color de la línea
# Agregando puntos
points(x, y, # Coordenadas
pch = 21, # Símbolo
cex = 2, # Tamaño del símbolo
bg = "green", # Color de fondo del símbolo
col = "blue", # Color del borde del símbolo
lwd = 3) # Ancho del borde del símbolo
Ten en cuenta que el argumento pch
también permite introducir caracteres, pero solo uno. En el siguiente ejemplo estamos pasando las primeras cinco letras del abecedario.
plot(x, y, type = "b",
pch = LETTERS[1:5], # Letras como símbolos
cex = 2, # Tamaño de los símbolos
col = 1:5, # colores pch
xlim = c(0, 6), # Límites del eje X
ylim = c(150, 750)) # Límites del eje Y
Agregando anotaciones al gráfico
En caso de que necesites hacer algunas anotaciones en el gráfico puedes utilizar la función text
, cuyo primer argumento es la coordenada del eje X, el segundo la del eje Y y el tercero la anotación.
plot(x, y, type = "l")
text(x = 3.5, y = 250, "Anotación personalizada")
También puedes etiquetar cada punto, pasando un vector de etiquetas:
etiquetas <- c("Texto 1", "Texto 2", "Texto 3", "Texto 4", "Texto 5")
plot(x, y, type = "l",
xlim = c(0.5, 5.5), # Límite eje X
ylim = c(150, 750)) # Límite eje Y
text(x = x, y = y, etiquetas, col = "red")
La función curve
En la sección anterior revisamos cómo crear un gráfico de líneas con los datos disponibles, pero en algunos escenarios necesitaremos crear un gráfico de líneas a partir de una función. Para ello podemos utilizar la función curve
, especificando la función que queremos dibujar y el rango de valores del eje X con en los argumentos from
(el mínimo) y to
(el máximo). Por ejemplo, podemos dibujar las funciones seno y coseno:
curve(cos, # Función coseno
from = 0, # Desde 0
to = 10, # Hasta 10
ylab = "",
main = "Seno y coseno")
# Nueva curva sobre la primera
curve(sin, from = 0, to = 10,
col = 2, # Color de la segunda curva
add = TRUE) # Necesario para agregar la curva sobre la primera
Ten en cuenta que también puedes crear un gráfico de líneas con una función propia.
# Función propia
fun <- function(x){
return(x ^ 3)
}
# Gráfico de nuestra función
curve(fun, from = -5, to = 5, ylab = expression(x^3),
main = "Función curve")
Múltiples líneas
Si tienes más variables puedes añadirlas al mismo gráfico con la función lines
. Como ejemplo, si tienes otra variable llamada y2
, puedes crear un gráfico de líneas de dos variables con el siguiente código:
# Más datos
y2 <- c(300, 400, 450, 400, 250)
# Primera línea
plot(x, y, type = "l")
# Segunda línea
lines(x, y2, type = "l", col = 2) # Mismos valores de X
Ten en cuenta que la función lines
no está diseñada para crear un gráfico por si misma, sino que agrega una nueva capa al gráfico ya creado.
Las funciones matplot y matlines
Una mejor manera de crear gráficos de líneas a partir de un data frame o una matriz con múltiples variables es utilizar la función matplot
. Considera que tienes los siguientes datos normales multivariantes:
# install.packages("MASS")
library(MASS) # Para la función mvrnorm
set.seed(1)
# Datos normales multivariantes
medias <- rep(0, 5)
varianzas <- matrix(1:25, ncol = 5)
datos <- data.frame(mvrnorm(n = 10, mu = medias, Sigma = varianzas))
# Seis primeras filas
head(datos)
X1 X2 X3 X4 X5
1 0.9290410 -1.5584821 1.6540593 2.65356974 4.6452049
2 -0.1720333 -1.4431276 -0.8738552 -0.06321522 -0.8601666
3 0.6801899 2.2411593 3.7697473 3.34137647 3.4009497
4 -1.8517645 0.4274748 -3.5673172 -8.44912188 -9.2588224
5 -0.1966158 -1.7617016 -3.0887668 -0.01224664 -0.9830791
6 0.7674637 2.1241256 2.4990073 3.68081631 3.8373183
Con esta función puedes dibujar todas las variables a la vez:
# Dibujar todas las columnas a la vez
matplot(datos, type = "l", main = "Función matplot")
De manera equivalente a la función lines
, matlines
permite agregar nuevas líneas al gráfico existente. Por ejemplo, podrías dibujar las tres primeras columnas de tus datos con la función matplot
y luego agregar las dos últimas con matlines
.
# Tres primeras columnas del data frame
datos1 <- datos[, 1:3]
# Gráfico de las tres columnas
matplot(datos1, type = "l", lty = 1,
ylab = "datos",
ylim = c(min(datos), max(datos))) # Límites del eje Y
# Dos últimas columnas del data frame
datos2 <- datos[, 4:5]
# Agregamos datos2 al gráfico anterior
matlines(datos2, type = "l", lty = 1, col = 4:5)
Gráfico de líneas con datos categóricos
Además de crear gráficos de líneas con variables numéricas, también es posible crearlos si tenemos una variable de tipo factor (categórica). Considera los siguientes datos de ejemplo:
# Datos
datos <- data.frame(grupo = as.factor(c("Grupo 1", "Grupo 2", "Grupo 3")),
var1 = c(1, 3, 2),
var2 = c(2, 1.5, 1.75))
head(datos)
grupo var1 var2
1 Grupo 1 1 2.00
2 Grupo 2 3 1.50
3 Grupo 3 2 1.75
Si quieres dibujar los datos anteriores como un gráfico de líneas, puedes transformar la variable factor en numérica con la función is.numeric
y crear el gráfico. Puedes poner la variable factor en el eje X o en el eje Y:
par(mfrow = c(1, 2))
#-------------------
# Grupos en el eje X
#-------------------
plot(as.numeric(datos$grupo), datos$var1, type = "l",
ylab = "Valor", xlab = "Grupo",
xaxt = "n")
# Segunda variable
lines(as.numeric(datos$grupo), datos$var2, col = 2)
# Nombres de los grupos
axis(1, labels = as.character(datos$grupo), at = as.numeric(datos$grupo))
#-------------------
# Grupos en el eje Y
#-------------------
plot(datos$var1, as.numeric(datos$grupo), type = "l",
ylab = "Grupo", xlab = "Valor",
yaxt = "n")
# Segunda variable
lines(datos$var2, as.numeric(datos$grupo), col = 2)
# Nombres de los grupos
axis(2, labels = as.character(datos$grupo), at = as.numeric(datos$grupo))
par(mfrow = c(1, 1))
Agregando una leyenda al gráfico
La función legend permite agregar leyendas en gráficos de R base. Tan solo necesitas especificar la posición o las coordenadas, las etiquetas de la leyenda, el tipo del línea y su color. También puedes especificar símbolos pch de ser necesario.
plot(x = 1:10, y = 1:10, type = "l")
lines(x = 1:10, y = sqrt(1:10), col = 2, type = "l")
legend("topleft", legend = c("Línea 1", "Línea 2"), lty = 1, col = 1:2)
Gráfico de líneas en R con dos ejes (eje dual)
Por último, es importante destacar que es posible agregar un segundo eje con la función axis de la siguiente manera:
# Incrementa los márgenes del gráfico
par(mar = c(5.25, 4.25, 4.25, 4.25))
# Primera línea
plot(x = 1:10, y = 1:10, type = "l", xlab = "x", ylab = "Línea 1")
# Nuevo gráfico (necesario para unir ambos gráficos)
par(new = TRUE)
# Segunda línea
plot(1:10, (1:10)^2, type = "l",
col = 2,
axes = FALSE, # Sin ejes
bty = "n", # Sin caja
xlab = "", ylab = "") # Sin etiquetas de los ejes
# Nuevo eje
axis(4)
mtext("Línea 2", side = 4, line = 3, col = 2)