En la siguiente entrada se muestra un ejemplo de gráficos con bandas de recesión en ggplot2 de R. La idea se toma de “rstudio-pubs”[1]. Desde Excel, se cargan los datos conteniendo los precios mensuales del precio del petróleo.
library(dplyr)
library(ggplot2)
library(tidyr) #gather
library(lubridate)
series_mes <- read_excel("series_examples.xlsx", sheet = "mes")
series_mes %>%
select(fecha,p_wti) %>%
na.omit()
# A tibble: 446 x 2
fecha p_wti
<dttm> <dbl>
2 1986-02-01 00:00:00 15.5
3 1986-03-01 00:00:00 12.6
4 1986-04-01 00:00:00 12.8
5 1986-05-01 00:00:00 15.4
6 1986-06-01 00:00:00 13.4
7 1986-07-01 00:00:00 11.6
8 1986-08-01 00:00:00 15.1
9 1986-09-01 00:00:00 14.9
10 1986-10-01 00:00:00 14.9
# ... with 436 more rows
Posteriormente, se crea una base de referencia llamada reccess, donde se coloca una variable con las fechas de inicio y final de cada crisis, estas son llamadas begin y end, respectivamente. Respecto al código original, aquí se agrega la crisis financiera de 2003 dada su relevancia para la economía dominicana, además de la crisis del COVID-19. Adicionalmente, en la variable evento coloca el nombre del evento asociado a cada crisis. Esto le permitirá colocar etiquetas sobre el gráfico posteriormente.
begin = c("1969-12-01","1973-11-01","1980-01-01","1981-07-01",
"1990-07-01","2001-03-01","2003-01-01","2007-12-01",
"2020-03-01"),
end = c("1970-11-01","1975-03-01","1980-07-01","1982-11-01",
"1991-03-01","2001-11-01","2004-01-01","2009-07-30",
"2021-12-01"),
event = c( "Fiscal & Monetary ", "1973 Oil crisis","Double dip I",
"Double dip II", "Oil price shock", "Dot-com bubble",
"Crisis Bancaria RD","Sub-prime crisis", "COVID-19"),
y = c(.014, 0.020, 0.029, 0.0341, 0.027, 0.02,0.02, 0.025, 0.2),
stringsAsFactors = F
)
La variable y es la referencia sobre el valor de ese eje en donde entendemos debe aparecer las etiquetas asociadas a cada crisis. Es decir, que debemos cambiar estos valores para cada serie que quisiéramos representar. Sin embargo, dado que tenemos un vector de fechas en nuestra serie temporal este proceso es necesario automatizar. La opción utilizada en este ejemplo utiliza la función %in% combinada con which para identificar las posiciones de fechas en nuestra base de datos que coincide con las crisis. Estas posiciones se guardan en el vector recesion_index. Finalmente, se usa la indexación numérica para recuperar los calores de mi serie que coinciden con estas fechas. Por ejemplo, imaginemos que una recesión inició en enero de 2003, la idea es buscar el valor de mi serie en ese mes. Estos valores se guardan en el vector position_labels.
recesion_index <- which(format(series_mes$fecha, "%y-%b") %in% format(recess$begin, "%y-%b"))
recesion_index
[1] 78 206 228 287 434
position_labels <- series_mes$p_wti[recesion_index]
position_labels
[1] 16.70 29.61 29.46 94.77 50.54
geom_line(size=1.1) +
geom_rect(data = dplyr::filter(recess, begin >= as.Date("1986-01-01")),
aes(xmin = begin, xmax = end, ymin = -Inf, ymax = +Inf, fill = "Recession"),
inherit.aes = FALSE, alpha = 0.2) +
geom_label(data = dplyr::filter(recess, begin >= as.Date("1986-01-01")),
aes(x = end, y = position_labels, label=event), size = 3) +
scale_fill_manual(name = "", values="red", label="Recessions") +
theme_minimal() +
ggtitle(c("Precio del petróleo (WTI) \n Datos mensuales 1986-2023")) +
theme(legend.position = "none") +
ylab(NULL) + xlab(NULL)
ggsave("plot0.png")
[1] Introduction to Visualization with ggplot2.