Las grÔficas son comunicación. Para comunicar es imprescindible facilitar la comprensión de la grÔfica, evitando esfuerzos para su interpretación. Eso lo han entendido muy bien algunos periódicos, pero aún estÔn lejos de entenderlo los científicos, las televisiones y sobretodo la Administración Pública.

La teoría de la visualización nos dice que se debe tender al minimalismo y evitar representar datos irrelevantes, que los fondos deben ser claros, evitar el 3D. En resumen, usar poca tinta.

Como dice Tufte:

ā€œLa excelencia grĆ”fica es la que le da al espectador el mayor nĆŗmero de ideas en el menor tiempo posible con la menor cantidad de tinta en el espacio mĆ”s pequeƱoā€

tufte
tufte

La pandemia del covid supuso un enorme esfuerzo de comunicación para dar conocer la situación mediante grÔficas. Fue un momento en el que, por un lado, existía mucha demanda de este tipo de información y por otro, no se estuvo a la altura en todos los casos de ofrecerla adecuadamente.

GrÔfica de hospitalización de la Comunidad de Madrid durante el covid-19
GrÔfica de hospitalización de la Comunidad de Madrid durante el covid-19

Esta grÔfica es un ejemplo de mala comunicación visual: fechas en vertical apelotonadas, grÔfica de doble escala en la que una variable tapa a la otra. Lo único que se puede observar son las olas y su magnitud. El resto de la información no ayuda, a pesar de lo detallado de las fechas.

No es fÔcil llegar al equilibrio entre minimalismo y detalle de una manera objetiva. Las visualizaciones estÔn sujetas a distintas percepciones y por supuesto a distintas preferencias. Sin embargo, si que existen unos mínimos que estÔn aceptados por los especialistas en visualización y que la librería ggplot ofrece de manera estÔndard. No obstante, estas librerías ofrecen una enorme cantidad de recursos para la personalización de las grÔficas.

Vamos a ver con un ejemplo sencillo, cómo dar forma a una grÔfica desde la visualización bÔsica de ggplot hasta una personalización detallada de la misma. Los datos que usaremos serÔn los de desempleo que ofrece el INE.

LibrerĆ­as

if (!"tidyverse" %in% installed.packages()) {install.packages("tidyverse")}
if (!"scales" %in% installed.packages()) {install.packages("scales")}
if (!"ggrepel" %in% installed.packages()) {install.packages("ggrepel")}
if (!"ggtext" %in% installed.packages()) {install.packages("ggh4x")}
library("tidyverse")   # Suit completa
library("scales")      # Formato de las escalas
library("ggrepel")     # Para etiquetas
library("ggtext")      # Dar color a los textos enriquecidos

Colores

Los colores se definen como constantes para facilitar su ajuste en una sola casilla

COLOR_HOMBRES <- "#0a7ea7"
COLOR_MUJERES <- "#a75ae0"
COLOR_TEXTO <- "#5a5856"
COLOR_MEDIA <- "#5a5856"
COLOR_PP <- "#05d4f9"
COLOR_PSOE <- "#ff0000"

Datos

Un ejemplo sencillo, los datos del paro, diponibles aqui

El INE ofrece los datos en un formato ā€œa lo largoā€ que consiste en minimizar el nĆŗmero de columnas, haciendo que cada columna tenga distintos atributos. En este caso los datos estĆ”n agregados en distintos niveles

Para cada agregación se ofrece

# Descargar los datos del paro (tabla 4247)
# Son datos a lo largo
url_4247 <- "https://www.ine.es/jaxiT3/files/t/es/csv_bdsc/4247.csv?nocab=1" 

datos <- read_csv2(url_4247, na = c(".."), show_col_types = FALSE) # Leemos y quitamos los valores nulos
head (datos)
## # A tibble: 6 Ɨ 5
##   Sexo        `Comunidades y Ciudades Autónomas` Edad  Periodo Total
##   <chr>       <chr>                              <chr> <chr>   <dbl>
## 1 Ambos sexos Total Nacional                     Total 2023T2   11.6
## 2 Ambos sexos Total Nacional                     Total 2023T1   13.3
## 3 Ambos sexos Total Nacional                     Total 2022T4   12.9
## 4 Ambos sexos Total Nacional                     Total 2022T3   12.7
## 5 Ambos sexos Total Nacional                     Total 2022T2   12.5
## 6 Ambos sexos Total Nacional                     Total 2022T1   13.6

