Desde hace algunas semanas, a pedido de mi jefe, he venido investigando una manera alternativa a RMarkDown para realizar reportes en formato PDF, ello debido a los inconvenientes que suele presentar RMarkDown cuando se utiliza en Windows. De dicha búsqueda, encontré el paquete ggpubr y cowplot, que permiten diseñar lienzos o canvas con una medida en específica al que se puede insertar gráficas, imágenes y textos, con lo cual, permite realizar reportes automatizados en formatos de alto impacto.
Para mostrar la utilidad de este paquete desarrollaremos un reporte sobre las cifras de decesos en el Perú que provee SINADEF. Pero antes de ello, es necesario instalar dicho paquete (ggpubr) en R, para hacerlo podemos guiarnos de este artículo. Una vez instalado el paquete, debemos descargar las cifras en formato CSV aquí para elaborar nuestro reporte, y recomendación a parte, guardar toda la data a utilizar en un solo directorio.
A parte haremos uso de otros paquetes, que nos ayudarán a la generación de gráficos, ordenamiento de dichos gráficos dentro del lienzo, procesamiento y manipulación de información, y generación de mapas.
library(ggplot2)
library(ggpubr)
library(tidyverse)
library(cowplot)
library(grid)
library(gridExtra)
library(sf)
df <- read.csv(
"fallecidos_sinadef.csv",
sep = ";",
header = T,
skip = 2
)
head(df[1:5])
## Nº TIPO.SEGURO SEXO EDAD TIEMPO.EDAD
## 1 1 SIS FEMENINO 86 AÑOS
## 2 2 IGNORADO MASCULINO 38 AÑOS
## 3 3 USUARIO FEMENINO 64 AÑOS
## 4 4 IGNORADO MASCULINO 20 AÑOS
## 5 5 IGNORADO MASCULINO 1 DIAS
## 6 6 IGNORADO MASCULINO 36 AÑOS
df$FECHA <- as.Date(df$FECHA, format = "%Y-%m-%d") #Se transforma la variable FECHA a formato fecha
df<-df %>% filter(FECHA >= as.Date("2020-01-01") &
FECHA <= as.Date("2020-12-31"),
SEXO %in% c("MASCULINO","FEMENINO"))#Filtramos los datos a gusto
departamental<- sf::read_sf("D:/Proyectos personales/Funciones en R/Mapa del Perú/Departamental/DEPARTAMENTOS.shp")# Cargamos un shapefile para generar mapas
Nota: Los archivos shapefile se descargaron de GEO GPS PERU.
Para este punto, realizaremos unos gráficos y los guardaremos en diferentes objetos para reutilizarlos posteriormente haciendo uso de la función draw_plot de ggpubr, dicha función te permite añadir dentro de ggdraw. Dichos gráficos serán de las cifras de último año.
Veamos en un principio un histograma básico acerca de la edad de los fallecidos durante el 2020 y las subdividimos por la variable sexo.
grafico1 <- df %>%
mutate(EDAD = as.numeric(EDAD)) %>%
ggplot(aes(EDAD,fill=SEXO)) +
geom_histogram(stat = "count") +
scale_fill_manual(values= c("#00AFBB", "#E7B800"))+
theme_bw() +
labs(y = "Cantidad de fallecidos", x = "Edad del fallecido")+
facet_grid(SEXO~.)
grafico1 <- grid.arrange(grafico1,
bottom = textGrob(
"SINADEF",
x = .98,
hjust = 1,
gp = gpar(fontface = "italic", fontsize = 9)
))#utilizamos la funcion grid.arrange para agregar texto en la gráfica
grafico1
## TableGrob (2 x 1) "arrange": 2 grobs
## z cells name grob
## 1 1 (1-1,1-1) arrange gtable[layout]
## 2 2 (2-2,1-1) arrange text[GRID.text.107]
Ahora hagamos una serie de tiempo por mes de la distribución de los decesos en el 2020 y dividamoslo por la variable sexo.
grafico2 <- df %>%
count(FECHA,SEXO) %>%
ggplot(aes(x=FECHA,y=n)) +
geom_line(aes(col=SEXO))+
scale_x_date(date_labels = "%b")+
theme_bw() +
labs(y = "Cantidad de fallecidos",x="")+
theme(legend.position = "top",
legend.title = element_blank())
grafico2 <- grid.arrange(grafico2,
bottom = textGrob(
"SINADEF",
x = .98,
hjust = 1,
gp = gpar(fontface = "italic", fontsize = 9)
)) #utilizamos la funcion grid.arrange para agregar texto en la gráfica
grafico2
## TableGrob (2 x 1) "arrange": 2 grobs
## z cells name grob
## 1 1 (1-1,1-1) arrange gtable[layout]
## 2 2 (2-2,1-1) arrange text[GRID.text.162]
Generamos un gráfico del tipo violin para observar la distribución por sexo y edades de los decesos en el 2020.
grafico3 <- df %>%
mutate(EDAD=as.numeric(EDAD))%>%
ggplot(aes(x=SEXO,y=EDAD)) +
geom_violin(scale = "count",aes(fill=SEXO))+
scale_fill_manual(values=c("#00AFBB", "#E7B800"))+
theme_bw() +
labs(y = "Edad",x="")+
theme(legend.position = "top",
legend.title = element_blank())
grafico3 <- grid.arrange(grafico3,
bottom = textGrob(
"SINADEF",
x = .98,
hjust = 1,
gp = gpar(fontface = "italic", fontsize = 9)
)) #utilizamos la funcion grid.arrange para agregar texto en la gráfica
grafico3
## TableGrob (2 x 1) "arrange": 2 grobs
## z cells name grob
## 1 1 (1-1,1-1) arrange gtable[layout]
## 2 2 (2-2,1-1) arrange text[GRID.text.222]
Por último, realizaremos un mapa de la distribución de los decesos a nivel nacional.
grafico4 <- departamental %>%
left_join(df %>% count(DEPARTAMENTO.DOMICILIO,name="DECESOS"),
by=c("DEPARTAMEN"="DEPARTAMENTO.DOMICILIO")) %>%
ggplot2::ggplot()+
geom_sf(aes(fill=DECESOS),show.legend = T,colour="white")+
ggrepel::geom_label_repel(
aes(label =DEPARTAMEN,
geometry = geometry),size = 2,
stat = "sf_coordinates",
min.segment.length = 0,
label.size = 0.5)+
scale_fill_viridis_c(trans = "sqrt", alpha = .4)+
theme_void()+
theme(#legend.position = "top",
legend.title = element_blank())
grafico4 <- grid.arrange(grafico4,
bottom = textGrob(
"SINADEF",
x = .98,
hjust = 1,
gp = gpar(fontface = "italic", fontsize = 9)
)) #utilizamos la funcion grid.arrange para agregar texto en la gráfica
grafico4
## TableGrob (2 x 1) "arrange": 2 grobs
## z cells name grob
## 1 1 (1-1,1-1) arrange gtable[layout]
## 2 2 (2-2,1-1) arrange text[GRID.text.247]
Ahora generaremos el lienzo para posteriormente guardarlo en un PDF.
g<-ggdraw()+
draw_plot(grafico1,x=.01,y=.7,width =.5,height = .3)+
draw_plot(grafico2,x=.01,y=.4,width =.5,height = .3)+
draw_plot(grafico3,x=.01,y=.1,width =.5,height = .3)+
draw_plot(grafico4,x=.51,y=.01,width =.5,height = .8)+
draw_text("PRUEBA DE REPORTE",x=.75,y=.9,width =.01,height = .01)
g
Por último, guardamos el lienzo en un PDF, haciendo uso de la función pdf del paquete grDevices.
pdf("prueba.pdf",paper = "a4r",width = 16,height = 16)
g
dev.off()
## png
## 2
Puedes descarga el archivo prueba.pdf aquí, espero y sea de utilidad a la comunidad de R en español.