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")

Puedes moverte por el mapa y hacer zoom, y al pasar por los distintos municipios aparece la información sobre los votos. Si haces clic en un municipio, obtendrás información más detallada sobre los votos.

Posted on:
December 11, 2018
Length:
137 minute read, 28973 words
Tags:
mapas gráficos
See Also:
Analizando datos de Spotify con Análisis de Componentes Principales en R: Los Planetas
Descargando datos sobre canciones de Spotify con R: Los Planetas
Visualizando números irracionales