Adaptar datos

Estos datos son incómodos de usar y se adaptan para facilitar su manejo.

  • Cambiar el nombre de la columna ā€œComunidades y Ciudades Autónomasā€ por ā€œccaaā€

  • Convertir en fecha el formato aƱo-trimestre

paro <- datos %>%
  rename   (ccaa= `Comunidades y Ciudades Autónomas`) %>% # cambiar de nombre de variable por comodidad
  separate(Periodo, c("year", "quarter"), sep="T") %>% # Separar trimestre de aƱo
  mutate (fecha = 
            ifelse (quarter == "4",
               paste0(year, "-", as.integer(quarter) * 3, "-30"),
               paste0(year, "-0" ,as.integer(quarter) * 3, "-30"))) # Generar la fecha
paro$fecha <- as.Date (paro$fecha, format= "%Y-%m-%d") # Aplicar tipo fecha
head (paro)
## # A tibble: 6 Ɨ 7
##   Sexo        ccaa           Edad  year  quarter Total fecha     
##   <chr>       <chr>          <chr> <chr> <chr>   <dbl> <date>    
## 1 Ambos sexos Total Nacional Total 2023  2        11.6 2023-06-30
## 2 Ambos sexos Total Nacional Total 2023  1        13.3 2023-03-30
## 3 Ambos sexos Total Nacional Total 2022  4        12.9 2022-12-30
## 4 Ambos sexos Total Nacional Total 2022  3        12.7 2022-09-30
## 5 Ambos sexos Total Nacional Total 2022  2        12.5 2022-06-30
## 6 Ambos sexos Total Nacional Total 2022  1        13.6 2022-03-30

GrƔficas

Se va a representar en un line chart la evolución del paro desde el 2002 hasta el momento actual, segregado por sexo. Se usarÔ la agregación por Hombres y Mujeres sobre el total nacional y el total por edad.

Filtrar datos

Para la grƔfica que se va a realizar sobre la se necesitan los datos agregados por sexo, por total nacional y el total por edad

# filtrar los datos
paro_sexo <- paro  %>%
  filter(
    Sexo != "Ambos sexos" &
    ccaa == "Total Nacional" &
    Edad == "Total"
 ) 
head(paro_sexo)
## # A tibble: 6 Ɨ 7
##   Sexo    ccaa           Edad  year  quarter Total fecha     
##   <chr>   <chr>          <chr> <chr> <chr>   <dbl> <date>    
## 1 Hombres Total Nacional Total 2023  2        10.2 2023-06-30
## 2 Hombres Total Nacional Total 2023  1        11.6 2023-03-30
## 3 Hombres Total Nacional Total 2022  4        11.3 2022-12-30
## 4 Hombres Total Nacional Total 2022  3        10.7 2022-09-30
## 5 Hombres Total Nacional Total 2022  2        11.0 2022-06-30
## 6 Hombres Total Nacional Total 2022  1        12.0 2022-03-30

GrƔfica por defecto

Con estos datos, indicando que en el eje x esta la variable fecha y en el eje y el ratio y que segregue por sexo, tan solo hay que escribir dos lĆ­neas.

El resultado es una grƔfica dentro de los cƔnones, pero que al verla no sabemos de quƩ se trata.

ggplot(paro_sexo, aes(x = fecha, y = Total, color = Sexo)) +  
  geom_step()

Detalles: fase 1

En esta fase se le va a aƱadir contexto aƱadiendo el tƭtulo principal, el de los ejes, el autor, la fuente de datos, particularizando el color de las variables y aƱadiendo las unidades al eje y.

color_sexo <- c(Hombres = COLOR_HOMBRES, Mujeres = COLOR_MUJERES) # Color para sexo
ggplot(paro_sexo, aes(x = fecha, y = Total, color = Sexo)) +  
  geom_step() +
  scale_color_manual(values = color_sexo) +
  scale_y_continuous (labels=scales::percent_format(scale = 1, accuracy = 1)) +  # Escala en procentajes
  labs(
    x = "Trimestres",
    y = "Tasa de paro",
    title = "Evolución de la tasa de paro por sexo",
    caption ="@congosto\nFuente: INE"
  ) 

Detalles: fase 2

