Introducción

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.

Desarrollo

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.

Carga de paquetes a utilizar

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)

Carga de la base a utilizar

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.

Generación de gráficos

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]
Nota: Siempre que generemos un gráfico, este debe incluir la respectiva fuente.

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.