shinyEl Instituto Nacional de Estadística, Geografía e Informática (INEGI)
tiene puestos a disposición del público los shapefiles con los distintos
niveles de información geográfica. Estos archivos digitales se
encuentran disponibles en el Marco Geoestadístico Nacional (MGN),
el cual es un sistema único y se presenta la división del territorio
nacional en diferentes niveles de desagregación para referir
geográficamente la información estadística de los censos y encuestas. Se
integra al Sistema Nacional de Información Estadística y Geográfica
(SNIEG).
Se cargan las bases de datos del índice de marginación a nivel
estatal para los años 2010, 2015 y
2020. Las cuales se encuentran en formato
.RData.
Bases de datos
- Nivel estatal
- Nivel municipal
- Nivel localidad
- Nivel AGEB
- Nivel Colonia
Base de datos de los tres años se encuentran disponibles en la página oficial de CONAPO
Datos abiertos de México datos.gob.mx
Publicación Índice De Marginación Por Entidad Federativa Y Municipio 2020.
A continuación, se leen las transformaciones de los shapefiles a
formato GeoJSON de las divisiones geográficas de los estados de México
correspondientes a los años 2020, 2015 y
2010.
geojsonio::geojson_read.sp::spChFIDs se utiliza para asignar IDs únicos a cada
polígono en los datos espaciales, para asegurar que los IDs estén
formateados correctamente.shape_estados_2020, shape_estados_2015 y
shape_estados_2010 según corresponda.Enlace: Mapas utilizando capas `geojson
Enlace: Mapas utilizando capas `geojson, por grado de marginación
years <- c("2020", "2015", "2010")
grados <- c("Muy alto", "Alto", "Medio", "Bajo", "Muy bajo")
shape_estados_2020 <- list()
shape_estados_2015 <- list()
shape_estados_2010 <- list()
for (i in 1:5){
shape_estados_2020[[paste0(grados[i])]] <- geojsonio::geojson_read(paste0(here::here(), "/Output/estados_2020_", i, "_json.geojson"), what = "sp") %>%
sp::spChFIDs(., str_pad(.@data$CVE_ENT, 2, "left", pad = "0"))
shape_estados_2015[[paste0(grados[i])]] <- geojsonio::geojson_read(paste0(here::here(), "/Output/estados_2015_", i, "_json.geojson"), what = "sp") %>%
sp::spChFIDs(., str_pad(.@data$CVE_ENT, 2, "left", pad = "0"))
shape_estados_2010[[paste0(grados[i])]] <- geojsonio::geojson_read(paste0(here::here(), "/Output/estados_2010_", i, "_json.geojson"), what = "sp") %>% sp::spChFIDs(., str_pad(.@data$CVE_ENT, 2, "left", pad = "0"))
}
shape_estados <- geojsonio::geojson_read(paste0(here::here(), "/Output/estados_2020_json.geojson"), what = "sp") %>%
sp::spChFIDs(., str_pad(.@data$CVE_ENT, 2, "left", pad = "0"))Se crea una paleta de colores que se usará para mapear valores de una variable categórica a colores en una visualización de Leaflet.
paleta <- c("#13322B", #Muy alto
"#086953", #Alto
"#4C9562", #Medio
"#D1BB9E", #Bajo
"#C3BA6D") # Muy bajo
## Paleta de colores
mypalette <- leaflet::colorFactor(palette = paleta,
domain = forcats::fct_relevel(DP2_2020$GM_2020, c("Muy alto", "Alto", "Medio", "Bajo", "Muy bajo")),
na.color = "transparent")Se define el estilo y el contenido de un título para un mapa Leaflet
utilizando HTML y CSS dentro de
R.
tags$style(HTML("...")): Esta función permite incluir
estilos CSS en el documento..leaflet-control.map-title: Define una clase CSS que se
aplicará al título del mapa.tags$div(...): Crea un contenedor div en el cual se
coloca el título del mapa.tag.map.title: Aplica los estilos definidos
anteriormente a este contenedor div.# Estructura del título
tag.map.title <- tags$style(HTML("
.leaflet-control.map-title {
transform: translate(-50%,20%);
position: fixed !important;
left: 50%;
text-align: center;
padding-left: 10px;
padding-right: 10px;
background: rgba(255,255,255,0.75);
font-weight: bold;
font-size: 28px;
}
"))
# Nota de página
title <- tags$div(
tag.map.title, HTML("Fuentes:Estimaciones del CONAPO con base en el INEGI, Censo de Población y Vivienda 2020.")
) Se calcula el cuadro delimitador que contiene las coordenadas de los
límitesde un objeto espacial utilizando la función
st_bbox() de la librería sf.
xmin: La coordenada mínima en el eje x (longitud
mínima).ymin: La coordenada mínima en el eje y (latitud
mínima).xmax: La coordenada máxima en el eje x (longitud
máxima).ymax: La coordenada máxima en el eje y (latitud
máxima).years: Un vector que contiene los años para los que
tenemos datos de shapefiles.grados: Un vector que contiene los niveles de
marginación.Se asigna a la lista shape_estados con una estrcutura de
listas de data frames geoespaciales correspondientes a diferentes años y
grados de marginación.
Se define una función llamada addPolygonLayer, la cual
añade una capa de polígonos a un mapa de Leaflet. Se tienen que
especificar los argumentos:
map: El objeto de mapa de Leaflet al que se le añadirá
la nueva capa de polígonos.data: Los datos que contienen la información geográfica
de los polígonos.year: Año asociado con los datos de los polígonos,
usado para agrupar.paleta: Paleta de colores que se usará para rellenar
los polígonos de acuerdo al grado de marginación.grado: Representa el grupo al que pertenecen estos
polígonos.# Define una función para añadir las capas de polígonos
addPolygonLayer <- function(map, data, year, grado, paleta) {
map <- map %>%
addPolygons(
data = data,
fillColor = paleta,
fillOpacity = 0.8,
stroke = TRUE,
weight = 1,
dashArray = "1",
opacity = 1,
color = "#D4D0BD",
group = paste(year, grado)
)
return(map)
}Se crea una interfaz de usuario (UI) y un servidor (server) en un entorno Shiny.
uiui <- fluidPage(
# Título de la página.
titlePanel("Mapa del índice de marginación a nivel, estatal, 2020 - 2020"),
#CSS personalizado
tags$head(
includeCSS("style.css"),
),
#Contenedor del mapa Leaflet
# If not using custom CSS, set height of leafletOutput to a number instead of percent
leafletOutput("map", width = "100vw", height = "90vh"), # Ajusta el ancho y alto
# Panel fijo en la interfaz que selecciona el año (selected_year), el grado de marginación (selected_grades), y un botón de reset (reset).
absolutePanel(id = "controls",
class = "panel panel-default",
fixed = TRUE,
draggable = TRUE,
top = 60,
left = "auto",
right = 20,
bottom = "auto",
width = 330,
height = "auto",
h2("Mapa de marginación"),
selectInput("selected_year", "Selecciona el Año:",
choices = years,
selected = "2020"),
checkboxGroupInput("selected_grades", "Selecciona el Grado de Marginación:",
choices = grados,
selected = grados),
actionButton("reset", "Reset") # Botón de reset
)
)server# Server
server <- function(input, output, session) {
output$map <- renderLeaflet({
# Mapa Base
map <- leaflet(options = leafletOptions(minZoom = 5, maxZoom = 5, zoomControl = FALSE)) %>%
addTiles() %>%
setView(lat = 23.6260333, lng = -102.5375005, zoom = 5) %>%
setMaxBounds(lng1 = bounding_box[1],
lat1 = bounding_box[2],
lng2 = bounding_box[3],
lat2 = bounding_box[4]) %>%
addProviderTiles(providers$OpenStreetMap,
options = providerTileOptions(minZoom = 5, maxZoom = 5))
# Se añaden las capas de polígonos para cada año y grado
for (i in seq_along(years)) {
for (j in seq_along(grados)) {
map <- addPolygonLayer(map = map,
data = shape_estados[[i]][[paste0(grados[j])]],
year = years[i],
grado = grados[j],
paleta = paleta[j])
}
}
#Se añade la leyenda y control de capas
map %>%
addControl(title, position = "bottomright") %>%
addLegend("bottomright",
colors = paleta,
labels = grados,
title = stringr::str_wrap("Grado de marginación", 15), opacity = 0.7)
})
# Observador para actualizar el mapa según las selecciones input$selected_year y input$selected_grades
observe({
selected_year <- input$selected_year
selected_grades <- input$selected_grades
#Actualiza'' dinámicamente el mapa Leaflet
leafletProxy("map") %>%
hideGroup(paste(rep(years, each = length(grados)), grados)) %>%
showGroup(paste(selected_year, selected_grades))
})
# Observador para el botón de reset
observeEvent(input$reset, {
updateSelectInput(session, "selected_year", selected = "2020")
updateCheckboxGroupInput(session, "selected_grades", selected = grados)
})
}Librerías que se usaron en el trabajo
| package | loadedversion | source |
|---|---|---|
| dplyr | 1.1.3 | CRAN (R 4.3.2) |
| forcats | 1.0.0 | CRAN (R 4.3.1) |
| htmltools | 0.5.8.9000 | Github (rstudio/htmltools@487aa0bed7313d7597b6edd5810e53cab0061198) |
| htmlwidgets | 1.6.2 | CRAN (R 4.3.1) |
| leafgl | 0.1.1 | CRAN (R 4.3.1) |
| leaflet | 2.2.2 | CRAN (R 4.3.3) |
| leaflet.extras | 1.0.0 | CRAN (R 4.3.1) |
| leaflet.providers | 2.0.0 | CRAN (R 4.3.3) |
| mapview | 2.11.0 | CRAN (R 4.3.1) |
| RColorBrewer | 1.1-3 | CRAN (R 4.3.0) |
| rgdal | 1.6-7 | CRAN (R 4.3.1) |
| sf | 1.0-14 | CRAN (R 4.3.1) |
| sp | 2.1-0 | CRAN (R 4.3.1) |
| spdplyr | 0.4.0 | Github (mdsumner/spdplyr@e14dec9017a96c309065ab319da96c839cac6f58) |
| stringr | 1.5.0 | CRAN (R 4.3.1) |
| tibble | 3.2.1 | CRAN (R 4.3.1) |
This
work by Diana Villasana
Ocampo is licensed under a
Creative
Commons Attribution 4.0 International License.