Introducción

El control de la expansión del coronavirus Sars-COV-2 presenta serios desafíos para los sistemas sanitarios de todo el mundo, por lo que resulta importante el poder identificar y cuantificar la afectacción de las distintas zonas o niveles geo-políticos de manera a tomar decisiones adecuadas teniendo en cuenta cada situación en particular (Población y estado del sistema sanitario a nivel local principalmente).

Es así que se plantea el problema del análisis y reporte automatizado con un enfoque geográfico, de manera a contar con información cuantificada en diferentes niveles que reflejen el desarrollo de la pandemia a nivel local (relativamente). En ese sentido, se ha desarrollado este script tratando de proveer la mayor cantidad de información relevante a cada escala de trabajo, en el caso de Paraguay.

El objetivo principal del script es el de cuantificar e ilustrar la cantidad de casos confirmados acumulados y la cantidad de casos activos nivel de distritos, así también se presentan datos como el total de ambas variables a la fecha de actualización y un gráfico de barras presentando de manera descendente las unidades geográficas con mayor cantidad de casos confirmados.

Consideraciones:

  • Los datos trabajados son en última instancia correspondientes a los casos comunitarios o fuera de albergues (Derivados del contagio por transmisión comunitaria).
  • Los insumos necesarios son:
  • Datos tabulados de casos de COVID-19
  • Archivos shapefile correspondientes a las unidades geográficas a mapear (Distritos y departamentos).
  • Se basa principalmente en tidyverse, utilizando ggplot2 para la composición de los mapas
  • Cada mapa fue elaborado teniendo en cuenta la siguiente configuración de impresión (width = 18, height = 11, dpi = 300).

Metodología

El flujo de trabajo fue le siguiente:

  1. Carga de librerias
  2. Directorio de trabajo
  3. Importación los datos a utilizar
  4. Preparación datos geográficos
  5. Procesamiento de los datos COVID (Renombrar variables, cambiar formatos de campo, asignaciones, categorización, operaciones aritméticas, agrupaciones según conjuntos de variables).
  6. Composición de mapas
  7. Exportación

Carga de librerias a utilizar

#load libraries
##Library
  library(sf) # Manejo de datos vectoriales
  library(RColorBrewer) # Paletas
  library(tidyverse) # Procesamiento datos
  library(readxl) ## Importar datos excel
  library(ggplot2) # Visualizaciones, mapas
  library(ggspatial) # No
  library(ggrepel)
  library(scales)

Establecimiento del directorio de trabajo

    knitr::opts_knit$set(root.dir = normalizePath('C:/Users/carli/Google Drive/Proyecto_especializacion/directorio')) 

Importación de datos

Aquí se importan los datos necesarios, es decir los datos vectoriales en formato “shapefile” y las planillas “csv” correspondientes a los datos de COVID-19 en Paraguay. En relación a los datos shapefile es importante mencionar que, estos fueron previamente procesados, corrigiendose la topología y la tabla de atributos asociada (Códigos de departamentos y distritos), los datos correspondientes a departamentos y distritos fueron de esta manera adaptados de (DGEEC,2012). En cuanto a las zonas epidemiológicas estas fueron generadas agregando los departamentos que cada una abarca. De la misma manera, en orden a generar mapas de burbujas, se extrajeron los centroides de cada unidad geográfica y a estos le fue asignada toda la información espacial correspondiente.
# Se creo un objeto espacial el cual corresponde a los datos vectoriales de departamentos
dpto_shape <-
  read_sf('SHAPEFILES/wgs84_projected/covid_py_dptos.shp',
          stringsAsFactors = FALSE)
# Se creo un objeto espacial el cual corresponde a los datos vectoriales de distritos
# Además, se agrega un campo conteniendo el código del Dpto. y distrito de manera a identificar cada distrito de manera única
dist_shape <-
  read_sf('SHAPEFILES/wgs84_projected/covid_py_dist.shp',
          stringsAsFactors = FALSE) %>% mutate(dpto_dist_cod = paste(dpto_cod, dist_cod, sep = '_'))