En esta fase se va a mejorar el diseño de la grÔfica. ggplot ofrece una variedad de temas para cambiar el aspecto estético, pero se pueden particularizar. Una buena opción es generar un tema propio, basado en el que mÔs se ajuste a nuestras preferencias.

En este caso se va a particularizar:

  • Los colores del borde

  • La presencia de grids

  • La posición de la leyenda

  • La fuente y el color de los textos

  • El formato del tĆ­tulo

  • La proporción del tamaƱo de las letras de cada uno de los componentes de la grĆ”fica

Personalizar el tema

mi_tema <- function(
    base_size = 11,
    base_color = COLOR_TEXTO,
    base_family = "sans"
  )
  {
    tema <-
      theme_bw(base_size=base_size, base_family = base_family) +
      theme(
        panel.border = element_rect(colour = base_color),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        plot.title = element_text(
          size = base_size+3,
          face = "bold",
          color = base_color,
          vjust = 1.25, 
          hjust = 0.5),
        plot.subtitle = element_text(size=base_size + 3, color = base_color),
        plot.caption = element_text(hjust = 1, size=base_size - 1, color = base_color),
        legend.position ="top",
        legend.text = element_text(size=base_size + 1),
        text = element_text(size=base_size + 2, color = base_color),
        axis.text.x = element_text(size=base_size-1, color = base_color),
        axis.text.y = element_text(size=base_size-1, color = base_color),
        axis.title.x = element_text(size=base_size + 2, vjust=0, color = base_color),
        axis.title.y = element_text(size=base_size + 2, vjust=1.25, color = base_color),
        strip.text = element_text(size=base_size, color = base_color),
        strip.text.x = element_text(size=base_size, color = base_color),
        strip.text.y = element_text(size=base_size, color = base_color),

      )
    return (tema)
}

Aplicar el tema

Se aplica el tema invocando a la función del tema personalizado (mi_tema).

El resultado es una grƔfica mƔs limpia, mƔs ancha y con la leyenda mƔs fƔcil de leer.

color_sexo <- c(Hombres = COLOR_HOMBRES, Mujeres = COLOR_MUJERES) # Color para sexo
ggplot(paro_sexo, aes(x = fecha, y = Total, color = Sexo)) +  
  geom_step() +
  scale_color_manual(values = color_sexo) +
  scale_y_continuous(labels=scales::percent_format(scale = 1, accuracy = 1)) +  # Escala en procentajes
  labs(
    x = "Trimestres",
    y = "Tasa de paro",
    title = "Evolución de la tasa de paro por sexo",
    caption = "@congosto\nFuente: INE"
  ) +
  mi_tema()

Detalles: fase 3

En esta fase se le añade mÔs contexto a la grÔfica. En este caso, el valor medio del paro para poder comparar como se acercan o desvían de la media según sexo.

Calcular media del paro por trimestre

La media se encuentra en los valores agredados por Ambos sexos, Total nacional y ToTal edad

### Calcular la media de la tasa del paro de EspaƱa para cada trimestre 
paro_media <- paro  %>%
  filter (Sexo == "Ambos sexos" &
    ccaa == "Total Nacional" &
    Edad == "Total")
head(paro_media)
## # A tibble: 6 Ɨ 7
##   Sexo        ccaa           Edad  year  quarter Total fecha     
##   <chr>       <chr>          <chr> <chr> <chr>   <dbl> <date>    
## 1 Ambos sexos Total Nacional Total 2023  2        11.6 2023-06-30
## 2 Ambos sexos Total Nacional Total 2023  1        13.3 2023-03-30
## 3 Ambos sexos Total Nacional Total 2022  4        12.9 2022-12-30
## 4 Ambos sexos Total Nacional Total 2022  3        12.7 2022-09-30
## 5 Ambos sexos Total Nacional Total 2022  2        12.5 2022-06-30
## 6 Ambos sexos Total Nacional Total 2022  1        13.6 2022-03-30

AƱadir la media a la grƔfica

La media la representamos como una lĆ­nea ancha de color gris, con transparencia para que no oculte las lineas segregadas por sexo.

