Cargar las librerías
Instalo la librería R-elecciones y cargo el resto de librerías.
devtools::install_github("hmeleiro/elecciones") # <--- Instala la librería elecciones
library(elecciones)
# Cargo el resto de librerías
library(sf)
library(tidyverse)
library(mapdeck)
library(knitr)
library(kableExtra)
Descargar los resultados
Me descargo los resultados a nivel de municipio de las elecciones generales de diciembre de 2015.
results <- municipios("generales", "2015", "12") # Descargo los datos
Importar el shapefile
Importo el shapefile de los municipios de España. El shapefile se puede descargar en la web de Open Data de ESRI.
shp <- read_sf("~/Google Drive/DATOS/datos/GIS/Municipios_IGN/Municipios_IGN.shp", quiet = T) ### Importo el shapefile
Recodifico las siglas
Como la mayoría de los partidos tienen marcas distintas a lo largo del territorio, necesitamos recodificarlas para poder agrupar los resultados de los cinco partidos nacionales. Para ello uso el código de acumulación nacional (code.nacional
en el dataset).
# Recodifico las siglas para agrupar las diferentes denominaciones de los cinco partidos nacionales
results$siglas_r <- NA
results$siglas_r <- results$siglas
df <- results[str_detect(results$denominacion, "PARTIDO POPULAR"),]
idsPP <- unique(df$code.nacional)
results$siglas_r[results$code.nacional %in% idsPP] <- "PP"
df <- results[str_detect(results$denominacion, "SOCIALIST"),]
idsPSOE <- unique(df$code.nacional)
results$siglas_r[results$code.nacional %in% idsPSOE] <- "PSOE"
df <- results[str_detect(results$siglas, "PODEMOS|EN COMÚ"),]
idsPs <- unique(df$code.nacional)
results$siglas_r[results$code.nacional %in% idsPs] <- "Podemos +confluencias"
df <- results[str_detect(results$siglas, "C's|C´s"),]
idsCs <- unique(df$code.nacional)
results$siglas_r[results$code.nacional %in% idsCs] <- "C's"
df <- results[str_detect(results$denominacion, "UNIDAD POPULAR"),]
idsIU <- unique(df$code.nacional)
results$siglas_r[results$code.nacional %in% idsIU] <- "IU"
ids <- c(idsPP, idsPSOE, idsPs, idsCs, idsIU)
# Selecciono a los cinco partidos
results <- results[results$code.nacional %in% c(ids),]
# Agrupo para quitar las columnas innecesarias
results <- results %>%
group_by(CODIGOINE, siglas_r) %>%
summarise(censo = sum(censo.INE),
votos.candidatura = sum(candidaturas),
votos = sum(votos))
# Transformo los datos de formato long a wide
results <- spread(results, key = siglas_r, value = votos)
# Calculo los % sobre censo
results$PP_pct <- round((results$PP / results$censo ) * 100, 2)
results$PSOE_pct <- round(( results$PSOE / results$censo ) * 100, 2)
results$Ps_pct <- round(( results$`Podemos +confluencias` / results$censo ) * 100, 2)
results$Cs_pct <- round(( results$`C's` / results$censo ) * 100, 2)
results$IU_pct <- round(( results$IU / results$censo ) * 100, 2)
Fusiono los datos con el shapefile
La librería r-elecciones incluye en el dataset resultante una columna llamada CODIGOINE
para facilitar la fusión con otros datos o archivos vectoriales (CODIGOINE
= CODIGO PROVINCIA + CODIGO MUNICIPIO). Empleamos esa columna para hacer la fusión con el shapefile de los municipios. Para visualizar los mapas a los cinco partidos a la vez conviene visualizar por separado la península ibérica (+Baleares) y Canarias. Para ello dividimos el data frame.
shp <- merge(shp, results, by = "CODIGOINE")
peninbal <- shp[!substr(shp$CODIGOINE, 1, 2) %in% c("35", "38"), ]
canarias <- shp[substr(shp$CODIGOINE, 1, 2) %in% c("35", "38"), ]
Visualizamos
Por último, usamos la librería tmap para visualizar los mapas de voto para los cinco partidos. Para poder comparar el resultado a cada partido creamos cinco rampas de color que parten del mismo gris y van hasta el color de cada patido, indicamos que queremos los intervalos fijos para cada uno de los mapas (style = "fixed"
) y proporcionamos los puntos de corte a nuestro gusto (breaks
).
colores5 <- list(c("#ededed", "#0cb2ff"), # PP
c("#ededed", "#E01021"), # PSOE
c("#ededed", "#612d62"), # Podemos
c("#ededed", "#E85B2D"), # Cs
c("#ededed", "#E01021")) # IU
breaks <- c(0,10,30,50,70)
library(tmap)
mapa <- tm_shape(peninbal) +
tm_polygons(col = c("PP_pct", "PSOE_pct", "Ps_pct", "Cs_pct", "IU_pct"), style = "fixed",
palette = colores5, breaks = breaks,
title = "% sobre censo",
border.alpha = 0, lwd = 0, legend.show = T, legend.outside = T) +
tm_layout(between.margin = 5, frame = FALSE,
fontfamily = "Roboto Condensed",
title = c("Partido Popular", "PSOE", "Podemos", "Ciudadanos", "Izquierda Unida"),
title.fontface = "bold") +
tm_legend(legend.text.size = 1,
legend.title.size = 1) +
tm_facets(sync = TRUE, ncol = 2)
mapa
Bola Extra: Canarias!
Hacemos lo mismo con el data frame de Canarias.
colores5 <- list(c("#ededed", "#0cb2ff"), # PP
c("#ededed", "#E01021"), # PSOE
c("#ededed", "#612d62"), # Podemos
c("#ededed", "#E85B2D"), # Cs
c("#ededed", "#E01021")) # IU
breaks <- c(0,10,30,50,70)
library(tmap)
mapa <- tm_shape(canarias) +
tm_polygons(col = c("PP_pct", "PSOE_pct", "Ps_pct", "Cs_pct", "IU_pct"), style = "fixed",
palette = colores5, breaks = breaks,
title = "% sobre censo",
border.alpha = 0, lwd = 0, legend.show = T, legend.outside = T) +
tm_layout(between.margin = 5, frame = FALSE,
fontfamily = "Roboto Condensed",
title = c("Partido Popular", "PSOE","Podemos", "Ciudadanos", "Izquierda Unida"),
title.fontface = "bold") +
tm_legend(legend.text.size = 1,
legend.title.size = 1) +
tm_facets(sync = TRUE, ncol = 2)
mapa