Introducción
En este primer post de la serie mostraremos cómo crear mapas en R a partir de un archivo shapefile donde se encuentra la información espacial de los distritos peruanos. Existe una gran variedad de posibilidades a la hora de crear mapas, algunas de las cuales se han expuesto en post anteriores en este blog. En esta ocasión mostraremos tres de ellas: un mapa básico con la función plot()
, un mapa con el paquete {ggplot2} y un mapa interactivo con el paquete {leaflet}.
Paquetes
library(maptools)
library(RColorBrewer)
library(readxl)
library(leaflet)
library(broom)
library(dplyr)
library(ggplot2)
library(classInt)
library(sp)
library(rgdal)
library(spdep)
library(ggpubr)
library(faraway)
1. Archivo shapefile de Perú a nivel distrital
Un archivo shapefile (SHP) es un formato de datos espaciales de representación vectorial desarrollado por la compañía ESRI. Estos datos sirven para almacenar información de la ubicación de distintas entidades geográficas, información que se puede representar con puntos, líneas o polígonos. Los archivos shapefile donde viene contenida la información sobre los límites provinviales y distritales en Perú los hemos descargado de Geogpsperu. En esta ocasión utilizamos la función readShapePoly()
para leer polígonos a partir del archivo .shp
. En post anteriores se expusieron otras formas de trabajar con archivos shapefiles (ver por ejemplo aquí o aquí).
# Provincias:
peru_prov <- readShapePoly("C:/Users/Usuario/Desktop/r_que_r/r_que_r/content/datasets/provincias/PROVINCIAS.shp")
# Distritos:
peru_distr <- readShapePoly("C:/Users/Usuario/Desktop/r_que_r/r_que_r/content/datasets/distritos/DISTRITOS.shp")
Para ver la información contenida en el shapefile, que hemos denominado con el nombre peru
, podemos utilizar la función summary()
. De esta forma comprobamos que el archivo, cuya información proviene del Instituto Nacional de Estadística e Informática del Perú (INEI), contiene información de 1873 distritos, identificándose la provincia y el departamento al que pertenece cada uno de ellos además de su capital y su indicador geográfico (ubigeo).
# Provincias:
summary(peru_prov)
## Object of class SpatialPolygonsDataFrame
## Coordinates:
## min max
## x -81.32823 -68.65227910
## y -18.35093 -0.03860597
## Is projected: NA
## proj4string : [NA]
## Data attributes:
## IDDPTO DEPARTAMEN IDPROV PROVINCIA
## 02 : 20 ANCASH : 20 0101 : 1 ABANCAY : 1
## 06 : 13 CAJAMARCA : 13 0102 : 1 ACOBAMBA : 1
## 08 : 13 CUSCO : 13 0103 : 1 ACOMAYO : 1
## 21 : 13 PUNO : 13 0104 : 1 AIJA : 1
## 13 : 12 LA LIBERTAD: 12 0105 : 1 ALTO AMAZONAS: 1
## 05 : 11 AYACUCHO : 11 0106 : 1 AMBO : 1
## (Other):114 (Other) :114 (Other):190 (Other) :190
## CAPITAL FUENTE
## ABANCAY : 1 INEI:196
## ACOBAMBA: 1
## ACOMAYO : 1
## AGUAYTIA: 1
## AIJA : 1
## AMBO : 1
## (Other) :190
# Distritos:
summary(peru_distr)
## Object of class SpatialPolygonsDataFrame
## Coordinates:
## min max
## x -81.32823 -68.65227910
## y -18.35093 -0.03860597
## Is projected: NA
## proj4string : [NA]
## Data attributes:
## IDDPTO DEPARTAMEN IDPROV PROVINCIA
## 15 : 171 LIMA : 171 1501 : 43 LIMA : 43
## 02 : 166 ANCASH : 166 1204 : 34 JAUJA : 34
## 06 : 127 CAJAMARCA: 127 1510 : 33 YAUYOS : 33
## 12 : 123 JUNIN : 123 1507 : 32 HUAROCHIRI: 32
## 05 : 119 AYACUCHO : 119 0401 : 29 AREQUIPA : 29
## 08 : 112 CUSCO : 112 1201 : 28 HUANCAYO : 28
## (Other):1055 (Other) :1055 (Other):1674 (Other) :1674
## IDDIST DISTRITO CAPITAL CODCCPP
## 010101 : 1 SANTA ROSA : 10 SANTA ROSA : 9 0001:1873
## 010102 : 1 PUEBLO NUEVO : 5 PUEBLO NUEVO: 6
## 010103 : 1 SAN ANTONIO : 5 BELLAVISTA : 5
## 010104 : 1 SANTA CRUZ : 5 SAN JUAN : 5
## 010105 : 1 BELLAVISTA : 4 ACO : 4
## 010106 : 1 INDEPENDENCIA: 4 (Other) :1843
## (Other):1867 (Other) :1840 NA's : 1
## AREA FUENTE
## Min. :1 INEI:1873
## 1st Qu.:1
## Median :1
## Mean :1
## 3rd Qu.:1
## Max. :1
##
2. Representación en mapa. Algunas posibilidades
2.1. Mapa básico
Un mapa básico y sencillo lo realizaremos con la función plot()
. Como se observa en el mapa, la mayor parte de distritos, y aquellos de menor tamaño, se sitúan fundamentalmente alrededor de la sierra peruana y de la costa. Por el contrario, los distritos de mayor tamaño son, por lo general, aquellos situados en la selva o ceja de selva del país.
par(mfrow=c(1,2))
plot(peru_prov, col = "orange", bor = "lightgrey")
plot(peru_distr, col = "orange", bor = "lightgrey")
Debido a que realizar mapas a nivel distrital ralentiza mucho el proceso de creación de mapas, los siguientes ejemplos los realizaremos únicamente a nivel provincial. No obstante, la dinámica para realizar los mapas a nivel distrital es idéntica a la realizada en dichos ejemplos.
2.2. Mapa utilizando los paquetes {broom} y {ggplot}
El paquete {ggplot2} es utilizado frecuentemente para generar mapas visualmente atractivos. En este blog hemos realizado varios post donde se explica cómo crear mapas utilizando este paquete. Por ejemplo, para una mayor profundización sobre cómo crear “choropleth maps” con {ggplot2} se puede consultar este post. Por su parte, en este otro post se explica cómo crear mapas con {ggplot2} utilizando coordenadas geográficas. También hemos realizado varios post donde se expone cómo generar mapas interactivos y dinámicos utilizando conjuntamente {ggplot2} con otros paquetes como {ggiraph} o {plotly}.
En esta ocasión, para generar un mapa con {ggplot2} a partir de información geográfica que se encuentra en un archivo shapefile, convertiremos dicha información en un dataframe con la función tidy()
del paquete {broom}. Una vez convertido en dataframe realizaremos el gráfico siguiendo el procedimiento habitual.
# convertimos a dataframe:
# Provincias:
peru_provincias <- tidy(peru_prov)
## Regions defined for each Polygons
head(peru_provincias)
## # A tibble: 6 x 7
## long lat order hole piece group id
## <dbl> <dbl> <int> <lgl> <fct> <fct> <chr>
## 1 -77.7 -5.94 1 FALSE 1 0.1 0
## 2 -77.7 -5.94 2 FALSE 1 0.1 0
## 3 -77.7 -5.94 3 FALSE 1 0.1 0
## 4 -77.7 -5.94 4 FALSE 1 0.1 0
## 5 -77.7 -5.94 5 FALSE 1 0.1 0
## 6 -77.7 -5.94 6 FALSE 1 0.1 0
# Distritos (aunque no lo vamos a representar en mapa)
peru_distritos <- tidy(peru_distr)
## Regions defined for each Polygons
head(peru_distritos)
## # A tibble: 6 x 7
## long lat order hole piece group id
## <dbl> <dbl> <int> <lgl> <fct> <fct> <chr>
## 1 -75.3 -9.30 1 FALSE 1 0.1 0
## 2 -75.3 -9.30 2 FALSE 1 0.1 0
## 3 -75.3 -9.30 3 FALSE 1 0.1 0
## 4 -75.3 -9.30 4 FALSE 1 0.1 0
## 5 -75.3 -9.30 5 FALSE 1 0.1 0
## 6 -75.3 -9.30 6 FALSE 1 0.1 0
Utilizamos los comandos x=long
, Y=lat
y group=group
para realizar nuestro mapa de la siguiente forma:
peru_provincias %>%
ggplot() +
geom_polygon(aes( x= long, y = lat, group = group),
fill = "orange",
color = "white",
size = 0.05) +
theme_void() +
theme(
axis.line = element_blank(),
axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank(),
panel.background = element_rect(colour= "darkgrey", size= 0.5)) +
ggtitle("Perú. Provincias") +
coord_map()
Una alternativa que puede resultar de notable interés consiste en utilizar el paquete {ggiraph} para realizar un mapa interactivo, tal y como expusimos en este post. Con unas ligeras modificaciones conseguimos que se muestre el nombre de las regiones (pronvicias o distritos) cuando pasamos el cursor sobre el mapa e, incluso, podemos establecer que se nos redirija a una página web al hacer click en alguna de ellas. De hecho, en el ejemplo indicado el mapa nos redirecciona a una entrada en Wikipedia cuando señalamos cualquier distrito del mapa.
2.3. Mapa con {leaflet}
Una tercera posibilidad consiste en generar un mapa utilizando el paquete {leaflet}. {Leaflet} es una librería JavaScript opensource diseñada para crear mapas interactivos en un entorno móvil. Al igual que con {ggplot2}, en este blog encontrará post específicos donde se explica en mayor detalle cómo realizar mapas con el paquete {leaflet} (véase este, este o este).
Antes de realizar el mapa crearemos una paleta de colores (pal
) partiendo de la paleta “Paired” del paquete {RColorBrewer}.
pal <- colorFactor(
palette = "Paired",
domain = peru_prov@data$DEPARTAMEN)
Y en segundo lugar realizamos el mapa. Establecemos, con la función label
, que el mapa nos indique el nombre de la respectiva provincia cuando pasamos el cursor sobre el mapa y que al hacer click en un determinado distrito se indique el nombre de dicha provincia y el departamento al que pertenece. Por su parte, los colores indicarán todos las provincias correspondientes a un determinado departamento. Además, el paquete {leaflet} nos permite acercar y alejar el mapa, ofreciéndonos una mayor interacción con el mismo.
leaflet(peru_prov) %>%
addTiles() %>%
addPolygons(weight = 1,
stroke = TRUE,
color = "white",
fillColor = ~pal(DEPARTAMEN),
fillOpacity = 0.7,
dashArray = "3",
label = ~PROVINCIA,
popup = ~paste("Provincia:", PROVINCIA,
"<br/>",
"Departamento:", DEPARTAMEN),
highlight = highlightOptions(
weight = 2,
dashArray = "",
color = "grey",
bringToFront = TRUE
))
Para ver el mapa interactivo creado con {leaflet} a partir del código anterior haga click aquí
3. Siguientes pasos
En este primer post se ha expuesto cómo examinar la información contenida en archivos shapefile y cómo representar estos archivos en un mapa utilizando diversas metodologías. En el siguiente post añadiremos al shapefile información sobre las provincias y distritos proveniente del Centro Nacional de Planeamiento Estratégico del Perú (CEPLAN).