Dibujar una o varias series de tiempo

Un gráfico de series temporales es una representación de datos tiempo-dependientes, esto es, es un gráfico que representa la evolución de una variable a través del tiempo. Por lo general, el par de puntos se conecta con líneas y la decisión de mostrar los puntos o no depende de gustos y del nivel de discretización.

Para crear un gráfico de series temporales en ggplot2 de una única variable tan solo necesitas un data frame que contenga fechas y los valores correspondientes de la variable. Ten en cuenta que la columna de fechas debe estar en formato fecha. Tendrás que pasar tus datos y utilizar la función geom_line o geom_point.

Serie temporal (línea)

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

# Datos con fechas y variables. La columna 'date' (fecha) es de clase "Date"
df <- economics[economics$date > as.Date("2000-01-01"), ]

ggplot(df, aes(x = date, y = unemploy)) +
  geom_line()

Serie de tiempo en ggplot2

Tal y como se comentó antes, puedes agregar puntos a la serie temporal utilizando la función geom_point. En este ejemplo existen muchas observaciones, lo que hace que el gráfico sea menos legible con los puntos, por lo que no los mostraremos en los ejemplos siguientes.

Serie temporal (líneas y puntos)

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

# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]

ggplot(df, aes(x = date, y = unemploy)) +
  geom_line() +
  geom_point()

Serie temporal en ggplot2 con puntos y líneas

La variable que sea pasa a x dentro de aes debe estar en formato fecha. Comprueba la clase de la variable con class(df$date) o con str(df). Puedes usar las funciones as.Date y as.POSIXct para transformar las fechas en formato fecha en caso de ser necesario.

Serie temporal con área coloreada

En ocasiones las series temporales se dibujan coloreando el área bajo la línea. Puedes hacerlo utilizando la función geom_area.

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

# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]

ggplot(df, aes(x = date, y = unemploy)) +
  geom_area(fill = "gray", alpha = 0.9) +
  geom_line()

Serie temporal en ggplot2 con área coloreada

Serie temporal suavizada con stat_smooth

Con geom_smooth puedes suavizar la serie temporal, lo que puede ser interesante para analizar tendencias o patrones. Por defecto, geom_smooth agregará un intervalo de confianza a la suavización, pero puedes eliminarla con se = FALSE.

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

# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]

ggplot(df, aes(x = date, y = unemploy)) +
  geom_line() +
  geom_smooth(se = FALSE)

Serie de tiempo suavizada con stat_smooth

Varias series temporales en el mismo gráfico

Para dibujar varias series de tiempo a la vez tendrás que tener tus data frame en formato largo (long). Para este ejemplo usaremos un subconjunto del conjunto de datos de muestra economics_long de ggplot2.

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

# Datos
df2 <- economics_long[economics_long$date > as.Date("2000-01-01"), ] %>%
  filter(variable == "pce" | variable == "unemploy")

ggplot(df2, aes(x = date, y = value, color = variable)) +
  geom_line() +
  theme(legend.position = "bottom")

Varias series temporales en el mismo gráfico de ggplot2

El color de cada serie se puede personalizar con scale_color_manual, especificando tantos colores como líneas con el argumento values o usando otra función para personalizar escalas de color discretas.

Dividir la serie de tiempo en varios gráficos por día, semana, mes, año, …

Utilizando las facetas de ggplot2 puedes dividir tu serie de tiempo en intervalos predefinidos. En el ejemplo siguiente usamos la función year de lubridate para extraer el año correspondiente de cada observación y usamos la nueva columna para dividir la serie temporal. Establecemos scales = "free" para dejar libre la escala de los ejes.

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

# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]

# Nueva columna con el año correspondiente para cada fecha
df$year <- year(df$date)

ggplot(df, aes(x = date, y = unemploy)) +
  geom_line() +
  facet_wrap(~year, scales = "free")

Serie temporal dividida por años en ggplot2 con facet_wrap

Formato de las fechas de una serie temporal con scale_x_date

Con la función scale_x_date puedes personalizar el eje X cuando éste representa fechas. Por ejemplo, podrás transformar el formato de las fechas, los límites del gráfico o el número de marcas de los ejes. En la tabla siguiente verás una lista que contiene los símbolos más habituales usados para especificar diferentes formatos de fechas. Ten en cuenta que puedes combinar los símbolos de la manera que quieras, como en los ejemplos siguientes.

Símbolo Significado Ejemplo
%Y Año con 4 dígitos 2023
%y Año con 2 dígitos 23
%B Nombre de mes completo Septiembre
%b Nombre de mes abreviado Sep
%m Mes como númeo 09
%d Día del mes 05
%H Hora (00-23) 14
%I Hora (01-12) 14
%M Minuto como número 30
%S Segundo como número 15
%A Día de semana completo Martes
%a ADía de semana abreviado Mar

Formato de fecha del eje en ggplot2 con scale_x_date