##Capas de puntos
# Objeto espacial de puntos correspondiente a los centroides de los polígonos del archivo shapefile de departamentos
dpto_points <-
  read_sf('SHAPEFILES/wgs84_projected/covid_py_dpto_points.shp',
          stringsAsFactors = FALSE)%>% mutate(dpto_desc = ifelse(dpto_desc=="ÑEEMBUCU", "ÑEEMBUCU", dpto_desc))
# Objeto espacial de puntos correspondiente a los centroides de los polígonos del archivo shapefile de distritos
# Además, se agrega un campo conteniendo el código del Dpto. y distrito de manera a identificar cada distrito de manera única
dist_points <-
  read_sf('SHAPEFILES/wgs84_projected/covid_py_dist_points.shp',
          stringsAsFactors = FALSE) %>% mutate(dpto_dist_cod = paste(dpto_cod, dist_cod, sep = '_'))

# Objeto conteniendo los registros de casos de COVID-19 en Paraguay obtenidos del Ministerio de Salud Pública y Bienestar Social
# Aquí siempre es importante verificar el archivo de entrada, pues el mismo va siendo modificado en términos de formato por la misma fuente (MSyBS), principalemte separadores y formato de fecha
datos_brutos <-
  data.frame(
    read.csv(
      "Descargar_datos_Datos_completos_data.csv",
      sep = ';',
      encoding = "UTF-8",
      stringsAsFactors = FALSE
    )
  )

Preparación de datos geográficos para cada nivel o escala a mapear

Se procesaron los datos importados de los shapefile, preparandolos para agregarlos luego con los datos de las variables de COVID-19

# Creación de un dataframe alojando los datos de coodernadas de cada unidad a mapear (Los puntos son los centroides de los polígonos de cada distrito, departamento y zona)
  dpto_cords <-
    rename(
      dpto_points,
      dpto_desc = dpto_desc,
      dpto_cod = dpto_cod,
      "lon_dpto" = lon,
      "lat_dpto" = lat
    ) %>% select(dpto_desc, dpto_cod, lon_dpto, lat_dpto)## Se extraen las variables de dpto y dist desc y cod
  dist_cords <-
    rename(
      dist_points,
      dist_desc = dist_desc,
      dpto_dist_cod = dpto_dist_cod,
      "lon_dist" = lon,
      "lat_dist" = lat
    ) %>% select(dist_desc, dpto_dist_cod, lon_dist, lat_dist)

Procesamiento de datos con Dplyr

En esta sección se realizan tareas como: Renombrar campos (Variables), transformar los datos de las variables de manera a que sea más sencillo obtener información de ellas a partir de una escala dada.
#Renombrando los campos de la base de datos descargada de Salud
datos_covid <- rename(
  datos_brutos,
  fecha = Fecha.Confirmacion, # Debido a los frecuentes inconvenientes con este campo, es altamente recomendable trabajarlo de manera a eliminar previamente las fuentes posibles de error
  sexo = Sexo,
  dpto_desc = Departamento.Residencia,# Nombre del departamento
  dist_desc = Distrito.Residencia,#Nombre del distrito
  albergue = En.Albergue.,#  Si el caso corresponde a casos de albergues o fuera de albergues (comunitarios)
  dist_cod = Cod.Distrito, # Código entero que identifica al distrito de residencia dentro de su departamento 
  dpto_cod = Cod.Dpto, # Código entero que identifica al deparatamento de residencia del caso
  edad = Edad # Edad del afectado
)