color_sexo <- c(Hombres = COLOR_HOMBRES, Mujeres = COLOR_MUJERES) # Color para sexo
max_paro_sexo <- (max(n = 1, paro_sexo$Total)) # Se usa para ajustar los lƭmites de la grƔfica
ggplot()+
  geom_step(data = paro_sexo, aes(x = fecha, y = Total, color = Sexo))  +
  # Dibujar la media de EspaƱa mƔs reciente
  geom_line(
    data = paro_media,
    aes(x = fecha, y = Total),
    color = COLOR_MEDIA,
    linewidth = 2,
    alpha = 0.3) +
  scale_y_continuous(labels = scales::percent_format(scale = 1, accuracy = 1L)) +
  scale_color_manual(values = color_sexo) +
  labs(
    x = "Trimestres",
    y = "Tasa de paro",
    title = "Evolución de la tasa de paro por sexo",
    caption = "@congosto\nFuente: INE"
  ) +
  mi_tema()

Detalles: fase 4

En esta fase se aborda la anotación de magnitudes en la grÔfica. No se pueden etiquetar todos los valores ya que sería ilegible y quedaría muy recargado. En su lugar, se van a seleccionar los valores iniciales y finales de la serie y el valor mÔs alto.

Seleccionar elementos para anotaciones

El proceso de selección de valores se realizarÔ tanto para la serie del paro desagregado por sexo como de la media.

  • Para la serie desagregada por sexo, se seleccionan los valores iniciales, finales y mĆ”ximo

  • Para la serie de la media, se seleccionan el valor inicial y final

Adicionalmente, la anotación producirÔ efectos secundarios:

  • El valor mĆ”ximo podrĆ­a que dar muy pegado al borde superior de la grĆ”fica. HabrĆ” que dar mĆ”s altura

  • Los valores iniciales y finales, quedarĆ­an muy pegados al borde izquierdo o derecho de la grĆ”fica. HabrĆ” que dar mĆ”s anchura

  • Al darle mĆ”s anchura pueden aparecer fechas que aĆŗn no existen. Se determinan las fechas visibles

  • Las etiquetas del inicio de la serie se deben alinear a la izquierda y las del final de la serie a la derecha. HabrĆ” que calcular su alineación

# Seleccionar de las series, el mƔs antiguo, el mƔs reciente y el mƔs alto 
max_paro <- max(paro_sexo$Total) # Se usarĆ” para ajustar el eje y
min_fecha = min(paro_sexo$fecha) # Se usarĆ” para ensanchar el eje x
max_fecha = max(paro_sexo$fecha) # Se usarĆ” para ensanchar el eje x
fechas_visibles <- (seq (min_fecha, max_fecha, by = "3 years"))
anotacion_paro_sexo <- paro_sexo  %>%
  filter (
    fecha == min_fecha | 
    fecha == max_fecha |
    Total == max_paro
  ) %>%
mutate(texto = ifelse( fecha == max_fecha, Sexo, "" )) %>%
mutate(texto = ifelse( Total == max_paro, paste0(year, "T", quarter), texto )) %>%
mutate(alineación_x = ifelse( fecha == max_fecha, 365 * 2, -365)) %>%
mutate(alineación_x = ifelse( Total == max_paro, 0, alineación_x)) 
anotacion_paro_media <- paro_media  %>%
  filter (
    fecha == min(fecha) | 
    fecha == max(fecha) 
  ) %>%
  mutate(texto = ifelse( fecha == max_fecha, "Media", "")) %>%
  mutate(alineación_x = ifelse( fecha ==  max_fecha, 365 * 2, -365))
head(anotacion_paro_sexo)
## # A tibble: 5 Ɨ 9
##   Sexo    ccaa           Edad  year  quarter Total fecha      texto alineación_x
##   <chr>   <chr>          <chr> <chr> <chr>   <dbl> <date>     <chr>        <dbl>
## 1 Hombres Total Nacional Total 2023  2       10.2  2023-06-30 "Hom…          730
## 2 Hombres Total Nacional Total 2002  1        8.36 2002-03-30 ""            -365
## 3 Mujeres Total Nacional Total 2023  2       13.2  2023-06-30 "Muj…          730
## 4 Mujeres Total Nacional Total 2013  1       27.3  2013-03-30 "201…            0
## 5 Mujeres Total Nacional Total 2002  1       16.4  2002-03-30 ""            -365

AƱadir anotaciones

