1. Introducción

La necesidad por obtener información de la Tierra y sus recursos como herramienta para satisfacer los requerimientos de la humanidad, ha obligado a buscar representaciones del globo terrestre y de su superficie en múltiples formas, fundamentadas en bases científico-tecnológicas que, por medio de ecuaciones matemáticas, reproduzcan a su vez esquemas gráficos que representen semejanzas de los fenómenos producidos en la tierra y en ciertas dinámicas típicas de las sociedades. Es así como los mapas han sido empleados desde la antigüedad para recoger y transmitir información en aspectos como los físicos, sociales, productivos, ambientales, infraestructurales, etc. La cartografía básica ha evolucionado de manera que los datos estadísticos y de sensores remotos, generan y espacializan toda la información del territorio en sus múltiples manifestaciones.
Un público cada vez más amplio explota las potencialidades de este lenguaje gráfico, tan flexible y potente para la transmisión y conceptualización de conocimientos. La representación de los elementos en el espacio permite visibilizar las interrelaciones socio-territoriales y ayuda a comprender su organización y funcionamiento. Con dicha representación, se pueden analizar, simultáneamente, los aspectos generales que marcan un modelo teórico, junto con las contingencias o particularidades que se dan en un lugar. Se ha pasado de representar la información geográfica, a representar geográficamente la información, y bajo este cambio de paradigma, las herramientas cartográficas ofrecen una dimensión espacial que facilita el trabajo, la reflexión y la cooperación transversal entre instituciones, técnicos y ciudadanía. Basados en lo anterior, este cuaderno de R Markdown tiene como objetivo dar información sobre conocimientos básicos de la cartografía temática y algunas de sus aplicaciones, representando principalmente a las Necesidades Básicas Insatisfechas (NBI) y Estadísticas Municipales Agropecuarias en el departamento de Boyacá.

2. Cartografía temática

La cartografía temática se centra en la representación de un tema concreto (una variable espacial dada), pudiendo esta ser de cualquier índole: física, social, política, cultural, etc. Se excluyen de la lista de esos temas posibles a los puramente topográficos, que constituyen el objeto de la cartografía base. La cartografía temática se apoya en la cartografía base, ya que esta se incluye también en los mapas temáticos para facilitar la comprensión del comportamiento espacial de la variable representada y ubicar esta en un contexto geográfico dentro del propio mapa. Un mapa temático se compone, así pues, de dos partes bien diferenciadas: Primero una capa específica con la información temática, que contiene la información principal del mapa, representando la variable espacial sobre la que se construye este y como segunda parte está un mapa base el cual proveerá una localización geográfica a la que se referencia la información temática y ayudará a los elementos de la componente temática a transmitir mejor la información que contienen.
La cartografía temática pretende reflejar una imagen precisa y clara del ambiente espacial del fenómeno, Para ello emplea diversas variables visuales (forma, color, orientación, valor, tamaño, etc) que le permiten representar mediante objetos geométricos los fenómenos o entidades del mundo real. También enfatiza un tema o temas, como la distribución promedio de lluvia en un área , la densidad de población en un municipio, variables de un cultivo como área sembrada y cosechada, producción y rendimiento.
Las fuentes de datos de los mapas temáticos son muy importantes, se debe contar con fuentes de información precisas, recientes y confiables sobre una amplia gama de temas, desde características ambientales hasta datos demográficos, para hacer los mejores mapas posibles. Actualmente, existen varias técnicas de mapeo temático que se usan con mayor frecuencia:

2.1 Mapa de coropleta

Los mapas de coropletas son una forma de cartografiado cuantitativo utilizada para la representación de información geográfica en un SIG, representan hechos o fenómenos discretos asociados a una superficie (provincias, países…), a las que se aplican símbolos superficiales de acuerdo con su valor. Para ello utiliza una serie de tramas o colores para representar diferentes magnitudes positivas o negativas, crecientes o decrecientes en intervalos de un mismo hecho (densidad de población, volumen de producción, renta per cápita, porcentaje de población activa, etc) aplicados a estas zonas siguiendo el criterio de ‘cuanta más cantidad, más oscuro’.

2.2 Mapa de símbolos proporcionales o graduados

Un mapa de símbolos proporcionales o graduados, es un mapa de una determinada región, provincia, país o continente, sobre el cual se indica determinada información cuantitativa sobre una cierta temática, asociada a determinados puntos del mapa. Representa variables cuantitativas a través de símbolos cuyo tamaño es proporcional a la magnitud de la cantidad representada, porque los símbolos más grandes se asocian naturalmente con una mayor cantidad de algo. La forma de los distintos símbolos es siempre la misma, y por simplicidad lo más frecuente es utilizar como símbolo base el círculo, aunque puede utilizarse cualquier otro, e incluso símbolos de tipo lineal (barras). El color de los símbolos no varía.

2.3 Mapa isarítmico o de contorno