# Se seleccionan y transforman los datos de manera a poder procesarlos por cada unidad espacial (Distritos, departamentos y zonas epidemiológicas)
# Siempre verificar los datos de fecha principalmente...
datos_covid_py <- select(datos_covid,
                      fecha,
                      sexo,
                      dpto_desc,
                      dist_desc,
                      albergue,
                      dist_cod,
                      dpto_cod,
                      edad) %>% mutate(
# Se cammbia el formato del campo fecha, de cadena a Date y se establece que es que (mes, día, año) en el formato específico
                        fecha = as.Date(fecha, "%d/%m/%Y"), # Importante: Verificar el formato de entrada, en caso de que se haya modificado simplemente cambiar la interpretacion segun sea %d: dia, %m: mes, %Y: año
# Se crea un campo para identificar los distritos de cada registro
                        dpto_dist_cod = paste(dpto_cod, dist_cod, sep = '_'),
                        dpto_desc = ifelse(dpto_desc=="ÑEEMBUCU", "ÑEEMBUCU", dpto_desc)) %>% mutate(
                        # Se calcula si el caso esta activo, esto se realiza tomando la fecha de confirmación del caso y sumando 21 días, luego se compara con la fecha del sistema
                        activo = ifelse((fecha + 21) < Sys.Date(), 0, 1),
# Se calcula la fecha del último día actividad, y se asigna a menos que dicha fecha sea mayor a la fecha del sistema, en cuyo caso se asigna la fecha del sistema
                        fecha_activo = ifelse((fecha + 21) < Sys.Date(),
                                              as.character((fecha + 21)),
                                              as.character(Sys.Date()))
                      ) %>% mutate(
# Se asigna la semana iso de la última fecha de actividad del registro
                        iso_last = as.integer(fecha_activo %>% strftime(format = "%V")),
                        dpto_dist_cod = paste(dpto_cod, dist_cod, sep = '_')
                      )%>% filter(datos_covid$albergue == "NO")

Resumen de variables por unidad geográfica y unión

En esta sección los datos transformados se agrupan y cuantifican por unidad geográfica (Departamentos y distritos), así también se determina la predominancia de ciertas variables en cada localidad. Las variables trabajadas son:

  • Cantidad de casos
  • Cantidad de casos activos

Finalmente a cada objeto creado se agregan los campos correspondientes a las coordenadas de los centroides de polígonos de las unidades geográficas

# Se agregan los datos de acuerdo al nivel a mapear
datos_dptos <-
  datos_covid_py %>% group_by(dpto_cod) %>% summarise(##Se agrupan los registros por departamentos en este caso 12 departamentos
    "cant_casos" = n(),
    ##Se cuenta el número de registros de agrupación
    "activo" = sum(as_tibble(activo))) %>% mutate(cant_casos = replace_na(cant_casos, 0)) %>% merge(dpto_cords, by = 'dpto_cod') %>%  select(-geometry)## Se agregan las coordenadas de centroides de cada departamento

## Resumen por distritos----
datos_dist <-
  datos_covid_py %>% group_by(dpto_dist_cod) %>% summarise("cant_casos" = n(),
                                                     "activo" = sum(as_tibble(activo)), ) %>% mutate(cant_casos = replace_na(cant_casos, 0)) %>% merge(dist_cords, by = 'dpto_dist_cod') %>% select(-geometry)
# Se realiza un join entre los sets procesados y los archivos espaciales----
#Poligonos
dpto_shape1 <-
  merge(dpto_shape, datos_dptos, by = 'dpto_cod', all.x = TRUE) %>% mutate(cant_casos = replace_na(cant_casos, 0)) %>% rename(dpto_desc = dpto_desc.x)

dist_shape1 <-
  merge(dist_shape, datos_dist, by = "dpto_dist_cod", all.x = TRUE) %>% rename(dist_desc = dist_desc.x)

#Puntos
dpto_points1 <-
  merge(dpto_points, datos_dptos, by = 'dpto_cod', all.x = TRUE)
dist_points1 <-
  merge(dist_points, datos_dist, by = "dpto_dist_cod", all.x = TRUE)

Composición de mapas con R

