library(tidyverse)
library(aweek)
library(lubridate)
library(sf)
library(janitor)
library(ggsn)
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.
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()
ggplot(data=casos_semanales_lamb,aes(x=semana,y=casos))+
geom_line()+
facet_wrap(~provincia,nrow = 3,scales="free_y")
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")
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")
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")
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")
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")
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)")
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)")
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.
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")
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")
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")
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")
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'))
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')