Los mapas isarítmicos o de contorno usan isolíneas para representar valores continuos que cambian suavemente como los niveles de precipitación. Estos mapas también pueden mostrar valores tridimensionales, como la elevación, en mapas topográficos. En general, los datos para mapas isarítmicos se recopilan a través de puntos medibles (por ejemplo, estaciones meteorológicas) o se recopilan por área (por ejemplo, toneladas de maíz por acre por condado). La ubicación de cada isolínea representa todos los lugares de la superficie que tienen un valor particular, también siguen la regla básica de que hay lados altos y bajos en relación con la isolínea.

2.4 Mapa de puntos

Los mapas de puntos se emplean especialmente para la representación de variables que representen algún tipo de cantidad, tales como la población, el gasto medio por persona o la producción de un determinado cultivo. Estas cantidades se representan mediante la repetición de puntos como un patrón espacial, en número proporcional a su magnitud. Cada uno de esos puntos representa un valor unitario, y el conjunto de ellos sobre la zona en cuestión suma la cantidad total a representar. Los puntos tienen todos la misma forma y tamaño, a diferencia de lo que vimos en el caso de los símbolos proporcionales.

3. Datos

Utilizaremos datos sobre las Necesidades Básicas Insatisfechas (NBI) del Censo Nacional de Población y Vivienda 2018 que están disponibles en el Geoportal DANE para el departamento de Boyacá.
Anteriormente, descargué el archivo NBI, en formato .xlsx, a mi computadora. Luego, utilicé Excel para eliminar datos de municipios no ubicados dentro del Departamento de Boyacá. También “limpié” los datos, es decir, eliminé varias filas con imágenes institucionales o sin información. Mantuve las columnas que se refieren a todo el municipio (es decir, eliminé las columnas correspondientes a “cabecera” y “zona rural”). Guarde los datos resultantes, correspondientes solo a municipios boyacenses como NB1_Boyacá.xlsx en mi computadora.

4. Preparación

Como primer paso se limpiará la memoria
rm(list=ls())
Ahora, se instalarán las librerías que se necesitan.
list.of.packages <- c("tidyverse", "rgeos", "sf", "raster", "cartography", "SpatialPosition")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)
Luego, carguemos las librerías.
library(tidyverse)
## -- Attaching packages ------------- tidyverse 1.3.0 --
## v ggplot2 3.3.0     v purrr   0.3.3
## v tibble  2.1.3     v dplyr   0.8.5
## v tidyr   1.0.2     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.5.0
## -- Conflicts ---------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(readxl) 
library(rgeos)
## Loading required package: sp
## rgeos version: 0.5-2, (SVN revision 621)
##  GEOS runtime version: 3.6.1-CAPI-1.10.1 
##  Linking to sp version: 1.4-1 
##  Polygon checking: TRUE
library(raster)
## 
## Attaching package: 'raster'
## The following object is masked from 'package:dplyr':
## 
##     select
## The following object is masked from 'package:tidyr':
## 
##     extract
library(sf)
## Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3
library(cartography)
library(SpatialPosition)

5. Leer datos del NBI

Leamos el archivo xlsx con Necesidades Básicas Insatisfechas (NBI) del Censo Nacional de Población y Vivienda 2018 para el departamento de Boyacá.
nbi <- read_excel("C:/Users/Brian/Desktop/Daniela/Cartografía temática/NB1_Boyacá.xlsx")
Veamos cuáles son los atributos de nbi.
head(nbi)
## # A tibble: 6 x 12
##   `COD-DEP` DEPTO COD_MUN CODIGO MUNICIPIO   NBI MISERIA VIVIENDA SERVICIOS
##   <chr>     <chr> <chr>   <chr>  <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 15        BOYA~ 001     15001  TUNJA      3.60   0.294    0.333     0.237
## 2 15        BOYA~ 022     15022  ALMEIDA    7.46   0.759    1.58      0.822
## 3 15        BOYA~ 047     15047  AQUITANIA 12.9    1.67     1.71      3.61 
## 4 15        BOYA~ 051     15051  ARCABUCO   8.94   0.477    0.459     0.184
## 5 15        BOYA~ 087     15087  BELÉN      7.33   0.697    0.341     1.02 
## 6 15        BOYA~ 090     15090  BERBEO    15.0    2.70     5.76      1.73 
## # ... with 3 more variables: HACINAMIENTO <dbl>, INASISTENCIA <dbl>,
## #   ECONOMIA <dbl>
Veamos cuál es el municipio con el mayor porcentaje de NBI:
nbi %>% 
    slice(which.max(NBI)) -> max_nbi

max_nbi
## # A tibble: 1 x 12
##   `COD-DEP` DEPTO COD_MUN CODIGO MUNICIPIO   NBI MISERIA VIVIENDA SERVICIOS
##   <chr>     <chr> <chr>   <chr>  <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 15        BOYA~ 223     15223  CUBARÁ     60.6    54.0     55.7      53.1
## # ... with 3 more variables: HACINAMIENTO <dbl>, INASISTENCIA <dbl>,
## #   ECONOMIA <dbl>
Veamos cuál es el municipio con el porcentaje más bajo de NBI:
nbi %>% 
    slice(which.min(NBI)) -> min_nbi