En esta etapa, los datos preparados y procesados anteriormente serán visualizados a través de mapas estáticos desarrollados a través del paquete Ggplot2.

Composición de mapas base

#ELEMENTOS COMPOSICIÓN DE MAPAS
  ##Mapas base poligonos

mapa_base_dpto <- dpto_shape %>%
  ggplot() + geom_sf(fill = "gray90",
                     alpha = 0.8,
                     colour = "Black")

mapa_base_dist <- dist_shape %>%
  ggplot() + geom_sf(fill = "gray90",
                     alpha = 0.1,
                     colour = "Black")

##Mapas base poligonos para burbujas

mapa_base_dpto_burbujas <- dpto_shape %>%
  ggplot() + geom_sf(fill = "gray75",
                     alpha = 0.8,
                     colour = "gray90")
mapa_base_dist_burbujas <- dist_shape %>%
  ggplot() + geom_sf(fill = "gray75",
                     alpha = 0.8,
                     colour = "gray90")

Breaks y labels

#Breaks y labels para leyendas
activo_breaks <-
  c(1, 25, 150, 500, 1000, 3000) # Breaks para la variable "activos"
cant_casos_breaks <-  c(25, 150, 500, 1000, 3000)

cant_casos_labels <-
  c("1 - 24", "25 - 149", "150 - 499", "500 - 999", "3000+")
#labels
activo_labels <-
  c("1 - 24", "25 - 149", "150 - 499", "500 - 999", "1000 - 2999", "3000+")# Labels para la variable "activos"

leg_title_cant_casos = c("Total de confirmados")
leg_title_activos = c("Total de activos")

# Fuentes
titulo_dist <-
  "Distribución distrital de casos de COVID-19 en Paraguay"
titullo_dpto  <-
  "Distribución departamental de casos de COVID-19 en Paraguay"
subtitulo <-
  paste(
    "Total confirmados:",
    format(
      sum(datos_dist$cant_casos, na.rm = TRUE),
      big.mark = ".",
      decimal.mark = ","
    ),
    "Total activos:",
    format(
      sum(datos_dist$activo, na.rm = TRUE),
      big.mark = ".",
      decimal.mark = ","
    )
  )
fuentes <-
  paste(
    'Fuentes: Datos de https://www.mspbs.gov.py/reporte-covid19.html',
    "| Datos actualizados al:",
    strftime(max(datos_covid_py$fecha), format = "%d/%m/%Y"),
    "\nContacto: Ing. Carlos Giménez: charlieswall@gmail.com / Dr. Pastor Pérez: peperez.estigarribia@pol.una.py"
  )

Mapas estáticos con Ggplot2

Mapa de total de casos confirmados por departamento

bar_cant_casos_dpto <-
  ggplotGrob(
    datos_dptos %>%  ggplot(aes(
      x = cant_casos,
      y = reorder(dpto_desc, cant_casos),
      fill = cant_casos
    )) +
      scale_fill_fermenter(
        breaks = cant_casos_breaks,
        na.value = "grey60",
        palette = "YlOrRd",
        direction = 1,
        limits = c(1, max(datos_dptos$cant_casos, na.rm = TRUE))
      ) +
      scale_x_continuous(breaks=c(0,2000, 4000))+
      geom_bar(stat = "identity") +
      theme(
        panel.background = element_blank(),
        panel.grid.major.x = element_line(colour = "gray70"),
        plot.title = element_text(family = "serif", size=11, face = "bold", hjust = 0, color = "#4e4d47"),
        plot.title.position = "plot",
        legend.position = "none",
        axis.title.x = element_text(size = 10, family = "serif", color = "#4e4d47"),
        axis.text.y.left = element_text(size = 7,
          hjust = 0,
          color = "#4e4d47",
         family = "serif"),
        axis.title.y =  element_blank()
      ) +
      geom_text(aes(label=cant_casos), hjust= 1,color="Black", size=3, family = "serif")+
      labs(x = "Casos confirmados", title = "Casos confirmados por departamento")
  )

