library(tidyverse)
library(sf)
library(leaflet)
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
Y leyendo los datos, de la misma forma que en el diagrama de dispersión:
<- read_rds("01_input/mapa_simplificado.rds")
base_mapa 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)
<- base_mapa %>%
mapa_leaflet 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:
<- colorNumeric("inferno", mapa_leaflet$Total, reverse = T, na.color = NA) pal
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)