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_intRepetiremos 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_int11.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