#Mapa de cantidad de casos confirmados acumulados sin activos por polígonos
es_cant_confirmados_dpto <-
mapa_base_dpto + geom_sf(
  data = dpto_shape1,
  aes(fill = cant_casos),
  colour = "grey75"
) +
  scale_fill_fermenter(
    show.limits = TRUE,
    breaks = cant_casos_breaks,
    na.value = "grey60",
    palette = "YlOrRd",
    direction = 1,
    limits = c(1, max(dpto_shape1$cant_casos, na.rm = TRUE))
  ) +
  geom_label_repel(
    data = datos_dptos,
    aes(x = lon_dpto, y = lat_dpto, label = cant_casos),
    fontface = "bold",
    size = 4,
    alpha = 0.5,
    segment.color = "black",
    force = 0,
    nudge_x = ifelse(
      datos_dptos$dpto_cod == "0",-0.4,
      ifelse(datos_dptos$dpto_cod == "11",-0.1, 0)
    ),
    nudge_y = 0
  ) +
  annotate("rect", xmin = -63, xmax =-59.7, ymin = -26.1, ymax = -25.3, alpha = .2) +
  annotate("Text", x=-62.9, y=-25.7, label=  "Obs: El análisis se realizó en base a \ncasos fuera de albergue (comunitarios)", size=5,hjust = 0, family = "serif", color = "#4e4d47") +
 annotation_custom(
    bar_cant_casos_dpto,
    xmin = -53.7,
    xmax = -50,
    ymin = -28.2,
    ymax = -24
  ) +
  ## Para usar los brewer colors se implementa fill_fermenter o fill_distiller
  annotation_scale(location = "bl", width_hint = 0.4) +
  annotation_north_arrow(
    location = "tr",
    which_north = "true",
    pad_x = unit(0.2, "in"),
    pad_y = unit(0.2, "in"),
    style = north_arrow_fancy_orienteering
  ) +
  labs(fill = "Total confirmados",
       caption = fuentes,
       title = titullo_dpto,
       subtitle =  subtitulo)  +
  guides(
    fill = guide_bins(
      title.position = 'top',
      keywidth = unit(1.5, units = "cm"),
      keyheight = unit(0.8, units = "cm"),
      axis.linewidth = unit(0.4, units = "cm"),
      order = 1,
      show.limits = TRUE
    )
  ) +
  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    panel.background = element_blank(),
    plot.background = element_blank(),
    panel.grid.major = element_line(size = 0.5, linetype = "solid", colour = "gray80"),
    plot.title = element_text(family = "serif",color = "#4e4d47", size = 20,  face = "bold"),
    plot.subtitle = element_text(family = "serif",color = "#4e4d47", size = 18),
    plot.caption = element_text(
      hjust = 0,
      size = 10,
      color = "#4e4d47",
      family = "serif"
    ),
    legend.title = element_text(
      face = "bold",
      color = "#4e4d47",
      family = "serif",
      hjust = 0,
      size = 16
    ),
    legend.position = "right",
    legend.justification = c(0, 1),
    legend.background = element_blank(),
    legend.text = element_text(
      color = "#4e4d47",
      family = "serif",
      size = 15
    ),
    legend.key = element_blank(),
    legend.direction = "vertical",
  )

es_cant_confirmados_dpto

Mapa de casos confirmados por distrito

# Gráfico de barras para el mapa de casos confirmados por distrito
bar_dist_data_cant_casos <-
  datos_dist %>% arrange(desc(datos_dist$cant_casos))# Se ordenan los datos en orden descendente de cantidad de casos
bar_dist_data_cant_casos <-
  bar_dist_data_cant_casos[1:10, ]# Se extraen solo los 10 primeros registros correspondientes a los distritos con mayor cantidad de casos confirmados
