Gráfico de líneas en R

Creando un gráfico de líneas en R base

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

Gráfico de líneas básico en R

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

Personalización del color y ancho del gráfico de líneas

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

Tipos de gráficos de líneasAdemá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))

Tipos de líneas en R

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:

Símbolos pch en R

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

Gráfico de líneas con símbolos pch

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

Puntos en un gráfico con la función points

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

Gráfico de líneas con letras

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

Anotación de texto en gráfico de líneas

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

Agregando texto a un gráfico de líneas

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

Función curve en R

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

Dibujando una función en R con la 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

Múltiples líneas en un gráfico

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

Función matplot en R

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

Usando la función matplot

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

Agregando líneas con la función matlines

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

Gráfico de líneas con datos categóricos

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)

Agregar una leyenda a un gráfico de líneas en R

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)

Gráfico de líneas en R con dos ejes (eje dual)