Capítulo 11 Elaboración de mapas

11.1 Mapas con rworldmap

Comenzaremos haciendo un mapa en rworldmap. Utilizaremos un dataset con datos mundiales disponible en R.

library(rworldmap)
data(countryExData)

Creamos un objeto combinando nuestro dataset con el mapa. Haremos el cruce por dos campos diferentes para comprobar cual funciona mejor. En primer lugar, por el nombre del país. El argumento verbose nos devuelve los errores detectados.

p1 <- rworldmap::joinCountryData2Map(countryExData,
                         joinCode = "NAME",
                         nameJoinColumn = "Country",
                         verbose = TRUE)
## 145 codes from your data successfully matched countries in the map
## 4 codes from your data failed to match with a country code in the map
##      failedCodes failedCountries    
## [1,] NA          "Dem. Rep. Congo"  
## [2,] NA          "Czech Rep."       
## [3,] NA          "Dominican Rep."   
## [4,] NA          "Trinidad & Tobago"
## 98 codes from the map weren't represented in your data

En segundo lugar, haremos el cruce por el campo ISO3.

p2 <- rworldmap::joinCountryData2Map(countryExData,
                          joinCode = "ISO3",
                          nameJoinColumn = "ISO3V10",
                          verbose = TRUE)
## 149 codes from your data successfully matched countries in the map
## 0 codes from your data failed to match with a country code in the map
##      failedCodes failedCountries
## 94 codes from the map weren't represented in your data

Dado que la segunda estrategia ha funcionado mejor, será éste el objeto que utilizaremos para crear un mapamudi con información de la densidad de población por países.

mapa <- rworldmap::mapCountryData(p2, nameColumnToPlot="density")

Veamos algunos argumentos adicionales.

mapa2 <- rworldmap::mapCountryData(p2, nameColumnToPlot="density",
                        catMethod=c(0,20,40,60,80,100), #Igualar la franjas de la leyenda
                        mapTitle = "Densidad de población", # Título del grafico
                        oceanCol='lightblue', # Océanos en color azul
                        missingCountryCol='white') # Países sin datos en blanco

Representaremos ahora los países con más de 150 millones de habitantes. En primer lugar, consultamos qué países son.

alta_poblacion <- countryExData[countryExData$Population2005 > 150000, ]
alta_poblacion$Country
## [1] "Brazil"        "China"         "Indonesia"     "India"        
## [5] "Pakistan"      NA              "United States"

Hacemos el mapa.

mapa3 <- rworldmap::mapCountryData(p2, nameColumnToPlot="Population2005",
                        catMethod = c(150000, 2000000),
                        addLegend=FALSE)

Otra forma de hacer el mismo mapa.

p4 <- rworldmap::joinCountryData2Map(alta_poblacion,
                          joinCode = "ISO3",
                          nameJoinColumn = "ISO3V10")
## 6 codes from your data successfully matched countries in the map
## 1 codes from your data failed to match with a country code in the map
## 237 codes from the map weren't represented in your data
mapa4 <- mapCountryData(p4, nameColumnToPlot="Population2005")

Zoom sobre Europa

mapa_europa <- rworldmap::mapCountryData(p2, nameColumnToPlot="Population2005",
                              mapRegion = "Europe",
                              addLegend = FALSE)
rworldmap::labelCountries(mapa_europa, col = "black")

11.2 Mapas con ggplot

En el capítulo sobre gráficos utilizamos el paquete ggplot. Veremos ahora como emplearlo para crear gráficos. A continuación veremos un mapa del mundo o la situación de algunos países.

library(tidyverse) # tidyverse contiene el paquete ggplot
ggplot() + borders("world")

ggplot() + borders("world", c("spain", "portugal", "france", "italy", "greece"))

Ahora ubicaremos en el mapa algunas ciudades mediante sus coordenadas geográficas

ciudades <- read.table("ciudades.txt", header = TRUE, sep = "\t")
head(ciudades, 5)
##      ciudad      lat      lon
## 1    Madrid 40.41650 -3.70256
## 2 Barcelona 41.38879  2.15899
## 3  Valencia 39.46975 -0.37739
## 4  Zaragoza 41.65606 -0.87734
## 5    Murcia 37.98704 -1.13004
ggplot() + borders("world", "spain", fill = "white") +
  geom_point(data = ciudades, aes(x = lon, y = lat)) +
  geom_text(data = ciudades, aes(x = lon, y = lat, label = ciudad))

