19 nov 2017

5 pasos para crear mapas de República Dominicana en R


Paso 1. Descargar los documentos Shape para el país. Los mismos, están disponibles de forma gratuita, en la sección de informaciones cartográficas de la Oficina Nacional de Estadística. [Disponible: https://www.one.gob.do/informaciones-cartograficas]


Paso 2. Una vez descargamos los archivos “ShapeFiles 2010”, necesitamos instalar los siguientes paquetes en R.

install.packages("ggmap")
install.packages("rgdal")
install.packages("rgeos")
install.packages("maptools")
install.packages("dplyr")
install.packages("tidyr")
install.packages("tmap")

x <- c("ggmap", "rgdal", "rgeos", "maptools", "dplyr", "tidyr", "tmap", "ggplot2")

lapply(x, library, character.only = TRUE)

Paso 3. Una vez cargados los paquetes necesarios, redireccionamos el directorio de trabajo (a la carpeta donde hemos colocado los shapefile descargados) y cargamos el archivo .shp correspondiente a las regiones, provincia o municipio según corresponda.

C:\Users\Nerys Ramierz\Documents\Cursos\Curso R\R Mapas

map <- readOGR(dsn = "REGCenso2010.shp")


Observe, que las iniciales del documento (.shp), nos indican si se trata de provincia, regiones, barrios o municipios.  Ahora, utilizamos la opción plot, para representar el mapa del país. Dicho mapa reflejara las regiones del país, porque fue el archivo seleccionado. Observándose el siguiente resultado:

plot(map)



Paso 4. Ahora, debemos verificar el orden de los datos, para saber a que regiones corresponden los indicadores de cada vector. Para esto, utilizamos la opción map@data para poder entender en que forma introducir el dato correspondiente a cada región. 

map@data

0  01           REGIÓN CIBAO NORTE
1  02             REGIÓN CIBAO SUR
2  03        REGIÓN CIBAO NORDESTE
3  04        REGIÓN CIBAO NOROESTE
4  05              REGIÓN VALDESIA
5  06            REGIÓN ENRIQUILLO
6  07              REGIÓN EL VALLE
7  08                  REGIÓN YUMA
8  09               REGIÓN HIGUAMO
9  10 REGIÓN OZAMA O METROPOLITANA

En este, se verifica que debemos introducir un vector, cuyo primer valor, corresponda a la Región Cibao Norte, seguido de Cibao Sur y así sucesivamente hasta la Ozama, que es la última de la base de datos.

Ahora que sabemos el orden en como vamos a introducir los datos, usamos los datos de pobreza por regiones, del boletín de pobreza monetaria 2016, para introducir los datos provinciales. El SISDOM, publicado por el Ministerio de Economía, es una fuente rica en datos provinciales y regionales, por temáticas especificas. 

map$pobreza <-  c(25.9,30.4,27.9,37.2,38.4,55.6,56.9,28.2,37.3,23.6)

Paso 5. Ahora, utilizamos la función qtm, para representar los datos anteriores. Introduciendo como argumentos el shp shape cargado y los datos correspondientes fill

qtm(shp = map, fill = c("pobreza"))

Hasta aquí, ya hemos representado información geográfica de forma sencilla. Por lo que, nos dedicaremos a realizar algunas modificaciones que permite esta función, que nos pueden resultar de interés. Podemos cambiar los colores utilizados y el orden de intensidad de estos coloras a partir de las magnitudes representadas, utilizando la opción fill.palette [Reds; div;].

qtm(shp = map, fill = c("pobreza"), fill.palette = "Blues")


Observe, que por default, el programa ordena la magnitud del color presentado de menor a mayor, para invertir esta opción, solo necesitamos colocar el signo de -, antes del paquete de colores indicado.

qtm(shp = map, fill = c("pobreza"), fill.palette = "-Blues")


Los colores que segmentan el territorio, también pueden modificarse. Por cuestiones de preferencia, también podríamos optar por quitar los bordes que limitan el territorio, mediante la opción borders.

qtm(shp = map, fill = c("pobreza"), fill.palette = "Blues", borders = NULL)


O colocar dichos bordes de un color determinado:

qtm(shp = map, fill = c("pobreza"), fill.palette = "Blues", borders = "White")


Las etiquetas de las regiones, se pueden agregar la opción tm_text, con el nombre de la variable que deseamos representar entre paréntesis tm_text("pobreza")

qtm(shp = map, fill = c("pobreza"), fill.palette = "Blues", borders = "White") +
         tm_text("pobreza")


También, podemos colocar el nombre de las provincias, introduciendo un vector con los nombres correspondientes.

map$RegNom <- c("Cibao Norte", "Cibao Sur","Cibao Nordeste","Cibao                Noroeste","Valdesia","enrriquillo","El Valle","Yuma","Higuamo","Ozama")

qtm(shp = map, fill = c("pobreza"), fill.palette = "Blues", borders = "White")+
                tm_text("RegNom", size=.7)


En caso de querer que la función imprima el nombre de la región, combinado con el calor correspondiente, podemos utilizar la función Paste de R, para generar este vector string y luego representarlo en el mapa. Observe que ahora aparece el argumento size, este, permite manejar el tamaño de las etiquetas.

map$RegNom1<-paste(map$RegNom,map$pobreza)

tm_text("RegNom1", size=.7)


Observe, que al tener la información sobre los niveles de pobreza, representados en cada una de las regiones, podemos optar por eliminar la leyenda del gráfico.

qtm(shp = map, fill = c("pobreza"), fill.palette = "Blues", borders = "White")+
             tm_text("RegNom1", size=.7) +
             tm_layout(legend.show = FALSE,outer.margins=0)


Hasta ahora, el programa ha segmentado el territorio a partir de un criterio predefinido, no obstante, en muchos casos quisiéramos segmentar el territorio en grupos definidos, como por ejemplo quintiles, esto se logra introduciendo el argumento fill.style.

qtm(shp = map, fill = c("pobreza"), fill.palette = "Blues", borders = "White",            fill.style="quantile"+
  tm_text("RegNom1", size=.7) 


qtm(shp = map, fill = c("pobreza"),  fill.palette = "Blues", borders = "White", fill.style="kmeans")


 También, especialmente los usuarios de latex, desearían guardar el mapa en forma de imagen, para evitar tener que generalo reiterada veces.

map1<-qtm(shp = map, ...)
save_tmap(map1, "World_map.png")

Combinar mapas

map1<-qtm(shp = map, fill = c("pobreza"), fill.palette = "Blues", title="Azul")
map2<-qtm(shp = map, fill = c("pobreza"), fill.palette = "div", title="Verde")

current.mode <- tmap_mode("plot")
tmap_arrange(map1, map2, ncol = 2, nrow = 1)


Esta combinación, nos permite representar diferentes variables, o la misma variable en distintos puntos temporales. Por ejemplo la pobreza en 2000 y 2015, o la pobreza con la indigencia.

map$pobreza <-  c(25.9,30.4,27.9,37.2,38.4,55.6,56.9,28.2,37.3,23.6)
map$indigencia <-  c(4.4, 5.7, 4, 8.9, 7, 16.3, 14.3, 6.4, 8.6, 5.3)
qtm(shp = map, fill = c("pobreza ", " indigencia"), fill.palette = c("Blues"), ncol = 2) + 
            tm_text(c("pobreza", "indigencia"))


También, podemos representar el estado de una variable en dos puntos temporales diferentes.

map$ta2015 <-  c(57.1,53.7,54.2,52.5,57.9,55.7,54.2,59.6,57.2,60.7)
map$ta2000 <-  c(54.5,52.7,51.0,52.7,51.6,46.0,46.9,53.3,57.8,61.1)

qtm(shp = map, fill = c("ta2000", "ta2015"), ncol=2, fill.palette = "Blues")+
    tm_text(c("ta2000", "ta2015"))


Además, se pueden introducir vectores lógicos, para obtener mapas que cumplan con determinada características. Por ejemplo, las provincias, donde la tasa de pobreza exceda el 30% de la población.

map$pobreza1 <- map$pobreza > 30
qtm(shp = map, fill = c("pobreza1"), fill.palette = "Blues")


También, podemos agregar subdivisiones o cargar diversas capa a los mapa.

map <- readOGR(dsn = "REGCenso2010.shp")
mapProv <- readOGR(dsn = "PROVCenso2010.shp")
mapBarrio <- readOGR(dsn = "BPCenso2010.shp")

tm_shape(map) +
  tm_borders(col = "black", lwd=2, lty = "solid") +

tm_shape(mapProv) +
  tm_borders(col = "grey40", lwd=1) +


A estaos niveles, se le pueden dar formatos y agregar texto:

map <- readOGR(dsn = "REGCenso2010.shp")
mapProv <- readOGR(dsn = "PROVCenso2010.shp")
mapBarrio <- readOGR(dsn = "BPCenso2010.shp")

tm_shape(map) +
  tm_fill("pobreza",style= "kmeans") +
  tm_text("REG", size=0.8) +
  tm_borders(col = "black", lwd=4, lty = "solid") +

tm_shape(mapProv) +
  tm_borders(col = "grey40", lwd=1) +
  tm_layout(bg.color="white",inner.margins=c(.02, .05, .02, .02))

tm_shape(mapBarrio)+
  tm_borders(col = "grey40", lwd=1)



tm_shape(map) +
   tm_polygons("pobreza",style="kmeans") +
   tm_facets(by="RegNom",free.coords=TRUE, drop.shapes=TRUE) +
   tm_layout(legend.show = FALSE, outer.margins=0)



Agradecimientos

A Johan de la Rosa, quien nos presentó la herramienta.

Referencias

Brunsdon, C. (2017). Creating Maps with tmap.

Tennekes, Martijn (2015). R-package tmap: Creating thematic maps in a flexible way. Consultado el 15/11/2017. Disponible en: http://von-tijn.nl/tijn/research/presentations/tmap_user2015.pdf .

Tennekes, Martijn;  Gombin, J.; Jeworutzki , S.; Russell , K. and Zijdeman, R. (2017). Package ‘tmap’

Lovelace, R.; Cheshire, J.; Oldroyd, R. (2015). Introduction to visualising spatial data in R.















Creando variables por grupos en dplyr (group_by + mutate)

  Simulemos una base de hogares, donde se identifica el hogar, el sexo (1 mujer) y provincia y edad para cada miembro.   # Definir la lista ...