Se utilizarĆ” ggrepel para etiquetar la grĆ”fica. Esta librerĆ­a es muy Ćŗtil que tiene ā€œcierta inteligenciaā€ para colocar los textos sin que se solapen. No obstante, los ajustes son a veces difĆ­ciles. En este caso afortunadamente, no. Se le indicarĆ” las coordenadas, para situar la etiqueta (x, y), el tamaƱo (size) y el color del texto (color), la alineación (eje y), el desplazamiento respecto al eje x (nudge_x) y el desplazamiento respecto al eje y (nudge_y).

Se etiquetarƔn por separado la serie de desagregada por sexo y la de la media.

Se aplicarƔn los ajustes a los ejes:

  • x: ensanchando el eje un aƱo por la izquierda y dos por la derecha, forzando a que solo salgan las fechas visibles

  • y: ampliando la altura de la grĆ”fica un 10% del valor mĆ”ximo del eje y

color_sexo <- c(Hombres = COLOR_HOMBRES, Mujeres = COLOR_MUJERES) # Color para sexo
# Seleccionar de la  serie el mƔs antiguo, el mƔs alto y el mƔs reciente
ggplot()+
  geom_step(data = paro_sexo, aes(x = fecha, y = Total, color = Sexo))  +
  # Dibujar la media de EspaƱa mƔs reciente
  geom_line(
    data = paro_media,
    aes(x = fecha, y = Total),
    color = COLOR_MEDIA,
    linewidth = 2,
    alpha = 0.3) +
  # Anotar valores de la serie paro_sexo
  geom_text_repel(
    data = anotacion_paro_sexo,  
    aes(
      x = fecha,
      y = Total, 
      label = paste0(round(Total, 1), "% ", texto)
    ),
    size = 3,
    color = COLOR_TEXTO,
    direction = "y",
    nudge_x = anotacion_paro_sexo$alineación_x, 
    nudge_y = 1 
  ) +
  # Anotar valores de la media
  geom_text_repel(
    data = anotacion_paro_media,  
    aes(
      x = fecha,
      y = Total,
      label = paste0(round(Total, 1), "% ", texto)
    ),
    size = 3,
    color = COLOR_TEXTO,
    direction = "y",
    nudge_x = anotacion_paro_media$alineación_x, 
    nudge_y = 1 
  ) +
  scale_y_continuous(
    labels = scales::percent_format(scale = 1, accuracy = 1L),
    limits = c(0, max_paro*1.1)) + # Se sube la altura para que quepa la anotación
  scale_x_date(
    limits = c(min_fecha - 365, max_fecha + (365*5)), # Ensanchamos eje x
    breaks = fechas_visibles,
    labels = date_format("%Y")
  ) +
  scale_color_manual(values = color_sexo) +
  labs(
    x = "Trimestres",
    y = "Tasa de paro",
    title = "Evolución de la tasa de paro por sexo",
    caption = "@congosto\nFuente: INE") +
   mi_tema()

Detalles: fase 5

En este momento la grÔfica muestra de forma detallada cómo evolucionó el paro por sexo, la diferencia entre el 2002 y la fecha actual y el punto de inflexión dónde comenzó a bajar. En esta fase se va a mejorar con el uso del color.

  • Integrando el tĆ­tulo con la leyenda, aƱadiendo color en palabras claves dentro del tĆ­tulo. Se utilizarĆ” la librerĆ­a ggtext que permite enriquecer el texto.

  • Dar color a las etiquetas,

  • Eliminar la leyenda porque ya estĆ” en las anotaciones y en el texto del tĆ­tulo

  • Eliminar los tĆ­tulos de los ejes porque estĆ”n en el tĆ­tulo de la grĆ”fica

El resultado es una grƔfica menos formal (titulo, leyenda, tƭtulos de los ejes), pero mucho mƔs atractiva y concisa.