Formato de fecha

El argumento date_labels de la función scale_x_date se puede usar para personalizar el formato de las fechas. En el ejemplo siguiente establecemos %Y-%m-%d, que mostrará el año, el mes y el día separados por guiones, en lugar de solo el año.

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

# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]

ggplot(df, aes(x = date, y = unemploy)) +
  geom_line() +
  scale_x_date(date_labels = "%Y-%m-%d")

Límites de los ejes con fechas en ggplot2

Límites

Puedes establecer el límite de los ejes en base a las fechas con el argumento limit de la función.

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

# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]

ggplot(df, aes(x = date, y = unemploy)) +
  geom_line() +
  scale_x_date(limit = c(as.Date("2010-01-01"), as.Date("2015-01-01")))

Especificar fechas del eje en ggplot2

Marcas de los ejes

También puedes especificar las marcas de los ejes con el argumento breaks de la función, especificando las fechas a ser usadas como marcas de los ejes.

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

# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]

ggplot(df, aes(x = date, y = unemploy)) +
  geom_line() +
   scale_x_date(breaks = c(as.Date("2001-01-01"),
                           as.Date("2008-01-01"),
                           as.Date("2012-01-01")))

Especificar fechas para el eje en un gráfico de series temporales de ggplot2

Una alternativa es especificar las marcas con textos de la forma "1 day" (una marca cada día), "2 months" (una marca cada dos meses), "6 years" (una marca cada seis años), …

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

# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]

ggplot(df, aes(x = date, y = unemploy)) +
  geom_line() +
   scale_x_date(date_breaks = "5 years")

Grid secundario de una serie temporal en ggplot2

La función también proporciona un argumento llamado date_minor_breaks para establecer el grid secundario del eje. Este argumento se comporta de la misma manera que date_breaks.

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

df <- economics[economics$date > as.Date("2000-01-01"), ]

ggplot(df, aes(x = date, y = unemploy)) +
  geom_line() +
   scale_x_date(date_breaks = "5 years", 
                date_minor_breaks = "1 year")

Resaltar cambios, picos y valles

Puedes agregar líneas para resaltar puntos de interés o cambios estructurales con las funciones geom_vline o geom_hline, que permiten agregar líneas verticales y horizontales, respectivamente.

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

# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]

ggplot(df, aes(x = date, y = unemploy)) +
  geom_line() +
  geom_vline(xintercept = as.Date("2007-09-15"),
             linetype = 2, color = 2, linewidth = 1)

Agregar líneas verticales a una serie temporal para mostrar cambios estructurales en ggplot2

Picos y valles

Con las funciones stat_peaks y stat_valleys del paquete ggpmisc puedes resaltar los máximos y mínimos locales de la serie en base a un umbral predefinido (por defecto span = 5). Ambas funciones se comportan de la misma manera y el geom usado para representar los datos se puede pasar al argumento geom, que por defecto es "point". En los ejemplos siguientes agregamos los picos y los valles a la serie, mostrando las etiquetas y un rug plot para mostrar dónde están los valores.

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

# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]

ggplot(df, aes(x = date, y = unemploy)) +
  geom_line() +
  stat_peaks(geom = "point", span = 15, color = "steelblue3", size = 2) +
  stat_peaks(geom = "label", span = 15, color = "steelblue3", angle = 0,
             hjust = -0.1, x.label.fmt = "%Y-%m-%d") +
  stat_peaks(geom = "rug", span = 15, color = "blue", sides = "b")

La función stat_peaks de ggpmisc

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

# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]

ggplot(df, aes(x = date, y = unemploy)) +
  geom_line() +
  stat_valleys(geom = "point", span = 11, color = "red", size = 2) +
  stat_valleys(geom = "label", span = 11, color = "red", angle = 0,
               hjust = -0.1, x.label.fmt = "%Y-%m-%d") +
  stat_valleys(geom = "rug", span = 11, color = "red", sides = "b")

Usando la función stat_valleys de ggpmisc

Destacar intervalos

Con geom_rect es posible sombrear algunas áreas del gráfico de series de tiempo. Esto es especialmente interesante para resaltar tendencias, recesiones, etc.

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

# Datos
df <- economics[economics$date > as.Date("2000-01-01"), ]

# Sombreamos desde 2000 a 2004 y de 2010 a 2015
shade <- data.frame(x1 = c(as.Date("2000-01-01"), as.Date("2010-01-01")),
                    x2 = c(as.Date("2004-01-01"), as.Date("2015-01-01")),
                    min = c(-Inf, -Inf), max = c(Inf, Inf))

ggplot() +
  geom_line(data = df, aes(x = date, y = unemploy)) +
  geom_rect(data = shade, aes(xmin = x1, xmax = x2, ymin = min, ymax = max),
            fill = c("green", "red"), alpha = 0.2)

Resaltar una serie temporal en ggplot2 con geom_rect

También te puede interesar