Cuando se realizan gráficos de series temporales se emplean gráficos de líneas donde el eje X contiene la fecha y el eje Y contiene el valor a representar. Hoy quiero traer al blog otra forma de representar series temporales: los gráficos de calendario y su realización con R. Para ilustrar el ejemplo, vamos a emplear las cotizaciones históricas del índice bursátil IBEX 35:
library(quantmod)
library(ggplot2)
library(reshape2)
library(dplyr)
library(lubridate)
# Obtenemos las cotizaciones del IBEX 35 desde 2010
getSymbols('^IBEX', from = '2010-01-01')
# data.frame de trabajo
df <- data.frame(date = index(IBEX), IBEX)
Mediante quantmod extraemos las cotizaciones del IBEX y creamos un data.frame de trabajo que llamamos df. Vamos a realizar dos tipos de gráficos: un mapa de calor por años, meses, semanas y días, y un calendario de un año puntual.
Calendario como mapa de calor
Este es un gráfico basado en un trabajo anterior (¡de 2012!) y es una forma imaginativa de representar el cierre del IBEX 35 desde 2010 en una sola imagen. El primer paso será crear las variables a representar en el mapa de calor: el mes, el día de la semana y la semana dentro del mes.
df <- df %>%
mutate(año = year(date),
mes = factor(month(date), levels = (1:12),
labels = c("ENE", "FEB", "MAR", "ABR", "MAY", "JUN", "JUL",
"AGO", "SEP", "OCT", "NOV", "DIC"), ordered = TRUE),
dia = factor(wday(date, week_start = 1), levels = rev(1:7),
labels = rev(c("L", "M", "X", "J", "V", "S", "D"))),
semanames = ceiling(day(date) / 7))
Ahora sólo queda representar el gráfico mediante ggplot2, donde los paneles de facet_grid serán los años en el eje Y y los meses en el eje X:
# Realizamos el calendario
calendario1 <- ggplot(df, aes(semanames, dia, fill = IBEX.Adjusted)) +
geom_tile(colour = "white") +
facet_grid(año ~ mes) +
scale_fill_gradient(low = "red", high = "darkgreen", na.value = "black") +
labs(title = "Cierre histórico del IBEX", x = "Semana del mes", y = "")

Un gráfico que me gusta bastante y una original forma de representar series temporales muy largas. No he usado paletas de colores sofisticadas, pero imagino que los resultados mejorarán; podéis aportar esas mejoras en los comentarios.
Calendario con openair y calendarPlot
Si deseamos representar un calendario de un año concreto, tenemos la función calendarPlot de openair (que me ha costado instalar en Ubuntu), que no puede ser más sencilla:
library(openair)
calendarPlot(df, pollutant = "IBEX.Adjusted", year = 2019, cols = "Greens")

Este último calendario no lo he usado tanto, pero la sintaxis es muy sencilla y el resultado queda bastante bien. Ahora vosotros mismos podéis juzgar si hay o no hay rally de fin de año.