min_nbi
## # A tibble: 1 x 12
##   `COD-DEP` DEPTO COD_MUN CODIGO MUNICIPIO   NBI MISERIA VIVIENDA SERVICIOS
##   <chr>     <chr> <chr>   <chr>  <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 15        BOYA~ 238     15238  DUITAMA    3.36   0.122    0.283     0.126
## # ... with 3 more variables: HACINAMIENTO <dbl>, INASISTENCIA <dbl>,
## #   ECONOMIA <dbl>
Ordenemos los municipios por NBI en orden descendente:
nbi %>% 
  arrange(desc(NBI))  -> desc_nbi

desc_nbi
## # A tibble: 123 x 12
##    `COD-DEP` DEPTO COD_MUN CODIGO MUNICIPIO   NBI MISERIA VIVIENDA SERVICIOS
##    <chr>     <chr> <chr>   <chr>  <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 15        BOYA~ 223     15223  CUBARÁ     60.6   54.0     55.7      53.1 
##  2 15        BOYA~ 533     15533  PAYA       59.4   32.0     37.9      31.8 
##  3 15        BOYA~ 183     15183  CHITA      42.2   12.0     10.2      11.2 
##  4 15        BOYA~ 580     15580  QUÍPAMA    40.4    9.25    26.5       8.66
##  5 15        BOYA~ 377     15377  LABRANZA~  36.5   14.2     19.8      13.7 
##  6 15        BOYA~ 368     15368  JERICÓ     35.6   11.0      4.35     15.7 
##  7 15        BOYA~ 550     15550  PISBA      34.1   10.9     10.7      10.4 
##  8 15        BOYA~ 442     15442  MARIPÍ     32.0    7.12    11.2       6.54
##  9 15        BOYA~ 244     15244  EL COCUY   30.1    7.39     8.76      2.13
## 10 15        BOYA~ 332     15332  GÜICÁN     29.3   21.4     21.4      20.7 
## # ... with 113 more rows, and 3 more variables: HACINAMIENTO <dbl>,
## #   INASISTENCIA <dbl>, ECONOMIA <dbl>
En el periodo intercensal 2005-2018, Boyacá redujo las necesidades básicas insatisfechas (NBI) de 30,77% a 10,04%; Cubará es el municipio más pobre del departamento con el 60,59% de NBI y el 53,98% de sus habitantes viven en la miseria. Duitama con el menor NBI, 3,36%.
Boyacá ha dado un salto hacia mejores condiciones materiales para sus habitantes, tal como lo evidencia la gráfica uno. El comportamiento en el periodo intercensal 2005-2018 es el más significativo pues históricamente el NBI de Boyacá fue superior al del país pero en el censo 2018, con el 10,04%, se revirtió la tendencia. En términos absolutos, en 13 años salió de la pobreza, según NBI, el 20,72% de los boyacenses.
Gráfico 1. Fuente Dane.

Gráfico 1. Fuente Dane.

Municipios más pobres

En el comportamiento municipal, cuando se analizan los resultados territoriales, ellos evidencian las inequidades territoriales entre las provincias. De acuerdo las NBI según el censo 2018, las provincias de la Libertad, con tres municipios dentro de los diez más pobres del departamento, el occidente, con dos, Gutierrez, con dos, Valderrama, con dos, y la provincia especial de Cubará, son las más afectadas (ver gráfico 2).
Gráfico 2. Fuente Dane.

Gráfico 2. Fuente Dane.

Municipios menos pobres

Los diez municipios menos pobres del departamento geográficamente se ubican dentro del sistema de ciudades del eje regional Tunja, Duitama y Sogamoso, a excepción de Chiquinquirá. (Ver gráfico 3). La lógica del desarrollo bajo la concepción que el futuro de Colombia está en las ciudades conlleva el riesgo de la concentración de oportunidades y las inequidades, al focalizar la pobreza en los centros poblados y la población dispersa.
Gráfico 3. Fuente Dane.

Gráfico 3. Fuente Dane.

El NBI es uno de los indicadores más ligados a la gestión de las administraciones locales, de allí se desprende parte de las transferencias de recursos financieros a los municipios y es fundamental en la comprensión del bienestar de los pueblos, es importante que los entes territoriales se tomen en serio la tarea de analizar los datos de sus municipios para formular los planes de desarrollo que empiezan a construir con el propósito fundamental de superar las necesidades básicas insatisfechas.

6. Unir datos de NBI a municipios

