Cargamos las librerias

library(tidyverse)
library(aweek)
library(lubridate)
library(sf)
library(janitor)
library(ggsn)

Cargamos las bases de datos

salud_clima_lamb<-readRDS(file = "data_cruda/salud_clima_lamb.rds")

salud_clima_dep<-readRDS(file = "data_cruda/salud_clima_departamento.rds")

salud_clima_lamb es la base trabajada en la clase 2 y salud_clima_dep es una base similar a nivel de departamentos.


Procedimiento

Primero preparamos la data que queremos visualizar, vamos a calcular una matriz con a nivel semanal, tanto para la provincias de Lambayeque y para Departamentos del PerĆŗ.

casos_semanales_lamb<-salud_clima_lamb %>%
  group_by(semana,provincia)%>%
  summarise(casos=sum(casos),
            tmax=mean(tmax_sem_prov,na.rm=T),
            tmin=mean(tmin_sem_prov,na.rm=T),
            tmean=mean(tmean_sem_prov,na.rm=T),
            pp=mean(pp_sem_prov,na.rm=T))%>%
  ungroup()

salud_clima_lamb<-salud_clima_lamb%>%
  rename(tmax=tmax_sem_prov,
         tmin=tmin_sem_prov,
         tmean=tmean_sem_prov,
         pp=pp_sem_prov)

salud_clima_dep<-salud_clima_dep%>%
  mutate(semana=as.integer(substring(fechaepi,7,8)))

casos_semanales_dep<-salud_clima_dep %>%
  group_by(semana,departamento)%>%
  summarise(casos=sum(casos),
            tmax=mean(tmax,na.rm=T),
            tmin=mean(tmin,na.rm=T),
            tmean=mean(tmean,na.rm=T),
            pp=mean(pp,na.rm=T))%>%
  ungroup()

1) Graficos de lineas

1.1) Casos de dengue

1.1.1) Casos de dengue por semana Lambayeque

ggplot(data=casos_semanales_lamb,aes(x=semana,y=casos))+
      geom_line()+ 
      facet_wrap(~provincia,nrow = 3,scales="free_y") 
Este es el grafico mƔs sencilo, solo llamamos el mapping de lo que queremos graficar(aes(x=semana,y=casos)), el geom que queremos dibujar y las facetas que dividimos segun la provincia

Ahora vamos a cambiar el color (color=ā€œsteelblue4ā€) y grosor (lwd=0.5) de la linea y agregamos etiquetas a los ejes, titulo al grafico con el comando labs

ggplot(data=casos_semanales_lamb,aes(x=semana))+
      geom_line(aes(y=casos),color="steelblue4", lwd=0.5)+ 
      labs(x="Semanas",y="Casos de dengue",
           caption = "Fuente: Elaboración propia",
           title = "Casos de Dengue Semanales para provincias de Lambayeque, periodo 2010-2020")+
      facet_wrap(~provincia,nrow = 3,scales="free_y") 

Para eliminar el espacio entre los ejes usamos el argumento expand=c(0,0) en las opciones de escala del eje, asimismo, para que aparezcan todos los valores en el eje X usamos breaks=1:53

ggplot(data=casos_semanales_lamb,aes(x=semana))+
      geom_line(aes(y=casos),color="steelblue4", lwd=0.5)+ 
      scale_x_continuous(breaks=1:53,expand = c(0,0)) +  
      scale_y_continuous(expand = c(0,0))+
      labs(x="Semanas",y="Casos de dengue",
           caption = "Fuente: Elaboración propia",
           title = "Casos de Dengue Semanales para provincias de Lambayeque, periodo 2010-2020")+
      facet_wrap(~provincia,nrow = 3,scales="free_y") 

Finalmente, agregamos el tema theme_bw() y cambiamos el tamaƱo de texto del eje X con axis.text.x = element_text(size = 6)

