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

Mapa_calor_calendario.png

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

Grafico_calendario_anual.png

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.