Leamos los datos usando la librería sf:
munic <- st_read("C:/Users/Brian/Desktop/Daniela/Boyacá/Marco Geoestadístico Boyacá/15_BOYACA/ADMINISTRATIVO/MGN_MPIO_POLITICO.shp")
## Reading layer `MGN_MPIO_POLITICO' from data source `C:\Users\Brian\Desktop\Daniela\Boyacá\Marco Geoestadístico Boyacá\15_BOYACA\ADMINISTRATIVO\MGN_MPIO_POLITICO.shp' using driver `ESRI Shapefile'
## Simple feature collection with 123 features and 9 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -74.66496 ymin: 4.655196 xmax: -71.94885 ymax: 7.055557
## epsg (SRID):    4326
## proj4string:    +proj=longlat +datum=WGS84 +no_defs
Veamos qué hay dentro del atributo MPIO_CNMBR:
head(munic$MPIO_CNMBR)
## [1] TUNJA     ALMEIDA   AQUITANIA ARCABUCO  BELÉN     BERBEO   
## 123 Levels: ALMEIDA AQUITANIA ARCABUCO BELÉN BERBEO BETÉITIVA BOAVITA ... ZETAQUIRÁ
Podemos usar la función left_join para unir los municipios y los datos del NBI.
nbi_munic = left_join(munic, nbi, by=c("MPIO_CCDGO"="CODIGO"))
## Warning: Column `MPIO_CCDGO`/`CODIGO` joining factor and character vector,
## coercing into character vector
nbi_munic %>%
  dplyr::select(MUNICIPIO, MPIO_CCDGO, NBI)  ->  check_nbi_munic

head(check_nbi_munic)
## Simple feature collection with 6 features and 3 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -73.51402 ymin: 4.904038 xmax: -72.65243 ymax: 6.098348
## epsg (SRID):    4326
## proj4string:    +proj=longlat +datum=WGS84 +no_defs
##   MUNICIPIO MPIO_CCDGO       NBI                       geometry
## 1     TUNJA      15001  3.596644 POLYGON ((-73.34014 5.58308...
## 2   ALMEIDA      15022  7.458913 POLYGON ((-73.36793 5.01349...
## 3 AQUITANIA      15047 12.864358 POLYGON ((-72.76242 5.63856...
## 4  ARCABUCO      15051  8.940701 POLYGON ((-73.50487 5.84347...
## 5     BELÉN      15087  7.334062 POLYGON ((-72.91692 6.08612...
## 6    BERBEO      15090 15.048544 POLYGON ((-73.0677 5.27048,...
Tenga en cuenta que Berbeo tiene NBI = 15.048, un valor que se puede verificar con los datos de NBI ordenados previamente obtenidos. Ahora, reproyectemos los municipios:
nbi_munic_new <- st_transform(nbi_munic, crs = 3116)

7. Ejemplos de mapas temáticos

Utilizaremos el paquete de cartography que tiene como objetivo obtener mapas temáticos con la calidad visual de aquellos construidos con un software clásico de mapeo o SIG. Sus funciones son intuitivas para los usuarios y aseguran la compatibilidad con los flujos de trabajo comunes de R.
La biblioteca de cartografía usa objetos sf o sp para producir gráficos base. Como la mayoría de los componentes internos del paquete se basan en funcionalidades sf, el formato preferido para los objetos espaciales es sf.

7.1 Mapa base de OpenStreetMap y símbolos proporcionales

Las funciones getTiles () y tilesLayer () descargan y muestran los mosaicos de OpenStreetMap. Tenga cuidado de citar la fuente de los mosaicos adecuadamente.
La función propSymbolsLayer () muestra símbolos con áreas proporcionales a una variable cuantitativa (por ejemplo, NBI). Hay varios símbolos disponibles (círculos, cuadrados, barras). El argumento pulgadas se usa para personalizar los tamaños de los símbolos.
mun.osm <- getTiles(
x = nbi_munic_new, 
type = "OpenStreetMap", 
zoom = 8,
cachedir = TRUE,
crop = FALSE
)
#establecer márgenes
opar <- par(mar = c(0,0,1.2,0))
# trazar mosaicos osm
tilesLayer(x = mun.osm)
# trazar municipios (solo se trazan las fronteras)
plot(st_geometry(nbi_munic_new), col = NA, border = "grey", add=TRUE)
# trazar NBI
propSymbolsLayer(
  x = nbi_munic_new, 
  var = "NBI", 
  inches = 0.15, 
  col = "brown4",
  legend.pos = "topright",  
  legend.title.txt = "Total NBI"
)
# diseño
layoutLayer(title = " Distribución NBI en Boyacá",
            sources = "Fuentes: DANE, 2018\n© OpenStreetMap",
            author = " Daniela Quiroga ",
            frame = TRUE, north = FALSE, tabtitle = TRUE)
# Flecha norte
north(pos = "topleft")

7.2 Mapas de coropletas

En los mapas coropléticos, las áreas se sombrean de acuerdo con la variación de una variable cuantitativa. Se usan para representar proporciones o índices.
choroLayer () muestra mapas de coropletas. Los argumentos nclass, method y breaks permiten personalizar la clasificación de la variable.
getBreaks () permite clasificar fuera de la función misma. Las paletas de colores se definen con col y se puede crear un conjunto de colores con carto.pal (). Consulte también display.carto.all ().
# establecer márgenes
opar <- par(mar = c(0,0,1.2,0))
# establecer el color de fondo de la figura
par(bg="grey90")
# trazar municipios (solo se traza el color de fondo)
plot(st_geometry(nbi_munic_new), col = NA, border = NA, bg = "#aadaff")
# Graficar NBI
choroLayer(
  x = nbi_munic_new, 
  var = "NBI",
  method = "geom",
  nclass=5,
  col = carto.pal(pal1 = "harmo.pal", n1 = 5),
  border = "white", 
  lwd = 0.5,
  legend.pos = "right", 
  legend.title.txt = "NBI",
  add = TRUE
) 
# diseño
layoutLayer(title = "NBI Distribución en Boyacá", 
            sources = "Fuente: DANE, 2018",
            author = "Daniela Quiroga", 
            frame = TRUE, north = TRUE, tabtitle = TRUE, col="black") 