ggplot(data=casos_semanales_lamb,aes(x=semana))+
      geom_line(aes(y=casos),color="steelblue4", lwd=0.5)+ 
      scale_x_continuous(breaks=1:53,expand = c(0,0)) +  
      scale_y_continuous(expand = c(0,0))+
      theme_bw() +  
      theme(axis.text.x = element_text(size = 6))+   
      labs(x="Semanas",y="Casos de dengue",
           caption = "Fuente: Elaboración propia",
           title = "Casos de Dengue Semanales para provincias de Lambayeque, periodo 2010-2020")+
      facet_wrap(~provincia,nrow = 3,scales="free_y") 


1.1.2) Linea de tiempo de casos de dengue para Lambayeque

En este caso en el eje X se encuentra las fechas, por lo que usaremos el comando scale_X_date para escale el eje segun las fechas (esto es util cuando tienes datos faltantes y quieres una división uniforme del eje X)

ggplot(data=salud_clima_lamb,aes(x=fecha,y=casos))+
      geom_line(color="steelblue4", lwd=0.5)+
      scale_x_date(expand = c(0,0),date_labels = "%W-%Y",
                   breaks = "12 weeks") +    
      scale_y_continuous(expand = c(0,0))+
      theme_bw()+
      theme(axis.text.x = element_text(angle=90,size = 6))+ 
      labs(x="Semana Epidemeológia",y="Casos de dengue",
           caption = "Fuente: Elaboración propia",
           title = "Casos de Dengue en Lambayeque, periodo 2010-2020")+
      facet_wrap(~provincia,nrow = 3,scales="free_y")

Con el comando geom_vline podemos agregar lineas verticales a los graficos, solo dando la coordenada de intecepto del eje X, en este caso se dibuja una linea para separar los aƱo

ggplot(data=salud_clima_lamb,aes(x=fecha,y=casos))+
      geom_line(color="steelblue4", lwd=0.5)+
      scale_x_date(expand = c(0,0),date_labels = "%W-%Y",
                   breaks = "12 weeks") +                 
      scale_y_continuous(expand = c(0,0))+
      geom_vline(xintercept=as.Date(seq(from = as.Date("2010-01-01"),
                to = as.Date("2021-01-01"),by = "1 year")), linetype=4)+  
      theme_bw()+
      theme(axis.text.x = element_text(angle=90,size = 6))+ 
      labs(x="Semana Epidemeológia",y="Casos de dengue",
           caption = "Fuente: Elaboración propia",
           title = "Casos de Dengue en Lambayeque, periodo 2010-2020")+
      facet_wrap(~provincia,nrow = 3,scales="free_y")


1.2) Temperatura

1.2.1) Temperatura por semana

En caso que queramos agregar varios geoms podemos llamar al mapping en cada geom como se ve a continuacion:

ggplot(data=casos_semanales_lamb,aes(x=semana))+
  geom_line(aes(y=tmax,color="Tmax"), lwd=0.8)+
  geom_line(aes(y=tmin,color="Tmin"), lwd=0.8)+
  geom_line(aes(y=tmean,color="Tmean"), lwd=0.8)+
  scale_x_continuous(breaks=1:53,expand = c(0,0)) + 
  theme_bw() +
  theme(axis.text.x = element_text(size = 6),
        legend.position = "bottom")+
  labs(x="Semanas",y="Temperatura (ĀŗC)",
       caption = "Fuente: Elaboración propia",
       title = "Promedio Semanales de Temperatura para Lambayeque, periodo 2010-2020",
       color="")+
  facet_wrap(~provincia,nrow = 3,scales="free_y")


1.2.2) Linea de tiempo de temperatura