color_sexo <- c(Hombres = COLOR_HOMBRES, Mujeres = COLOR_MUJERES) # Color para sexo
# Seleccionar de la  serie el mƔs antiguo, el mƔs alto y el mƔs reciente
ggplot()+
  geom_step(data = paro_sexo, aes(x = fecha, y = Total, color=Sexo))  +
  # Dibujar la media de EspaƱa mƔs reciente
  geom_line(
    data = paro_media,
    aes(x = fecha, y = Total),
    color = COLOR_MEDIA,
    linewidth = 2,
    alpha = 0.3) +
  # Anotar valores de la serie paro_sexo
  geom_text_repel(
    data = anotacion_paro_sexo,  
    aes(
      x = fecha,
      y = Total, 
      label = paste0(round(Total, 1), "% ", texto),
      color = Sexo
    ),
    size = 3,
    direction = "y",
    nudge_x = anotacion_paro_sexo$alineación_x, 
    nudge_y = 1 
  ) +
  # Anotar valores de la media
  geom_text_repel(
    data = anotacion_paro_media,  
    aes(
      x = fecha,
      y = Total,
      label = paste0(round(Total, 1), "% ", texto)
    ),
    size = 3,
    color= COLOR_TEXTO,
    direction = "y",
    nudge_x = anotacion_paro_media$alineación_x, 
    nudge_y = 1 
  ) +
  scale_y_continuous(
    labels = scales::percent_format(scale = 1, accuracy = 1L),
    limits = c(0, max_paro*1.1)) + # Se sube la altura para que quepa la anotación
  scale_x_date(
    limits = c(min_fecha - 365, max_fecha + (365 * 5)), # Ensanchamos eje x
    breaks = fechas_visibles,
    labels = date_format("%Y")
  ) +
  scale_color_manual(values = color_sexo) +
  labs(
    title = paste(
      "Evolución de la tasa del paro por trimestres de<br><b style='color:",
      COLOR_MUJERES,
      ";'>Mujeres</b> y <b style='color:",
      COLOR_HOMBRES,
      ";'>Hombres</b>"
    ),
    x = "",
    y = "",
    caption = "@congosto\nFuente: INE") +
  guides(color = "none") + # Quitamos la leyenda
  mi_tema() +
  theme(plot.title = element_markdown())

Detalles: fase 6

Se podrƭa dejar en la fase 5, pero obviando la regla de la poca tinta, se le puede aƱadir contexto sobre quiƩn gobernaba en cada periodo.

AƱadir contexto

Se construye un tibble con los datos de cada legislatura: legislatura, fecha de inicio, fecha de fin, presidente, partido del presidente.

Para que no quede muy sobrecargado, en vez de anotar en cada periodo el presidente, solo se anotarĆ” cuando es nuevo presidente entrante.

legislaturas <- c("VII", "VIII", "IX", "X", "XI", "XII", "XII", "XIII", "XIV")
inicio <-c("2002-01-01", "2004-04-18", "2008-04-18", "2011-12-20", "2015-12-20", "2016-07-19", "2018-06-07", "2019-04-18", "2020-01-28")
fin <-c("2004-04-18", "2008-04-18", "2011-12-20", "2015-12-20", "2016-07-19", "2018-06-07", "2019-04-18", "2020-01-28" , "2023-10-17")
presidentes <- c("Aznar", "Zapatero", "Zapatero", "Rajoy", "Rajoy", "Rajoy", "SƔnchez", "SƔnchez", "SƔnchez")
partidos <- c("PP", "PSOE", "PSOE", "PP", "PP", "PP", "PSOE", "PSOE", "PSOE")
gobierno <- tibble(
  "legislatura" = legislaturas,
  "inicio" = inicio,
  "fin" = fin,
  "presidente" = presidentes,
  "partido" = partidos
)
# AƱadir los cambios de presidente
gobierno <- gobierno   %>%
  mutate(nuevo_presidente = presidente)  %>%
  mutate(nuevo_presidente = ifelse(lag (presidente ) != presidente, presidente, "")) %>%
  mutate(nuevo_presidente = ifelse(is.na(nuevo_presidente), presidente, nuevo_presidente))
print(gobierno)
## # A tibble: 9 Ɨ 6
##   legislatura inicio     fin        presidente partido nuevo_presidente
##   <chr>       <chr>      <chr>      <chr>      <chr>   <chr>           
## 1 VII         2002-01-01 2004-04-18 Aznar      PP      "Aznar"         
## 2 VIII        2004-04-18 2008-04-18 Zapatero   PSOE    "Zapatero"      
## 3 IX          2008-04-18 2011-12-20 Zapatero   PSOE    ""              
## 4 X           2011-12-20 2015-12-20 Rajoy      PP      "Rajoy"         
## 5 XI          2015-12-20 2016-07-19 Rajoy      PP      ""              
## 6 XII         2016-07-19 2018-06-07 Rajoy      PP      ""              
## 7 XII         2018-06-07 2019-04-18 SƔnchez    PSOE    "SƔnchez"       
## 8 XIII        2019-04-18 2020-01-28 SƔnchez    PSOE    ""              
## 9 XIV         2020-01-28 2023-10-17 SƔnchez    PSOE    ""