# Flecha norte
north(pos = "topleft")

7.3 Símbolos proporcionales y mapa de tipología

La función propSymbolsTypoLayer () crea un mapa de símbolos que son proporcionales a los valores de una primera variable y coloreados para reflejar las modalidades de una segunda variable cualitativa. Se utiliza una combinación de argumentos propSymbolsLayer () y typoLayer ().
Primero, necesitamos crear una variable cualitativa. Usemos la función mutate para esta tarea.
nbi_munic_2 <- dplyr::mutate(nbi_munic_new, pobreza = ifelse(MISERIA > 20, "Extrema", 
                                                         ifelse(HACINAMIENTO > 5, "Alta", "Intermedia")))
Tenga en cuenta que el nuevo atributo se llama pobreza. Su valor depende de los valores umbral definidos por el usuario. Asegúrese de verificar la sintaxis del comando ifelse para comprender lo que está sucediendo.
head(nbi_munic_2)
## Simple feature collection with 6 features and 21 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: 1062406 ymin: 1034076 xmax: 1157943 ymax: 1166250
## epsg (SRID):    3116
## proj4string:    +proj=tmerc +lat_0=4.596200416666666 +lon_0=-74.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
##   DPTO_CCDGO MPIO_CCDGO MPIO_CNMBR                      MPIO_CRSLC MPIO_NAREA
## 1         15      15001      TUNJA                            1541  119.68957
## 2         15      15022    ALMEIDA                            1908   57.67212
## 3         15      15047  AQUITANIA                            1789  942.14660
## 4         15      15051   ARCABUCO                            1856  137.89859
## 5         15      15087      BELÉN                            1756  163.08822
## 6         15      15090     BERBEO Ordenanza 28 de Abril 9 de 1913   58.01301
##   MPIO_NANO DPTO_CNMBR Shape_Leng  Shape_Area COD-DEP  DEPTO COD_MUN MUNICIPIO
## 1      2017     BOYACÁ  0.5723744 0.009766301      15 BOYACÁ     001     TUNJA
## 2      2017     BOYACÁ  0.3484692 0.004701759      15 BOYACÁ     022   ALMEIDA
## 3      2017     BOYACÁ  1.8003115 0.076843504      15 BOYACÁ     047 AQUITANIA
## 4      2017     BOYACÁ  0.7527090 0.011256738      15 BOYACÁ     051  ARCABUCO
## 5      2017     BOYACÁ  0.6293489 0.013314920      15 BOYACÁ     087     BELÉN
## 6      2017     BOYACÁ  0.4291743 0.004730850      15 BOYACÁ     090    BERBEO
##         NBI   MISERIA  VIVIENDA SERVICIOS HACINAMIENTO INASISTENCIA ECONOMIA
## 1  3.596644 0.2936770 0.3326341 0.2373389    0.9835181    0.6209170 1.769853
## 2  7.458913 0.7585335 1.5802781 0.8217446    1.3274336    1.2010114 3.286979
## 3 12.864358 1.6738817 1.7099567 3.6147186    3.4632035    1.4357864 4.523810
## 4  8.940701 0.4773270 0.4589682 0.1835873    2.2948412    4.3143015 2.166330
## 5  7.334062 0.6965310 0.3414368 1.0243103    2.0349631    0.5736138 4.110899
## 6 15.048544 2.7045770 5.7558946 1.7337032    1.0402219    1.3176144 8.460472
##                         geometry    pobreza
## 1 POLYGON ((1081699 1109184, ... Intermedia
## 2 POLYGON ((1078692 1046187, ... Intermedia
## 3 POLYGON ((1145704 1115432, ... Intermedia
## 4 POLYGON ((1063418 1137961, ... Intermedia
## 5 POLYGON ((1128481 1164899, ... Intermedia
## 6 POLYGON ((1111945 1074654, ... Intermedia
library(sf)
library(cartography)
# Establecer márgenes
opar <- par(mar = c(0,0,1.2,0))
# Trazar los municipios
plot(st_geometry(nbi_munic_2), col="#f2efe9", border="#b38e43", bg = "#aad3df", 
     lwd = 0.5)
