Mapa interactivo de las elecciones por municipios
Hace un par de semanas estuve en un taller de Datos Espaciales en Salud, impartido en la Escuela Nacional de Sanidad, mostrando alguna de las maravillas que se pueden hacer con leaflet en R. Hoy os enseñaré otra aplicación, ilustrada con código reproducible.
El domingo 2 de diciembre tuvieron lugar las elecciones al Parlamento Andaluz. He usado los datos oficiales de las elecciones, disponibles en este enlace de la Junta de Andalucía para visualizar los votos a un partido cualquiera: Unión Progreso y Democracia (UPYD).
Uso también las líneas límite de los municipios andaluces, disponibles en el Instituto de Estadística y Cartografía de Andalucía.
El mapa interactivo de votos a UPYD por municipios se encuentra al final de este artículo. El código para hacerlo en R lo dejo aquí, y es totalmente reproducible.
Para el análisis, he creado la tasa de voto a UPYD, calculada como número de votos a UPYD por cada 1.000 personas censadas.
# Cargamos los paquetes necesarios
library(openxlsx)
library(dplyr)
library(leaflet)
library(rgdal)
library(htmltools)
provincias <- c("Almería", "Cádiz", "Granada", "Málaga", "Jaén", "Huelva", "Sevilla", "Córdoba")
cod_pro <- c("04", "11", "18", "29", "23", "21", "41", "14")
# Leemos los archivos y preparamos los datos
for(provincia in 1:8){
if(provincia == 1){
longitud_previa <- 0
elecciones <- read.xlsx(paste0("datos/Escrut-Prov-2018-", provincias[[provincia]], ".xlsx"), sheet = "Municipios", colNames = TRUE) %>%
select("Codmun", "Municipio", "Censo.Total", "Votos.Totales", "UPYD")
}
else {
longitud_previa <- nrow(elecciones)
aux <- read.xlsx(paste0("datos/Escrut-Prov-2018-", provincias[[provincia]], ".xlsx"), sheet = "Municipios", colNames = TRUE) %>%
select("Codmun", "Municipio", "Censo.Total", "Votos.Totales", "UPYD")
elecciones <- rbind(elecciones, aux)
}
elecciones <- subset(elecciones, is.na(elecciones$Codmun) == FALSE)
longitud_actual <- nrow(elecciones)
# Creamos el código del municipio añadiendo delante el código de la provincia
for(j in (longitud_previa + 1):longitud_actual){
if(nchar(elecciones$Codmun[[j]]) == 1) elecciones$Codmun[[j]] <- paste0(cod_pro[[provincia]], "00", elecciones$Codmun[[j]])
if(nchar(elecciones$Codmun[[j]]) == 2) elecciones$Codmun[[j]] <- paste0(cod_pro[[provincia]], "0" , elecciones$Codmun[[j]])
if(nchar(elecciones$Codmun[[j]]) == 3) elecciones$Codmun[[j]] <- paste0(cod_pro[[provincia]], elecciones$Codmun[[j]])
}
}
names(elecciones) <- c("codmun", "municipio", "censo", "votos", "upyd")
elecciones$tasa <- round(elecciones$upyd / elecciones$censo * 1000, 1)
table(elecciones$upyd)
##
## 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
## 304 133 75 52 38 15 20 10 20 10 3 11 10 4 4 3 3 6 2 3
## 20 21 22 23 24 27 28 29 30 31 32 34 37 38 39 42 45 47 48 50
## 1 3 2 2 2 1 1 1 1 1 1 2 1 1 1 1 1 2 2 1
## 51 54 58 60 61 65 70 79 86 87 105 112 114 123 171 172 193 261 305 505
## 2 2 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1
## 710
## 1
En 304 municipios (39% del total) UPYD no recibió ningún voto. Vemos los 5 municipios con más votos a UPYD por cada 1.000 personas censadas:
head(elecciones[order(-elecciones$tasa), ], 5)
## codmun municipio censo votos upyd tasa
## 208 18069 Dólar 497 302 12 24.1
## 570 21049 Minas de Riotinto 3291 1718 27 8.2
## 557 21039 Hinojales 301 187 2 6.6
## 720 14020 Conquista 354 194 2 5.6
## 94 04094 Turrillas 209 137 1 4.8
Los cinco municipios con mayor tasa de votos a UPYD fueron Dólar (Granada), Minas de Riotinto (Huelva), Hinojales (Huelva), Conquista (Córdoba) y Turrillas (Almería).
Código para el mapa interactivo:
# Leemos los municipios
municipios <- readOGR("datos/da02_term_munic.shp", encoding = "utf8", use_iconv = TRUE) %>%
spTransform(CRS("+init=epsg:4326"))
# Unimos los polígonos con los mapas
municipios@data <- merge(municipios@data, elecciones, by.x = "COD_MUN", by.y = "codmun")
# Creamos la paleta de color
bins <- c(0, 25, 50, 75, 100, 150, 200, 500, 2410) / 100
pal <- colorBin("YlOrRd", domain = municipios@data$tasa, bins = bins)
# El leaflet siguiente está inspirado en:
# https://rstudio.github.io/leaflet/choropleths.html
# https://github.com/rstudio/leaflet/blob/master/inst/examples/labels.R
leaflet(municipios) %>%
addTiles() %>%
setView(lng = -4.2, lat = 36.7, zoom = 7) %>%
addPolygons(fillColor = pal(municipios@data$tasa),
popup = paste0("<b>Municipio</b>: ", municipios@data$municipio,
"<br><b>Censo</b>: ", municipios@data$censo,
"<br><b>Votos</b>: ", municipios@data$votos,
"<br><b>Votos a UPYD</b>: ", municipios@data$upyd,
"<br><b>Votos a UPYD por cada 1.000 personas censadas</b>: ", municipios@data$tasa),
weight = 1.5,
opacity = 0.7,
color = "black",
dashArray = "1",
label = mapply(
function(x, y) {
HTML(sprintf("<b>Municipio</b>: %s<br><b>%s</b> votos a UPYD por cada 1.000 personas censadas<br><em>Haz clic para obtener más información</em>", htmlEscape(x), htmlEscape(y)))
},
municipios@data$MUNICIPIO, municipios@data$tasa, SIMPLIFY = F),
labelOptions = lapply(1:nrow(municipios), function(x) {
labelOptions(direction = "auto")
}),
fillOpacity = 1,
highlight = highlightOptions(color = "black", weight = 2, dashArray = 2, fillOpacity = 0.7)) %>%
addLegend(pal = pal, values = municipios@data$tasa, opacity = 0.7, title = "Votos a UPYD por cada <br>1.000 personas censadas", position = "bottomright")