Dibujar contexto

Este contexto se añade cambiando el fondo del color de la grÔfica con geom_rect, según el color del partido gobernante en cada periodo. Para distinguir presidencias contiguas en periodos, se pinta de blanco los bordes de distintos bloques.

Se anotan los nombres de los presidentes, cuando hay cambios de presidencia.

Las leyendas se integran en el tĆ­tulo mediante color.

color_sexo <- c(Hombres = COLOR_HOMBRES, Mujeres = COLOR_MUJERES) # Color para sexo
color_partidos <- c(PP = COLOR_PP, PSOE = COLOR_PSOE) # Color para partidos
# Seleccionar de la  serie el mƔs antiguo, el mƔs alto y el mƔs reciente
ggplot()+
  geom_rect(
    data = gobierno,
    aes(
      xmin = as.Date(inicio),
      xmax = as.Date(fin),
      ymin = 0,
      ymax = Inf,
      fill = partido),
      color = "white",
      alpha = .2
  ) +
geom_text(
    data = gobierno,  
    aes(
      x = as.Date(inicio) + (365 * 0.3),
      y = 3, 
      label = nuevo_presidente,
    ),
    hjust = 0,
    color = COLOR_TEXTO
  ) +
  geom_step(data = paro_sexo, aes(x = fecha, y = Total, color=Sexo))  +
  # Dibujar la media de EspaƱa mƔs reciente
  geom_line(
    data = paro_media,
    aes(x = fecha, y = Total),
    color = COLOR_MEDIA,
    linewidth = 2,
    alpha = 0.3) +
  # Anotar valores de la serie paro_sexo
  geom_text_repel(
    data = anotacion_paro_sexo,  
    aes(
      x = fecha,
      y = Total, 
      label = paste0(round(Total, 1), "% ", texto),
      color = Sexo
    ),
    size = 3,
    direction = "y",
    nudge_x = anotacion_paro_sexo$alineación_x, 
    nudge_y = 1 
  ) +
  # Anotar valores de la media
  geom_text_repel(
    data = anotacion_paro_media,  
    aes(
      x = fecha,
      y = Total,
      label = paste0(round(Total, 1), "% ",texto)
    ),
    size = 3,
    color= COLOR_TEXTO,
    direction = "y",
    nudge_x = anotacion_paro_media$alineación_x, 
    nudge_y = 1 
  ) +
  scale_y_continuous(
    labels = scales::percent_format(scale = 1, accuracy = 1L),
    expand= c(0,0),
    limits = c(0, max_paro * 1.1)) + # Se sube la altura para que quepa la anotación
  scale_x_date(
    limits = c(min_fecha - 365, max_fecha + (365 * 5)), # Ensanchamos eje x
    breaks = fechas_visibles,
    labels = date_format("%Y")
  ) +
  scale_color_manual(values = color_sexo) +
  scale_fill_manual(values = color_partidos) +
  labs(
    title = paste(
      "Evolución de la tasa del paro por trimestres de<br><b style='color:",
      COLOR_MUJERES,
      ";'>Mujeres</b> y <b style='color:",
      COLOR_HOMBRES,
      ";'>Hombres</b>, segĆŗn el partido del gobierno <b style='color:",
      COLOR_PP,
      ";'>PP</b> o <b style='color:",
      COLOR_PSOE,
      ";'>PSOE</b>"
    ),
    x = "",
    y = "",
    caption = "@congosto\nFuente: INE") +
  guides(color = "none") + # Quitamos la leyenda de hombres-mujeres
  guides(fill = "none") +  # Quitamos la leyenda de pp-psoe
  mi_tema() +
  theme(plot.title = element_markdown())

Ejemplos

Uso del etiquetado

Evolución de un boxplot usando etiquetado

Evolución de un boxplot
Evolución de un boxplot

Uso de color de fondo con información

Fondo para definir cuando se estaba en zona de riesgo en el covid-19.

GrÔfico realizado por el Grupo de Investigación en Biología Computacional y Sistemas Complejos del Departamento de Física de UPC.

Evolución del contagio del covid-19
Evolución del contagio del covid-19