11.3 Mapa de comunidades autónomas

Necesitaremos los paquetes rgdal y broom, así como los datos geográficos de las comunidades autónomas, que se pueden descargar desde: https://www.arcgis.com/home/item.html?id=5f689357238847bc823a2fb164544a77

library(rgdal)
library(broom)

A continuación trabajamos con los datos del fichero SHP

shapefile_ccaa <- rgdal::readOGR("Comunidades_Autonomas_ETRS89_30N.shp") # Leemos los datos
## OGR data source with driver: ESRI Shapefile 
## Source: "C:\Users\borrego\OneDrive - Universitat de Barcelona\Ciencia_datos\Comunidades_Autonomas_ETRS89_30N.shp", layer: "Comunidades_Autonomas_ETRS89_30N"
## with 19 features
## It has 3 fields
data_ccaa <- broom::tidy(shapefile_ccaa) # Los convertimos en un dataframe


ggplot(data_ccaa, aes(x= long, y = lat, group = group)) + # Hacemos el mapa
  geom_polygon(fill = "violetred4", color = "white") +
  theme_minimal() +
  theme(axis.line = element_blank(),
        axis.text = element_blank(),
        axis.title = element_blank(),
        axis.ticks = element_blank())

En la página web del Instituto Nacional de Estadística (https://www.ine.es/prensa/eb_2018.pdf) hemos obtenido la cifra de bibliotecas por Comunidad Autónoma. Importamos los datos y los representamos gráficamente.

biblios <- read.table("bibliotecas.txt", header = TRUE, sep = "\t")
biblios$id <- as.character(biblios$id)
bibliotecas_grafico <- data_ccaa %>%
  left_join(biblios, by= "id")
graf1 <- ggplot(bibliotecas_grafico, aes(x = long, y = lat, group = group)) +
  geom_polygon(aes(fill=Bibliotecas), color= "white", size = 0.2) +
  scale_fill_distiller(palette = "Blues", direction = 1) +
  labs( title = "Bibliotecas públicas por Comunidades Autónomas",
        subtitle = "Unidades: Número de bibliotecas",
        caption = "Fuente: INE",
        fill = "Bibliotecas públicas") +
  theme_minimal() +
  theme(axis.line = element_blank(),
        axis.text = element_blank(),
        axis.title = element_blank(),
        axis.ticks = element_blank())
graf1

Podemos hacer el gráfico interactivo con plotly.

library(plotly)
graf1_int <- ggplotly(graf1)
graf1_int

Repetiremos el gráfico sin los datos de las Islas Canarias para que quede centrado en la península.

bibliotecas_grafico_sc <- bibliotecas_grafico[bibliotecas_grafico$id != 4, ]

graf_sc <- ggplot(bibliotecas_grafico_sc, aes(x = long, y = lat, group = group)) +
  geom_polygon(aes(fill=Bibliotecas), color= "white", size = 0.2) +
  scale_fill_distiller(palette = "Blues", direction = 1) +
  labs( title = "Bibliotecas públicas por Comunidades Autónomas",
        subtitle = "Unidades: Número de bibliotecas",
        caption = "Fuente: INE",
        fill = "Bibliotecas públicas") +
  theme_minimal() +
  theme(axis.line = element_blank(),
        axis.text = element_blank(),
        axis.title = element_blank(),
        axis.ticks = element_blank())

graf_sc_int <- ggplotly(graf_sc)

graf_sc_int

11.4 Ejercicio 11

Elige 10 ciudades europeas y sitúalas en un mapa generado con ggplot.

De manera opcional, puedes intentar replicar con R el siguiente mapa que muestra las cifras de asistencia al cine por comunidades autónomas en 2019 (extraído de https://bit.ly/3td73H4, p. 18). En el Campus Virtual tienes un fichero con los datos en el que he dividido los 106.000 espectadores de Ceuta y Melilla a partes iguales entre ambas ciudades.

Espectadores de cine

Figure 11.1: Espectadores de cine