18 ago 2023

Gghighlight en R: gráfico de series temporales

En la siguiente entrada mostraremos algunos ejemplos de cómo usar la función gghighlight para resaltar alguna serie en R. para el siguiente ejemplo usamos la base EuStockMarkets disponible en la base de R. En primer lugar, obtenemos una base tipo long, donde cada columna de las variables la colocamos una debajo de otra, mientras que el nombre de las variables la colocamos en una nueva variable llamada stock. Adicionalmente, repetimos la secuencia de fechas.

library(tidyverse)
library(tidyr)

# Cargar los datos EuStockMarkets
data("EuStockMarkets")

# Convertir los datos a formato largo
eu_stocks_long <- EuStockMarkets |>
  as.data.frame() |>
  mutate(fecha = time(EuStockMarkets)) |>
  pivot_longer(cols = -fecha, names_to = "stock", values_to = "value")

eu_stocks_long |>  head()

## # A tibble: 6 x 3
##   fecha stock value
##   <dbl> <chr> <dbl>
## 1 1991.
DAX   1629.
## 2 1991. SMI   1678.
## 3 1991. CAC   1773.
## 4 1991. FTSE  2444.
## 5 1992. DAX   1614.
## 6 1992. SMI   1688.

Ahora usamos ggplot para graficar las fechas. Note que ordenar la base en esta secuencia permite usar la función group by de dplyr para realizar estimaciones por serie como si fuera por variable.

 ggplot(eu_stocks_long, aes(x = fecha, y = value, color = stock)) +
  geom_line() +
  labs(title = "Series de EuStockMarkets, datos diario 1991-1998",
       x = "Fecha", y = "Precion (t)", color = "Acción") +
  theme_classic() +
  theme(legend.position = "top", legend.title = element_blank())

Resaltar series con gghighlight

El paquete gghighlight de R permite resaltar una variable basada en una determinada condición. En este primer ejemplo solo resaltamos la serie “DAX”.

library(gghighlight)

 ggplot(eu_stocks_long, aes(x = fecha, y = value, color = stock)) +
   geom_line() +
   labs(title = "Series de EuStockMarkets, datos diario 1991-1998",
        x = "Fecha", y = "Precion (t)", color = "Acción") +
   gghighlight(stock == "DAX") +
   theme_classic() +
   theme(legend.position = "top", legend.title = element_blank())


En caso de querer resaltar dos series podemos usar el operador contenido en %in%. Por ejemplo: stock %in% c(“DAX”,“CAC”).

ggplot(eu_stocks_long, aes(x = fecha, y = value, color = stock)) +
   geom_line() +
   labs(title = "Series de EuStockMarkets, datos diario 1991-1998",
        x = "Fecha", y = "Precion (t)", color = "Acción") +
   gghighlight(stock %in% c("DAX","CAC")) +
   theme_classic() +
   theme(legend.position = "top", legend.title = element_blank())

Igual podemos indicar mediante negación cuales series no quisiéramos aparezcan usando el operador de negación del operador contenido en %!in%:

`%!in%` = Negate(`%in%`)

ggplot(eu_stocks_long, aes(x = fecha, y = value, color = stock)) +
   geom_line() +
   labs(title = "Series de EuStockMarkets, datos diario 1991-1998",
        x = "Fecha", y = "Precion (t)", color = "Acción") +
   gghighlight(stock %!in% c("DAX","CAC")) +
   theme_classic() +
   theme(legend.position = "top", legend.title = element_blank())


Además del nombre, podemos resaltar series que cumplan determinada condición económica.

ggplot(eu_stocks_long, aes(x = fecha, y = value, color = stock)) +
   geom_line() +
   labs(title = "Series de EuStockMarkets, datos diario 1991-1998",
        x = "Fecha", y = "Precion (t)", color = "Acción") +
   gghighlight(max(value) > 8000) +
   theme_classic() +
   theme(legend.position = "top", legend.title = element_blank())


Formato de las líneas no resaltadas

el argumento use direct label evita que la etiqueta de las series resaltadas aparezca al final del gráfico. Además, unhighlighted params permite modificar las características de las series que no son resaltadas.

ggplot(eu_stocks_long, aes(x = fecha, y = value, color = stock)) +
   geom_line(linewidth = 1.3, col = "darkred") +
   labs(title = "Series de EuStockMarkets, datos diario 1991-1998",
        x = "Fecha", y = "Precion (t)", color = "Acción") +
   gghighlight(max(value) > 8000,
               use_direct_label = FALSE,
               unhighlighted_params = list(linewidth = 0.5, colour = alpha("blue", 0.4))) +
   theme_classic() +
   theme(legend.position = "top", legend.title = element_blank())

Podemos segmentar el grágico para cada una de las series identificadas.

ggplot(eu_stocks_long, aes(x = fecha, y = value, color = stock)) +
   geom_line(linewidth = 1.3) +
   labs(title = "Series de EuStockMarkets, datos diario 1991-1998",
        x = "Fecha", y = "Precion (t)", color = "Acción") +
   gghighlight(stock %!in% c("DAX","CAC"),
               use_direct_label = FALSE,
               unhighlighted_params = list(linewidth = 0.5, colour = alpha("blue", 0.4))) +
   theme_classic() +
   theme(legend.position = "top", legend.title = element_blank()) +
  facet_grid(~ stock)



Creando variables por grupos en dplyr (group_by + mutate)

  Simulemos una base de hogares, donde se identifica el hogar, el sexo (1 mujer) y provincia y edad para cada miembro.   # Definir la lista ...