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()
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()
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 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)
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")
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")
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
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
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")))
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")))
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")
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")
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)
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")
# 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")
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)
También te puede interesar