ggplot(data=salud_clima_lamb,aes(x=fecha))+
      geom_line(aes(y=tmax,color="Tmax"), lwd=0.8)+
      geom_line(aes(y=tmin,color="Tmin"), lwd=0.8)+
      geom_line(aes(y=tmean,color="Tmean"), lwd=0.8)+
      scale_x_date(expand = c(0,0),date_labels = "%W-%Y",
                   breaks = "12 weeks") +
      scale_y_continuous(expand = c(0,0))+
      geom_vline(xintercept=as.Date(seq(from = as.Date("2010-01-01"),
                to = as.Date("2021-01-01"),by = "1 year")), linetype=4)+
      theme_bw()+
      theme(axis.text.x = element_text(angle=90,size = 8),
            legend.position = "bottom")+
      labs(x="Fecha",y="Temperatura (ĀŗC)",
           caption = "Fuente: Elaboración propia",
           title = "Temperatura semanal de Lambayeque, periodo 2010-2020",
           color="")+
      facet_wrap(~provincia,nrow = 3,scales="free_y")


2) Graficos de heat map

2.1) Casos

En el grafico de heat map los datos se representan mediante una escala que se le de al argumento fill.

ggplot(data=casos_semanales_dep,aes(x=semana,y=departamento))+
  geom_tile(aes(fill=casos))+
  scale_x_continuous(breaks=1:53,expand = c(0,0)) + 
  scale_y_discrete(expand = c(0,0))+
  theme_bw()+
  theme(legend.position = "bottom",
        axis.text.x = element_text(size = 7),
        axis.text.y = element_text(size = 7))+
  labs(x="Semanas",y="Departamento",
       caption = "Fuente: Elaboración propia",
       title = "Casos de Dengue Semanales, periodo 2010-2020",
       fill="Casos")

Para los grĆ”ficos que usemos el argumento fill usaremos el paquete viridis que presenta escalas de colores mĆ”s visibles para personas que tienen daltonismo. En este caso, como vemos que los valores entre los departamentos es muy variada usamos una transformacion logaritmica en la escala para que se note mejor la diverencia (trans=ā€œlogā€), el argumento option = ā€œplasmaā€ es para seleccionar una de las paletas de colores que ofrece el paquete viridis

ggplot(data=casos_semanales_dep,aes(x=semana,y=departamento))+
  geom_tile(aes(fill=casos))+
  scale_x_continuous(breaks=1:53,expand = c(0,0)) + 
  scale_y_discrete(expand = c(0,0))+
  scale_fill_viridis_c(trans="log",option = "plasma",breaks=c(1,10,100,1000))+
  theme_bw()+
  theme(legend.position = "bottom",
        axis.text.x = element_text(size = 7),
        axis.text.y = element_text(size = 7))+
  labs(x="Semanas",y="Departamento",
       caption = "Fuente: Elaboración propia",
       title = "Casos de Dengue Semanales, periodo 2010-2020",
       fill="Casos")


2.2) Temperatura media

Otra manera de cambiar los colores del fill es agregando nosotros mismos los colores que queremos en la paleta con el comando scale_fill_gradientn y agregamos los colores en codigo hex (en R podemos llamar los colores por nombres, código hex y código rgb).

ggplot(data=casos_semanales_dep,aes(x=semana,y=departamento))+
  geom_tile(aes(fill=tmean))+
  scale_x_continuous(breaks=1:53,expand = c(0,0)) + 
  scale_y_discrete(expand = c(0,0))+
  scale_fill_gradientn(colours = c("#053061","#246BAE",#549EC9","#A6CFE3",
                                   "#E1EDF3","#FAE7DC","#F7B799","#DC6F58",
                                   "#B6202E","#67001F"))+
  theme_bw()+
  theme(legend.position="bottom",axis.text.x = element_text(size = 7),
        axis.text.y = element_text(size = 7))+
  labs(x="Semanas",y="Departamento",
       caption = "Fuente: Elaboración propia",
       title = "Temperatura media semanal, periodo 2010-2020",
       fill="Temperatura (ĀŗC)")


2.3) Precipitacion

