Mapas con tmap

Mapas con tmap

Vamos a hacer una breve exposición de la library(tmap), un paquete de mapas con sintaxis estilo ggplot y bastante simple de usar.

Es un paquete que está en cran, pero también puedes descargarlo de github.

Como ejemplo tomaremos los datos de una capa shp bajada de la web del Ministerio, con las comunidades autónomas de España.

tmap

El primer problema que veo es con Cataluña, bueno me explico, la capa debía estar con otro código y no con UTF-8 por lo que la letra ñ, la ha lee mal, y por eso he tenido que arreglar esto antes de continuar.

    library(tmap)
    library(sf)
  # Leemos capa GIS
    autonomias <- st_read("../../static/capas/Comunidades autonomas.shp")
## Reading layer `Comunidades autonomas' from data source `C:\R\publicaciones\enrdados\static\capas\Comunidades autonomas.shp' using driver `ESRI Shapefile'
## Simple feature collection with 19 features and 3 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: -18.16122 ymin: 27.63779 xmax: 4.327785 ymax: 43.79238
## epsg (SRID):    NA
## proj4string:    +proj=longlat +ellps=GRS80 +no_defs
    #head(autonomias)
  
  # extraemos solo la tabla de datos
    tabla_auto<-st_set_geometry(autonomias,NULL)
    head(tabla_auto,8)
##   COD_CCAA                                NOML_CCAA           NOM_CCAA
## 1       01          COMUNIDAD AUTONOMA DE ANDALUCIA          ANDALUCIA
## 2       02             COMUNIDAD AUTONOMA DE ARAGON             ARAGON
## 3       03  COMUNIDAD AUTONOMA DE LAS ILLES BALEARS           BALEARES
## 4       04           COMUNIDAD AUTONOMA DE CANARIAS           CANARIAS
## 5       05          COMUNIDAD AUTONOMA DE CANTABRIA          CANTABRIA
## 6       06 COMUNIDAD AUTONOMA DE CASTILLA-LA MANCHA CASTILLA-LA MANCHA
## 7       07             COMUNIDAD DE CASTILLA Y LEON      CASTILLA-LEON
## 8       08        COMUNIDAD AUTONOMA DE CATALU<d1>A        CATALU<d1>A
  #tabla_auto[which(tabla_auto[,3] == "CATALU\xd1A")] <- "CATALU&ntildeA"
    levels(tabla_auto[,3])[9]<-"CATALUÑA"
    levels(tabla_auto[,2])[8]<-"COMUNIDAD AUTONOMA DE CATALUÑA"
  
  # lo convierto en capa sf de nuevo
    auton1<-st_sf(tabla_auto,st_geometry(autonomias))

Una vez solucionado el asunto con Cataluña (jeje), tenemos una capa sf con objetos geométricos y otros de base de datos.

Solo por curiosidad podemos ver que la mayoría de las CCAA son objetos gráficos multipolygon anillados, es decir complejos.

# qué CCAA tienen mas de un poligono en anillo
    w <- which(sapply(st_geometry(autonomias), length) > 1)
    #plot(autonomias[w,1])
    w
##  [1]  1  2  3  4  5  6  8  9 11 12 15 16 17 18 19

Para pintar un mapa con tmap es como en ggplot, la fucnión principal es tm_shape() y se añaden con + los siguentes objetos por capas al dibujo. tm_fill() añade un fondo, tm_borders(), los bordes, tm_polygon() las dos cosas anteriores a la vez.. y así. Las escalas son otro objeto más tm_scale_bar(), la felcha de norte otro tm_compass(). Para añadir una capa de texto tm_text.

# Pintamos la capa de ccaa
tm_shape(auton1) +
  tm_fill() 

tm_shape(auton1) +
  tm_borders() 

tm_shape(auton1) +
   tm_polygons(col = "COD_CCAA", palette = "BuGn")

tm_shape(auton1) +
   tm_polygons(col = "NOM_CCAA")

# mapa completo
tm_shape(auton1) +
    tm_polygons(col = "NOM_CCAA")+
    tm_compass(type = "8star", position = c("left", "top")) +
    tm_scale_bar(breaks = c(0, 100, 400), size = 2)+
    tm_layout(title = "España")+
    tm_layout(bg.color = "lightblue")+
    tm_layout(frame = FALSE)+
    tm_text("NOM_CCAA", size="AREA", scale=1.5)

#    +tm_style("bw")
    
library(dplyr)
    # todas las CCAA menos Canarias    
    canarias<-autonomias %>% select(COD_CCAA)%>% filter(COD_CCAA=="04")
    
    c1<-st_cast(canarias,"POLYGON")
    #Seleccionamos solo las 7 islas o polígonos más grandes
    islas_principales<-c1[[2]][1:7]
    # calculamos el área
    area<-unclass(st_area(islas_principales))
    
    #convertimos de nuevo en sf pues era sfc
    islas_principales<-st_sf(islas_principales)
      class(islas_principales)
## [1] "sf"         "data.frame"
      # añadimos el area
      islas_principales$area<-area
    
    #pintamos los mapas
      tm_shape(islas_principales) +
            tm_fill("area") +tm_borders()

    #almacenamos un mapa de canarias
        cana<-tm_shape(canarias) +
            tm_fill() +tm_borders()
    # calculamos un buffer de as islas
    mar<-st_union(canarias) %>% st_buffer(0.1) #%>% st_cast(to = "LINESTRING")
    # Pinto esto junto     
    cana + tm_shape(mar) + tm_borders(col="blue",lty = 2) 

Juntar varios mapas

Una opcion interesante es que se pueden juntar mapas, por ejemplo acercar Canarias para que no salga tanto mar:

  #seleciono too menos canarias
      peninsula<-auton1 %>% select(COD_CCAA,NOM_CCAA)%>% filter(COD_CCAA!="04")
  # creo un mapa de la peninsula etc..
      pen_map<-tm_shape(peninsula)+tm_polygons() + 
                  tm_layout(title = "España", frame = TRUE, bg.color = "lightblue")
  # creo un mapa de Canarias    
      canarias_map<-tm_shape(canarias) +
          tm_fill() +tm_borders()+
          tm_layout(title = "Canarias", frame = TRUE, bg.color = "lightblue")#+
          #tm_scale_bar(breaks = c(0, 50, 200), size = 1)
  
  # junto los dos    
      pen_map
      print(canarias_map, vp = grid::viewport(0.75, 0.12, width = 0.25, height = 0.18))

Modo interactivo

Otra opcion es el modo interactivo que se activa con tmap_mode(), o la función qtm() que simula el funcionamiento d qplot.

  # cambiamos el modo
    tmap_mode("view")
  # pintamos
    tm_basemap("Stamen.Watercolor") +
    tm_shape(islas_principales) +tm_fill("area",alpha = 0.5,palette = "YlOrBr")+ 
    tm_tiles("Stamen.TonerLabels")
  # volvemos a estatico
    tmap_mode("plot")
  # con la llamada qtm
    qtm(islas_principales,"area",fill.pallete = "RdYlGn")