# Trazar símbolos con coloración coropleta
propSymbolsTypoLayer(
  x = nbi_munic_2, 
  var = "NBI", 
  inches = 0.3,
  symbols = "square",
  border = "white",
  lwd = .5,
  legend.var.pos = "topright", 
  legend.var.title.txt = "NBI",
  var2 = "pobreza",
  legend.var2.values.order = c("Extrema", "Alta", 
                               "Intermedia"),
  col = carto.pal(pal1 = "multi.pal", n1 = 3),
  legend.var2.pos = "top", 
  legend.var2.title.txt = "Pobreza"
) 
# Diseño
layoutLayer(title="NBI Distribución en Boyacá", 
            author = "Daniela Quiroga", 
            sources = "Fuente: DANE, 2018", 
            scale = 1, tabtitle = TRUE, frame = TRUE)
# Flecha norte
north(pos = "topleft")

Observando el mapa podermos ver que los municipios que presentan pobreza extrema son Cubará, Guicán y Paya.
par(opar)

7.4 Mapas de etiquetas

Intentemos combinar las funciones choroLayer y labelLayer:
library(sf)
library(cartography)
# Establecer márgenes
opar <- par(mar = c(0,0,1.2,0))
# Establecer color de fondo de figura
par(bg="grey50")
# Trazar municipios
plot(st_geometry(nbi_munic_2), col = "#e4e9de", border = "darkseagreen4", 
     bg = "grey90", lwd = 0.5)
# Trazar NBI
choroLayer(
  x = nbi_munic_new, 
  var = "NBI",
  method = "geom",
  nclass=5,
  col = carto.pal(pal1 = "harmo.pal", n1 = 5),
  border = "white", 
  lwd = 0.5,
  legend.pos = "right", 
  legend.title.txt = "NBI",
  add = TRUE
) 
# Trazar etiquetas
labelLayer(
  x = nbi_munic_2, 
  txt = "MUNICIPIO", 
  col= "white", 
  cex = 0.4, 
  font = 4,
  halo = TRUE, 
  bg = "grey25", 
  r = 0.1, 
  overlap = FALSE, 
  show.lines = FALSE
)
# Diseño del mapa
layoutLayer(
  title = "Municipios de Boyacá", 
  sources = "FUENTE: DANE, 2018",  
  author = "Daniela Quiroga", 
  frame = TRUE,
  north = TRUE, 
  tabtitle = TRUE, 
  theme = "taupe.pal"
) 

7.5 Mapas de isopletas

Los mapas de isopletas se basan en el supuesto de que el fenómeno a representar tiene una distribución continua. Estos mapas utilizan un enfoque de modelado de interacción espacial que tiene como objetivo calcular indicadores basados en valores de stock ponderados por distancia. Permite una representación espacial del fenómeno independiente de la heterogeneidad inicial de la división territorial. smoothLayer () depende en gran medida del paquete SpatialPosition. La función utiliza una capa de puntos marcados y un conjunto de parámetros (una función de interacción espacial y sus parámetros) y muestra una capa de mapa isopleta.
Usemos otro conjunto de datos para hacer un mapa isopleta. En este caso, subiré datos Estadísticas Municipales Agropecuarias sobre la producción de papa de 2018 en Boyacá. Ya conocemos este conjunto de datos, ya que se utilizó en un cuaderno anterior para ilustrar las uniones basadas en atributos.
Lea el conjunto de datos:
crops2018 <- read_excel("C:/Users/Brian/Desktop/Daniela/Agricultura/EVA_Boyaca_3.xlsx")
head(crops2018) 
## # A tibble: 6 x 14
##   COD_DEP DEPARTAMENTO COD_MUN MUNICIPIO GRUPO_DE_CULTIVO SUBGRUPO_DE_CUL~
##     <dbl> <chr>          <dbl> <chr>     <chr>            <chr>           
## 1      15 BOYACA         15879 VIRACACHA HORTALIZAS       ACELGA          
## 2      15 BOYACA         15759 SOGAMOSO  HORTALIZAS       ACELGA          
## 3      15 BOYACA         15600 RAQUIRA   FRUTALES         FRUTALES EXOTIC~
## 4      15 BOYACA         15676 SAN MIGU~ FRUTALES         FRUTALES EXOTIC~
## 5      15 BOYACA         15774 SUSACON   FRUTALES         FRUTALES EXOTIC~
## 6      15 BOYACA         15531 PAUNA     FRUTALES         AGUACATE        
## # ... with 8 more variables: CULTIVO <chr>, YEAR <dbl>, Area_Sembrada <dbl>,
## #   Area_Cosechada <dbl>, Produccion <dbl>, Rendimiento <dbl>,
## #   ESTADO_FISICO_PRODUCCION <chr>, CICLO_DE_CULTIVO <chr>
Filtrar las filas que representan solo datos de papa:
crops2018 %>%
  filter(CULTIVO == "PAPA") -> papa2018