# Se genera el grafico de barras
bar_cant_casos_dist <-
  ggplotGrob(
    bar_dist_data_cant_casos %>%  ggplot(aes(
      x = cant_casos,
      y = reorder(dist_desc, cant_casos),
      fill = cant_casos
    )) +
      scale_fill_fermenter(
        breaks = cant_casos_breaks,
        na.value = "grey60",
        palette = "YlOrRd",
        direction = 1,
        limits = c(1, max(datos_dist$cant_casos, na.rm = TRUE))
      ) +
      scale_x_continuous(breaks=c(0,2000, 4000))+
      geom_bar(stat = "identity") +
      theme(
        panel.background = element_blank(),
        panel.grid.major.x = element_line(colour = "gray70"),
        plot.title = element_text(family = "serif", size=11, face = "bold", hjust = 0, color = "#4e4d47"),
        plot.title.position = "plot",
        legend.position = "none",
        axis.title.x = element_text(size = 10, family = "serif", color = "#4e4d47"),
        axis.text.y.left = element_text(size = 7,
          hjust = 0,
          color = "#4e4d47",
         family = "serif"),
        axis.title.y =  element_blank()
      ) +
      geom_text(aes(label=cant_casos), hjust= 1,color="Black", size=3, family = "serif")+
      labs(x = "Casos confirmados", title = "Casos confirmados por distrito")
  )

#Mapa de cantidad de casos confirmados acumulados sin activos por polígonos
es_cant_confirmados_dist <-
mapa_base_dpto + geom_sf(
  data = dist_shape1,
  aes(fill = cant_casos),
  colour = "grey75"
) +
  scale_fill_fermenter(
    show.limits = TRUE,
    breaks = cant_casos_breaks,
    na.value = "grey60",
    palette = "YlOrRd",
    direction = 1,
    limits = c(1, max(dist_shape1$cant_casos, na.rm = TRUE))
  ) +
  annotate("rect", xmin = -63, xmax =-59.7, ymin = -26.1, ymax = -25.3, alpha = .2) +
  annotate("Text", x=-62.9, y=-25.7, label=  "Obs: El análisis se realizó en base a \ncasos fuera de albergue (comunitarios)", size=5,hjust = 0, family = "serif", color = "#4e4d47") +
 annotation_custom(
    bar_cant_casos_dist,
    xmin = -53.7,
    xmax = -50,
    ymin = -28.2,
    ymax = -24
  ) +
  ## Para usar los brewer colors se implementa fill_fermenter o fill_distiller
  annotation_scale(location = "bl", width_hint = 0.4) +
  annotation_north_arrow(
    location = "tr",
    which_north = "true",
    pad_x = unit(0.2, "in"),
    pad_y = unit(0.2, "in"),
    style = north_arrow_fancy_orienteering
  ) +
  labs(fill = "Total confirmados",
       caption = fuentes,
       title = titulo_dist,
       subtitle =  subtitulo)  +
  guides(
    fill = guide_bins(
      title.position = 'top',
      keywidth = unit(1.5, units = "cm"),
      keyheight = unit(0.8, units = "cm"),
      axis.linewidth = unit(0.4, units = "cm"),
      order = 1,
      show.limits = TRUE
    )
  ) +
  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    panel.background = element_blank(),
    plot.background = element_blank(),
    panel.grid.major = element_line(size = 0.5, linetype = "solid", colour = "gray80"),
    plot.title = element_text(family = "serif",color = "#4e4d47", size = 20,  face = "bold"),
    plot.subtitle = element_text(family = "serif",color = "#4e4d47", size = 18),
    plot.caption = element_text(
      hjust = 0,
      size = 10,
      color = "#4e4d47",
      family = "serif"
    ),
    legend.title = element_text(
      face = "bold",
      color = "#4e4d47",
      family = "serif",
      hjust = 0,
      size = 16
    ),
    legend.position = "right",
    legend.justification = c(0, 1),
    legend.background = element_blank(),
    legend.text = element_text(
      color = "#4e4d47",
      family = "serif",
      size = 15
    ),
    legend.key = element_blank(),
    legend.direction = "vertical",
  )