ggplot(data=casos_semanales_dep,aes(x=semana,y=departamento))+
  geom_tile(aes(fill=pp))+
  scale_x_continuous(breaks=1:53,expand = c(0,0)) + 
  scale_y_discrete(expand = c(0,0))+
  scale_fill_viridis_c(trans="log",breaks=c(1,10,100,1000))+
  theme_bw()+
  theme(legend.position="bottom",axis.text.x = element_text(size = 7),
        axis.text.y = element_text(size = 7))+
  labs(x="Semanas",y="Departamento",
       caption = "Fuente: Elaboración propia",
       title = "Precipitación Media Semanal, periodo 2010-2020",
       fill="precipitación (mm)")


3) Graficos de barras

Si en un mismo grƔfico de barras vamos a poner valores de diferentes observaciones, debemos dar un valor al argumento position. Los valores que puede tomar position son: dodge para ponerlas separadas, stack para poner una por encima de otra y fill que normaliza los datos y los pone uno por encima de otro.

3.1) Casos semanales de dengue para Lambayeque

ggplot(data=casos_semanales_lamb,aes(x=semana,y=casos,fill=provincia))+
  geom_col(position = "dodge")+
  scale_x_continuous(breaks=1:53,expand = c(0,0))+
  scale_y_continuous(expand = c(0,0))+
  scale_fill_viridis_d()+
  theme_bw()+
  theme(legend.key.height = unit(0.1, 'cm'), 
        legend.key.width = unit(0.1, 'cm'), 
        legend.title = element_text(size=8),
        legend.text = element_text(size=6), 
        legend.position = "bottom",
        legend.background = element_rect(linetype = 1, size = 0.5, colour = 1),
        axis.text.x = element_text(size = 6),
        axis.text.y = element_text(size = 6)) +
  labs(x="Semana",y="Promedios semanales de Casos de dengue",
       caption = "Fuente: Elaboración propia",
       title = "Promedios semanales de Casos de dengue en provincia de Lambayeque, periodo 2010-2020",
       fill="Provincias")


3.2) Casos semanales de dengue por departamento

ggplot(data=casos_semanales_dep,aes(x=semana,y=casos,fill=departamento))+
  geom_col(position = "stack")+
  scale_x_continuous(breaks=1:53,expand = c(0,0))+
  scale_y_continuous(expand = c(0,0))+
  scale_fill_viridis_d()+
  theme_bw()+
  theme(legend.key.height = unit(0.1, 'cm'),
        legend.key.width = unit(0.1, 'cm'),
        legend.title = element_text(size=8), 
        legend.text = element_text(size=6), 
        legend.position = "bottom",
        legend.background = element_rect(linetype = 1, size = 0.5, colour = 1),
        axis.text.x = element_text(size = 6),
        axis.text.y = element_text(size = 6)) +
  labs(x="Semana",y="Promedios semanales de Casos de dengue",
       caption = "Fuente: Elaboración propia",
       title = "Promedios semanales de Casos de dengue por departamento, periodo 2010-2020",
       fill="Departamentos")


3.3) Precipitacion

ggplot(data=casos_semanales_dep,aes(x=semana,y=pp,fill=departamento))+
  geom_col(position = "stack")+
  scale_x_continuous(breaks=1:53,expand = c(0,0))+
  scale_y_continuous(expand = c(0,0))+
  scale_fill_viridis_d()+
  theme_bw()+
  theme(legend.key.height = unit(0.1, 'cm'),
        legend.key.width = unit(0.1, 'cm'),
        legend.title = element_text(size=8),
        legend.text = element_text(size=6),
        legend.position = "bottom",
        legend.background = element_rect(linetype = 1, size = 0.5, colour = 1),
        axis.text.x = element_text(size = 6),
        axis.text.y = element_text(size = 6)) +
  labs(x="Semana",y="Precipitación (mm)",
       caption = "Fuente: Elaboración propia",
       title = "Promedio semanal de Precipitación por Departamento, periodo 2010-2020",
       fill="Departamentos")