Cree un nuevo atributo que coincida con los códigos de los municipios:
papa2018$TEMP <-  as.character(papa2018$COD_MUN)
papa2018$MPIO_CCDGO <- as.factor(papa2018$TEMP)
Ahora, haz la unión:
papa_munic = left_join(munic, papa2018, by="MPIO_CCDGO")
## Warning: Column `MPIO_CCDGO` joining factors with different levels, coercing to
## character vector
Verifique la salida:
head(papa_munic)
## Simple feature collection with 6 features and 24 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -73.44727 ymin: 4.904038 xmax: -72.65243 ymax: 5.645146
## epsg (SRID):    4326
## proj4string:    +proj=longlat +datum=WGS84 +no_defs
##   DPTO_CCDGO MPIO_CCDGO MPIO_CNMBR MPIO_CRSLC MPIO_NAREA MPIO_NANO DPTO_CNMBR
## 1         15      15001      TUNJA       1541  119.68957      2017     BOYACÁ
## 2         15      15001      TUNJA       1541  119.68957      2017     BOYACÁ
## 3         15      15022    ALMEIDA       1908   57.67212      2017     BOYACÁ
## 4         15      15022    ALMEIDA       1908   57.67212      2017     BOYACÁ
## 5         15      15047  AQUITANIA       1789  942.14660      2017     BOYACÁ
## 6         15      15047  AQUITANIA       1789  942.14660      2017     BOYACÁ
##   Shape_Leng  Shape_Area COD_DEP DEPARTAMENTO COD_MUN MUNICIPIO
## 1  0.5723744 0.009766301      15       BOYACA   15001     TUNJA
## 2  0.5723744 0.009766301      15       BOYACA   15001     TUNJA
## 3  0.3484692 0.004701759      15       BOYACA   15022   ALMEIDA
## 4  0.3484692 0.004701759      15       BOYACA   15022   ALMEIDA
## 5  1.8003115 0.076843504      15       BOYACA   15047 AQUITANIA
## 6  1.8003115 0.076843504      15       BOYACA   15047 AQUITANIA
##        GRUPO_DE_CULTIVO SUBGRUPO_DE_CULTIVO CULTIVO YEAR Area_Sembrada
## 1 TUBERCULOS Y PLATANOS                PAPA    PAPA 2018          2600
## 2 TUBERCULOS Y PLATANOS                PAPA    PAPA 2018           150
## 3 TUBERCULOS Y PLATANOS                PAPA    PAPA 2018             6
## 4 TUBERCULOS Y PLATANOS                PAPA    PAPA 2018             4
## 5 TUBERCULOS Y PLATANOS                PAPA    PAPA 2018            60
## 6 TUBERCULOS Y PLATANOS                PAPA    PAPA 2018            25
##   Area_Cosechada Produccion Rendimiento ESTADO_FISICO_PRODUCCION
## 1           2600      52000          20         TUBERCULO FRESCO
## 2            150       1500          10         TUBERCULO FRESCO
## 3              6         43         715         TUBERCULO FRESCO
## 4              4         17         415         TUBERCULO FRESCO
## 5             60       1530         255         TUBERCULO FRESCO
## 6             25        200           8         TUBERCULO FRESCO
##   CICLO_DE_CULTIVO  TEMP                       geometry
## 1      TRANSITORIO 15001 POLYGON ((-73.34014 5.58308...
## 2      TRANSITORIO 15001 POLYGON ((-73.34014 5.58308...
## 3      TRANSITORIO 15022 POLYGON ((-73.36793 5.01349...
## 4      TRANSITORIO 15022 POLYGON ((-73.36793 5.01349...
## 5      TRANSITORIO 15047 POLYGON ((-72.76242 5.63856...
## 6      TRANSITORIO 15047 POLYGON ((-72.76242 5.63856...
Ahora, reproyectemos los municipios:
rep_papa <- st_transform(papa_munic, crs = 3116)
Tiempo de mapeo:
# set margins
opar <- par(mar = c(0,0,1.2,0))
# plot municipalities (only the backgroung color is plotted)
plot(st_geometry(rep_papa), col = NA, border = "black", bg = "grey75")
# plot isopleth map
smoothLayer(
  x = rep_papa, 
  var = 'Produccion',
  typefct = "exponential",
  span = 20000,
  beta = 2,
  nclass = 10,
  col = carto.pal(pal1 = 'harmo.pal', n1 = 10),
  border = "grey",
  lwd = 0.1, 
  mask = rep_papa, 
  legend.values.rnd = -3,
  legend.title.txt = "Producción",
  legend.pos = "right", 
  add=TRUE
)
# annotation on the map
text(x = 900000, y = 1230000, cex = 0.8, adj = 0, font = 3,  labels = 
       "Función Distancia:\n- type = exponential\n- beta = 2\n- span = 20 km")
# layout
layoutLayer(title = "Distribución de la Producción de PAPA en Boyacá",
            sources = "Fentes: DANE y MADR, 2018",
            author = "Daniela Quiroga",
            frame = FALSE, north = FALSE, tabtitle = TRUE, theme = "green.pal")
# north arrow
north(pos = "topleft")

8. Guardar mapas