es_cant_confirmados_dist

Mapa de casos confirmados y activos por departamento

es_cant_casos_w_activo_dpto <-
  mapa_base_dpto + geom_sf(data = dpto_shape1,
                           aes(fill = cant_casos),
                           colour = "grey75") +
  scale_fill_fermenter(
    show.limits = TRUE,
    breaks = cant_casos_breaks,
    na.value = "grey60",
    palette = "YlOrRd",
    direction = 1,
    limits = c(1, max(dpto_shape1$cant_casos, na.rm = TRUE))
  ) +
  geom_point(
    data = datos_dptos,
    colour =  "Red",
    alpha = 0.5,
    aes(x = lon_dpto,
        y = lat_dpto,
        size = activo)
  ) +
  annotate(
    "rect",
    xmin = -63,
    xmax = -59.7,
    ymin = -26.1,
    ymax = -25.3,
    alpha = .2
  ) +
  annotate(
    "Text",
    x = -62.9,
    y = -25.7,
    label =  "Obs: El análisis se realizó en base a \ncasos fuera de albergue (comunitarios)",
    size = 5,
    hjust = 0,
    family = "serif",
    color = "#4e4d47"
  ) +
  annotation_custom(
    bar_cant_casos_dpto,
    xmin = -53.7,
    xmax = -50,
    ymin = -28.2,
    ymax = -24
  ) +
  scale_size_continuous(
    name = "Total activos",
    range = c(2, 20),
    limits = c(1, max(datos_dptos$activo, na.rm = TRUE)),
    breaks = activo_breaks,
    labels = activo_labels
  ) +
   ## Para usar los brewer colors se implementa fill_fermenter o fill_distiller
  annotation_scale(location = "bl", width_hint = 0.4) +
  annotation_north_arrow(
    location = "tr",
    which_north = "true",
    pad_x = unit(0.2, "in"),
    pad_y = unit(0.2, "in"),
    style = north_arrow_fancy_orienteering
  ) +
  labs(fill = "Total confirmados",
       caption = fuentes,
       title = titullo_dpto,
       subtitle =  subtitulo)  +
  guides(
    fill = guide_bins(
      title.position = 'top',
      keywidth = unit(1.5, units = "cm"),
      keyheight = unit(0.8, units = "cm"),
      axis.linewidth = unit(0.4, units = "cm"),
      order = 1,
      show.limits = TRUE
    )
  ) +
  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    panel.background = element_blank(),
    plot.background = element_blank(),
    panel.grid.major = element_line(size = 0.5, linetype = "solid", colour = "gray80"),
    plot.title = element_text(family = "serif",color = "#4e4d47", size = 20,  face = "bold"),
    plot.subtitle = element_text(family = "serif",color = "#4e4d47", size = 18),
    plot.caption = element_text(
      hjust = 0,
      size = 10,
      color = "#4e4d47",
      family = "serif"
    ),
    legend.title = element_text(
      face = "bold",
      color = "#4e4d47",
      family = "serif",
      hjust = 0,
      size = 16
    ),
    legend.position = "right",
    legend.justification = c(0, 1),
    legend.background = element_blank(),
    legend.text = element_text(
      color = "#4e4d47",
      family = "serif",
      size = 15
    ),
    legend.key = element_blank(),
    legend.direction = "vertical",
  )
es_cant_casos_w_activo_dpto

Mapa de total de casos confirmados y activos por distrito