4) Graficos de combinados

4.1) graficos de barras de casos/ lineas de PP

Para graficar 2 variables en un mismo grafico es necesario hacer una transformacion al eje secundario, este proceso se complica si tienes muchas observaciones por eso primero vamos a extraer datos para el departamento de lambayeque del data.frame casos_semanales_dep.

casos_semanales_dep_lamb<-casos_semanales_dep%>%
  filter(departamento=="LAMBAYEQUE")

Comenzamos graficando las barras de casos de dengue, al hacer esto el mapping del eje ā€œYā€ ya queda determinado con los valores de los casos de dengue.

ggplot(data=casos_semanales_dep_lamb,aes(x=semana))+
  geom_col(aes(y=casos),fill="steelblue4")+
  scale_x_continuous(breaks=1:53,expand = c(0,0))+
  scale_y_continuous(expand = c(0,0))+
  theme_bw()+
  theme(legend.key.height = unit(0.1, 'cm'),
        legend.key.width = unit(0.1, 'cm'),
        legend.title = element_text(size=8),
        legend.text = element_text(size=8),
        legend.position = "bottom",
        legend.background = element_rect(linetype = 1, size = 0.5, colour = 1),
        axis.text.x = element_text(size = 8),
        axis.text.y = element_text(size = 8)) +
  labs(x="Semana",y="Promedios semanales de Casos de dengue",
       caption = "Fuente: Elaboración propia",
       title = "Promedios semanales de Casos de dengue y precipitación \n en provincia de Lambayeque, periodo 2010-2020")

Si ahora agregamos una linea con los valores medios de precipitación estos se van a ajustar al eje de casos.

ggplot(data=casos_semanales_dep_lamb,aes(x=semana))+
  geom_col(aes(y=casos),fill="steelblue4")+
  geom_line(aes(y=pp,color="Promedio semanal de Precipitación"), lwd=0.8)+
  scale_x_continuous(breaks=1:53,expand = c(0,0))+
  scale_y_continuous(expand = c(0,0))+
  theme_bw()+
  theme(legend.key.height = unit(0.1, 'cm'),
        legend.key.width = unit(0.1, 'cm'),
        legend.title = element_text(size=8),
        legend.text = element_text(size=8),
        legend.position = "bottom",
        legend.background = element_rect(linetype = 1, size = 0.5, colour = 1),
        axis.text.x = element_text(size = 8),
        axis.text.y = element_text(size = 8)) +
  labs(x="Semana",y="Promedios semanales de Casos de dengue",
       caption = "Fuente: Elaboración propia",
       title = "Promedios semanales de Casos de dengue y precipitación \n en provincia de Lambayeque, periodo 2010-2020",
       fill="",
       color="Leyenda")

Como vemos que estos valores son aproximadamente la mitad de la precipitación media, en vez de graficar la precipitacion podemos graficar el doble de la pp y hacer esta transformacion al eje secundario (sec_axis(~./2,), como multiplicamos la PPx2 dividimos el eje en 2).

ggplot(data=casos_semanales_dep_lamb,aes(x=semana))+
  geom_col(aes(y=casos),fill="steelblue4")+
  geom_line(aes(y=pp*2,color="Promedio semanal de Precipitación"), lwd=0.8)+
  scale_x_continuous(breaks=1:53,expand = c(0,0))+
  scale_y_continuous(expand = c(0,0),
                     sec.axis = sec_axis(~./2, name = "Precipitación [mm]"))+
  theme_bw()+
  theme(legend.key.height = unit(0.1, 'cm'),
        legend.key.width = unit(0.1, 'cm'),
        legend.title = element_text(size=8),
        legend.text = element_text(size=8),
        legend.position = "bottom",
        legend.background = element_rect(linetype = 1, size = 0.5, colour = 1),
        axis.text.x = element_text(size = 8),
        axis.text.y = element_text(size = 8)) +
  labs(x="Semana",y="Promedios semanales de Casos de dengue",
       caption = "Fuente: Elaboración propia",
       title = "Promedios semanales de Casos de dengue y precipitación \n en provincia de Lambayeque, periodo 2010-2020",
       fill="",
       color="Leyenda")

