Mapa de delitos

El último elemento que nos falta es el mapa de nuestro tablero de visualización. Para hacer el mapa vamos a usar el paquete {leaflet}, que es una interfaz para la librería de Javascript de visualización geográfica Leaflet. Empezamos, como siempre, cargando los paquetes que vamos a usar

library(tidyverse)
library(sf)
library(leaflet)

Y leyendo los datos, de la misma forma que en el diagrama de dispersión:

base_mapa <- read_rds("01_input/mapa_simplificado.rds")
Encoding(base_mapa$subtipo_de_delito) <- "latin1"
Encoding(base_mapa$entidad) <- "latin1"
head(base_mapa)
fecha subtipo_de_delito clave_ent entidad Total CVEGEO NOMGEO geometry
2022-07-01 Robo a casa habitación 01 Aguascalientes 164 01 Aguascalientes MULTIPOLYGON (((-102.2417 2…
2022-07-01 Robo a casa habitación 02 Baja California 294 02 Baja California MULTIPOLYGON (((-112.3 28.3…
2022-07-01 Robo a casa habitación 03 Baja California Sur 120 03 Baja California Sur MULTIPOLYGON (((-109.8051 2…
2022-07-01 Robo a casa habitación 04 Campeche 120 04 Campeche MULTIPOLYGON (((-90.45286 2…
2022-07-01 Robo a casa habitación 05 Coahuila de Zaragoza 140 05 Coahuila de Zaragoza MULTIPOLYGON (((-102.2657 2…
2022-07-01 Robo a casa habitación 06 Colima 123 06 Colima MULTIPOLYGON (((-114.7019 1…

Una vez más, tenemos que filtrar por tipo de delito y por fecha (recuerden que el tipo de delito lo va a determinar el usuario y la fecha la dejaremos fija)

mapa_leaflet <- base_mapa %>% 
  filter(fecha==max(fecha)) %>% 
  filter(subtipo_de_delito=="Homicidio doloso")
head(mapa_leaflet)
fecha subtipo_de_delito clave_ent entidad Total CVEGEO NOMGEO geometry
2022-08-01 Homicidio doloso 01 Aguascalientes 11 01 Aguascalientes MULTIPOLYGON (((-102.2417 2…
2022-08-01 Homicidio doloso 02 Baja California 234 02 Baja California MULTIPOLYGON (((-112.3 28.3…
2022-08-01 Homicidio doloso 03 Baja California Sur 3 03 Baja California Sur MULTIPOLYGON (((-109.8051 2…
2022-08-01 Homicidio doloso 04 Campeche 1 04 Campeche MULTIPOLYGON (((-90.45286 2…
2022-08-01 Homicidio doloso 05 Coahuila de Zaragoza 6 05 Coahuila de Zaragoza MULTIPOLYGON (((-102.2657 2…
2022-08-01 Homicidio doloso 06 Colima 75 06 Colima MULTIPOLYGON (((-114.7019 1…

Ahora, para poder crear un mapa de coropletas, en el que los colores representen la cantidad de delitos, necesitamos una paleta de colores:

pal <- colorNumeric("inferno", mapa_leaflet$Total, reverse = T, na.color = NA)

Ya con esto, crtear un mapa interactivo es muy fácil. El paquete {leaflet} toma como entrada la geometría que queremos representar, en nuestro caso, la geometría la tenemos en la columna geometry del DataFrame mapa_leaflet:

head(mapa_leaflet$geometry)
Geometry set for 6 features 
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -118.3632 ymin: 17.81547 xmax: -89.12123 ymax: 32.71812
Geodetic CRS:  WGS 84
First 5 geometries:
MULTIPOLYGON (((-102.2417 22.37418, -102.2935 2...
MULTIPOLYGON (((-112.3 28.37473, -112.3101 28.3...
MULTIPOLYGON (((-109.8051 24.13703, -109.8163 2...
MULTIPOLYGON (((-90.45286 20.68779, -90.46672 2...
MULTIPOLYGON (((-102.2657 29.86797, -102.3214 2...

Esta geometría internamente se transformará en un geoJSON para representarla usando Leaflet.

Además de la geometría, necesitamos el valor que vamos a representar en el mapa, en este caso el Total del delito seleccionado. En este caso, la función pal que definimos arriba, convierte el valor en un color utilizando una rampa:

head(pal(mapa_leaflet$Total))
[1] "#F2F27C" "#0C0827" "#F9FC9D" "#FCFFA4" "#F5F992" "#F47918"

Ya con estos elementos podemos crear un mapa de forma muy sencilla:

leaflet() %>% 
  addPolygons(data=mapa_leaflet$geometry,
              fillColor = pal(mapa_leaflet$Total),
              color="black",
              weight = 1,
              opacity = 1,
              fillOpacity = .7,
              label = mapa_leaflet$NOMGEO,
              group = "Entidades")

Lo que estamos haciendo aquí es crear un objeto de la calse leaflet y pasarle, en addPolygons, los datos que queremos ver en el mapa junto con algunas opciones de configuración.

Este ya es un mapa funcional pero demasiado simple, vamos a agregarle una leyenda:

leaflet() %>% 
  addPolygons(data=mapa_leaflet$geometry,
              fillColor = pal(mapa_leaflet$Total),
              color="black",
              weight = 1,
              opacity = 1,
              fillOpacity = .7,
              label = mapa_leaflet$NOMGEO,
              group = "Entidades")%>% 
  addLegend(pal = pal,values = mapa_leaflet$Total)

Un poco mejor, ahora agreguemos un mapa base para contextualizar el mapa. El mapa base lo vamos a agregar con la función addProviderTiles, aquí podemos ver una lista de los mapas base disponibles.

leaflet() %>% 
  addProviderTiles(providers$OpenStreetMap) %>% 
  addPolygons(data=mapa_leaflet$geometry,
              fillColor = pal(mapa_leaflet$Total),
              color="black",
              weight = 1,
              opacity = 1,
              fillOpacity = .7,
              label = mapa_leaflet$NOMGEO,
              group = "Entidades")%>% 
  addLegend(pal = pal,values = mapa_leaflet$Total)