es_cant_casos_w_activo_dist <-
mapa_base_dpto + geom_sf(
  data = dist_shape1,
  aes(fill = cant_casos),
  colour = "grey75"
) +
  scale_fill_fermenter(
    show.limits = TRUE,
    breaks = cant_casos_breaks,
    na.value = "grey60",
    palette = "YlOrRd",
    direction = 1,
    limits = c(1, max(dist_shape1$cant_casos, na.rm = TRUE))
  ) +
  geom_point(
    data = datos_dist,
    colour =  "Red",
    alpha = 0.5,
    aes(x = lon_dist,
        y = lat_dist,
        size = activo)
  ) +
  annotate("rect", xmin = -63, xmax =-59.7, ymin = -26.1, ymax = -25.3, alpha = .2) +
  annotate("Text", x=-62.9, y=-25.7, label=  "Obs: El análisis se realizó en base a \ncasos fuera de albergue (comunitarios)", size=5,hjust = 0, family = "serif", color = "#4e4d47") +
 annotation_custom(
    bar_cant_casos_dist,
    xmin = -53.7,
    xmax = -50,
    ymin = -28.2,
    ymax = -24
  )  +
  scale_size_continuous(
    name = "Total activos",
    range = c(2, 20),
    limits = c(1, max(datos_dist$activo, na.rm = TRUE)),
    breaks = activo_breaks,
    labels = activo_labels
  ) +
  ## Para usar los brewer colors se implementa fill_fermenter o fill_distiller
  annotation_scale(location = "bl", width_hint = 0.4) +
  annotation_north_arrow(
    location = "tr",
    which_north = "true",
    pad_x = unit(0.2, "in"),
    pad_y = unit(0.2, "in"),
    style = north_arrow_fancy_orienteering
  ) +
  labs(fill = "Total confirmados",
       caption = fuentes,
       title = titulo_dist,
       subtitle =  subtitulo)  +
  guides(
    fill = guide_bins(
      title.position = 'top',
      keywidth = unit(1.5, units = "cm"),
      keyheight = unit(0.8, units = "cm"),
      axis.linewidth = unit(0.4, units = "cm"),
      order = 1,
      show.limits = TRUE
    )
  ) +
  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    panel.background = element_blank(),
    plot.background = element_blank(),
    panel.grid.major = element_line(size = 0.5, linetype = "solid", colour = "gray80"),
    plot.title = element_text(family = "serif",color = "#4e4d47", size = 20,  face = "bold"),
    plot.subtitle = element_text(family = "serif",color = "#4e4d47", size = 18),
    plot.caption = element_text(
      hjust = 0,
      size = 10,
      color = "#4e4d47",
      family = "serif"
    ),
    legend.title = element_text(
      face = "bold",
      color = "#4e4d47",
      family = "serif",
      hjust = 0,
      size = 16
    ),
    legend.position = "right",
    legend.justification = c(0, 1),
    legend.background = element_blank(),
    legend.text = element_text(
      color = "#4e4d47",
      family = "serif",
      size = 15
    ),
    legend.key = element_blank(),
    legend.direction = "vertical",
  )
es_cant_casos_w_activo_dist
## Warning: Removed 13 rows containing missing values (geom_point).

Exportando archivos

Exportando con ggsave, como se puede ver, el primer parámetro corresponde a el nombre que tendrá el archivo, es importante especificar la extensión, el segundo parámetro corres ponde al objeto, y luego para este caso se especifican el ancho y altura en pulgadas, vale la pena mencionar que es posible especificar la unidad de medida y también la calidad en dpi.

ggsave( "es_cant_confirmados_dpto.png", es_cant_confirmados_dpto, width = 18, height = 11, dpi = 300)

ggsave( "es_cant_confirmados_dist.png", es_cant_confirmados_dist, width = 18, height = 11, dpi = 300)

ggsave( "es_cant_casos_w_activo_dpto.png", es_cant_casos_w_activo_dpto, width = 18, height = 11, dpi = 300)

ggsave( "es_cant_casos_w_activo_dist.png", es_cant_casos_w_activo_dist, width = 18, height = 11, dpi = 300)

Bibliografía