Produzcamos otro mapa de producción de papa en 2018. Esta vez usaremos símbolos proporcionales y mapas de coropletas. La salida se guardará como un archivo .png.
Primero, algunas observaciones: - propSymbolsChoroLayer () crea un mapa de símbolos que son proporcionales a los valores de una primera variable y coloreados para reflejar la clasificación de una segunda variable. - se utiliza una combinación de argumentos propSymbolsLayer () y choroLayer (). El siguiente fragmento no muestra un mapa. En cambio, escribe el mapa en el nombre de archivo papa_2018.png debajo del directorio de trabajo.
### open the plot
png("C:/Users/Brian/Desktop/Daniela/Agricultura/papa2018.png", width = 2048, height = 1526)
# set margins
opar <- par(mar = c(0,0,5,5))
# Plot the municipalities
plot(st_geometry(rep_papa), col="darkseagreen3", border="darkseagreen4",  
     bg = "white", lwd = 0.6)
# Plot symbols with choropleth coloration
propSymbolsChoroLayer(x = rep_papa, var = "Produccion", var2 = "Rendimiento",
                      col = carto.pal(pal1 = "harmo.pal", n1 = 3,
                                      pal2 = "red.pal", n2 = 3),
                      inches = 0.8, method = "q6",
                      border = "grey50", lwd = 1,
                      legend.title.cex = 1.5,
                      legend.values.cex = 1.0,
                      legend.var.pos = "right", 
                      legend.var2.pos = "left",
                      legend.var2.values.rnd = 2,
                      legend.var2.title.txt = "Rendimiento\n(en Ton/Ha)",
                      legend.var.title.txt = "Producción de Papa en 2018",
                      legend.var.style = "e")
# plot labels
labelLayer(
  x = rep_papa, 
  txt = "MPIO_CNMBR", 
  col= "white", 
  cex = 1.0, 
  font = 4,
  halo = FALSE, 
  bg = "white", 
  r = 0.1, 
  overlap = FALSE, 
  show.lines = FALSE
)
# layout
layoutLayer(title="Producción y Rendimiento de Papa en Boyacá, 2018",
            author = "Daniela Quiroga", 
            sources = "Fuentes: MADR & DANE, 2018", 
            scale = 50, tabtitle = FALSE, frame = TRUE)
# north arrow
north(pos = "topleft")
#
title(main="Producción y Rendimiento de Papa en Boyacá, 2018", cex.main=3,
      sub= "Fuentes: MADR & DANE, 2018", cex.sub=2)
#
graticule = TRUE
#
par(opar)
### close the plot
dev.off()
## png 
##   2
Una vez que guardamos un mapa, podemos agregarlo a nuestro informe R Markdown usando usando la sintaxis de Markdown de la siguiente manera:
Producción de Papa en Boyacá, 2018

Producción de Papa en Boyacá, 2018

sessionInfo()
## R version 3.6.3 (2020-02-29)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 8.1 x64 (build 9600)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=Spanish_Colombia.1252  LC_CTYPE=Spanish_Colombia.1252   
## [3] LC_MONETARY=Spanish_Colombia.1252 LC_NUMERIC=C                     
## [5] LC_TIME=Spanish_Colombia.1252    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] SpatialPosition_1.2.0 cartography_2.4.1     sf_0.8-1             
##  [4] raster_3.0-12         rgeos_0.5-2           sp_1.4-1             
##  [7] readxl_1.3.1          forcats_0.5.0         stringr_1.4.0        
## [10] dplyr_0.8.5           purrr_0.3.3           readr_1.3.1          
## [13] tidyr_1.0.2           tibble_2.1.3          ggplot2_3.3.0        
## [16] tidyverse_1.3.0      
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_1.0.3         lubridate_1.7.4    lattice_0.20-38    png_0.1-7         
##  [5] class_7.3-15       utf8_1.1.4         assertthat_0.2.1   digest_0.6.25     
##  [9] R6_2.4.1           cellranger_1.1.0   backports_1.1.5    reprex_0.3.0      
## [13] evaluate_0.14      e1071_1.7-3        httr_1.4.1         pillar_1.4.3      
## [17] rlang_0.4.5        rstudioapi_0.11    rmarkdown_2.1      rgdal_1.4-8       
## [21] munsell_0.5.0      broom_0.5.5        compiler_3.6.3     modelr_0.1.6      
## [25] xfun_0.12          pkgconfig_2.0.3    htmltools_0.4.0    tidyselect_1.0.0  
## [29] codetools_0.2-16   fansi_0.4.1        crayon_1.3.4       dbplyr_1.4.2      
## [33] withr_2.1.2        grid_3.6.3         nlme_3.1-144       jsonlite_1.6.1    
## [37] gtable_0.3.0       lifecycle_0.2.0    DBI_1.1.0          magrittr_1.5      
## [41] units_0.6-5        scales_1.1.0       KernSmooth_2.23-16 cli_2.0.2         
## [45] stringi_1.4.6      fs_1.3.2           xml2_1.2.5         generics_0.0.2    
## [49] vctrs_0.2.4        tools_3.6.3        glue_1.3.2         hms_0.5.3         
## [53] slippymath_0.3.1   yaml_2.2.1         colorspace_1.4-1   classInt_0.4-2    
## [57] rvest_0.3.5        knitr_1.28         haven_2.2.0