Finalmente, si queremos agregar una linea suavizada podemos usar el geom_smooth.

ggplot(data=casos_semanales_dep_lamb,aes(x=semana))+
  geom_col(aes(y=casos),fill="steelblue4")+
  geom_line(aes(y=pp*2,color="Promedio semanal de Precipitación"), lwd=0.8)+
  geom_smooth(aes(y=pp*2,color="Linea de Tendencia de la Precipitación"), lwd=0.8,se = F)+
  scale_x_continuous(breaks=1:53,expand = c(0,0))+
  scale_y_continuous(expand = c(0,0),
                     sec.axis = sec_axis(~./2, name = "Precipitación [mm]"))+
  theme_bw()+
  theme(legend.key.height = unit(0.1, 'cm'),
        legend.key.width = unit(0.1, 'cm'),
        legend.title = element_text(size=8),
        legend.text = element_text(size=8),
        legend.position = "bottom",
        legend.background = element_rect(linetype = 1, size = 0.5, colour = 1),
        axis.text.x = element_text(size = 8),
        axis.text.y = element_text(size = 8)) +
  labs(x="Semana",y="Promedios semanales de Casos de dengue",
       caption = "Fuente: Elaboración propia",
       title = "Promedios semanales de Casos de dengue y precipitación \n en provincia de Lambayeque, periodo 2010-2020",
       fill="",
       color="Leyenda")


5) Graficos en mapas

5.1) Preparando la data

Para graficar mapas en R necesitamos archivos shapefile con lo que queremos graficar, en este caso tenemos los shapefile de los departamentos del PerĆŗ.

#carga de datos shapefile
shp_depa <- st_read('data_cruda/SHP/DEPARTAMENTOS.shp')
## Reading layer `DEPARTAMENTOS' from data source 
##   `C:\Users\Usuario\Desktop\Curso CDC\Curso Clima y Salud\Curso CDC Practica Día 3\Practica 3\data_cruda\SHP\DEPARTAMENTOS.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 25 features and 1 field
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -81.3281 ymin: -18.35093 xmax: -68.65309 ymax: -0.03860597
## Geodetic CRS:  WGS 84
# Dentro del shapefile hay varias listas, con clean_names() nos aseguramos de limpiar la data de caracteres especiales y cambiamos el nombre a departamento
shp_depa <- shp_depa %>% 
  clean_names() %>% 
  rename(departamento = departamen) 

# Calculamos los casos totales de dengue por departamento entre 2010-2020
data_mapa <- salud_clima_dep %>% 
  group_by(departamento) %>% 
  summarise(casos = sum(casos, na.rm = T)) %>% 
  ungroup()

data_shp_dep <- merge(shp_depa, data_mapa, by = c('departamento'))

5.2) GrƔfico de mapas

data_shp_dep %>% 
  ggplot(aes(fill = casos, label = departamento)) + 
  geom_sf() +
  geom_sf_label(fill = 'white', alpha = 0.8, size = 2) +
  scale_fill_viridis_c(breaks=c(0,103,4861,14399),trans="log")+
  theme_bw()+
  labs(fill = 'N° de casos', caption = 'Fuente: Elaboración propia',
       x= 'Longitud', y= 'Latitud',
       title = 'Mapa de casos de dengue por departamento, PerĆŗ 2010-2020') +
  north(data = data_shp_dep, symbol = 3,location = 'topleft')





Elaboración:

SENAMHI - Ministerio del Ambiente / CDC - Ministerio de Salud