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.
<- rworldmap::joinCountryData2Map(countryExData,
p1 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.
<- rworldmap::joinCountryData2Map(countryExData,
p2 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.
<- rworldmap::mapCountryData(p2, nameColumnToPlot="density") mapa
Veamos algunos argumentos adicionales.
<- rworldmap::mapCountryData(p2, nameColumnToPlot="density",
mapa2 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.
<- countryExData[countryExData$Population2005 > 150000, ]
alta_poblacion $Country alta_poblacion
## [1] "Brazil" "China" "Indonesia" "India"
## [5] "Pakistan" NA "United States"
Hacemos el mapa.
<- rworldmap::mapCountryData(p2, nameColumnToPlot="Population2005",
mapa3 catMethod = c(150000, 2000000),
addLegend=FALSE)
Otra forma de hacer el mismo mapa.
<- rworldmap::joinCountryData2Map(alta_poblacion,
p4 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
<- mapCountryData(p4, nameColumnToPlot="Population2005") mapa4
Zoom sobre Europa
<- rworldmap::mapCountryData(p2, nameColumnToPlot="Population2005",
mapa_europa mapRegion = "Europe",
addLegend = FALSE)
::labelCountries(mapa_europa, col = "black") rworldmap
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
<- read.table("ciudades.txt", header = TRUE, sep = "\t")
ciudades 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
<- rgdal::readOGR("Comunidades_Autonomas_ETRS89_30N.shp") # Leemos los datos shapefile_ccaa
## 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
<- broom::tidy(shapefile_ccaa) # Los convertimos en un dataframe
data_ccaa
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.
<- read.table("bibliotecas.txt", header = TRUE, sep = "\t")
biblios $id <- as.character(biblios$id)
biblios<- data_ccaa %>%
bibliotecas_grafico left_join(biblios, by= "id")
<- ggplot(bibliotecas_grafico, aes(x = long, y = lat, group = group)) +
graf1 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)
<- ggplotly(graf1)
graf1_int graf1_int
Repetiremos el gráfico sin los datos de las Islas Canarias para que quede centrado en la península.
<- bibliotecas_grafico[bibliotecas_grafico$id != 4, ]
bibliotecas_grafico_sc
<- ggplot(bibliotecas_grafico_sc, aes(x = long, y = lat, group = group)) +
graf_sc 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())
<- ggplotly(graf_sc)
graf_sc_int
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.

Figure 11.1: Espectadores de cine