Nomenclaturas de las Unidades Territoriales Estadísticas (NUTS)
Las Nomenclaturas de las Unidades Territoriales Estadísticas (NUTS por sus siglas en Francés) son el conjunto de demarcaciones territoriales de la Unión Europea creada por Eurostat que se utiliza con fines estadísticos y analíticos. Su establecimiento se basa, en principio, en función de las unidades administrativas que operan en cada uno de los Estados miembros. Es decir, las regiones geográficas se basan en las entidades con autoridades administrativas en cada uno de los países que conforman la región Euro. Los niveles NUTS en los que se divide cada uno de dichas unidades administrativas dependen, principalmente, de ciertos límites mínimos y máximos de población.
La actual clasificación NUTS, válida desde 2018, se enumera en 104 regiones en NUTS-1, 281 regiones en NUTS-2 y 1348 regiones en NUTS 3. En España, por ejemplo, el NUTS-1 corresponde a grupos de regiones (17), el NUTS-2 se configura en torno a las Comunidades Autónomas y Ciudades Autónomas (19) y el NUTS-3 se compone de las Provincias, Consejos Insulares y Cabildos (59). Se puede consultar las regiones NUTS de cada país en el siguiente enlace de Eurostat.
A efectos prácticos utilizaremos la función get_eurostat_geospatial()
para descargar la información geográfica de Gisco, el organismo responsable de generar y actualizar la información geográfica de la Comisión Europea. El paquete get_eurostat_geospatial()
descarga tres tipos de información: sf, spdf y df, como veremos en los siguientes subapartados.
Antes de empezar la exposición cargamos algunos paquetes que utilizaremos a lo largo del post.
library(eurostat)
library(tidyverse)
library(sf)
library(DT)
library(cowplot)
library(RColorBrewer)
Simple feature (sf)
Como se expone aquí, simple feature o simple feature access hace referencia al International Organization for Standarization (ISO 19125) que describe y especifica cómo los objetos en el mundo real pueden ser representados en las computadoras, con especial énfasis a los objetos espaciales geométricos. Por tanto, definen un modelo común de geometrías de dos dimensiones que se utilizan en los sistemas de información geográfica.
Por consiguiente, para realizar mapas base a cada uno de los niveles NUTS podemos obtener en primer lugar el sf con la función get_eurostat_geospatial()
y representar el mapa al nivel deseado utilizando los siguientes comandos:
NUTS-0
# NUTS-0
mapdata_0 <- get_eurostat_geospatial(nuts_level = 0)
head(mapdata_0)
## Simple feature collection with 6 features and 7 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: 2.54601 ymin: 34.56908 xmax: 34.56859 ymax: 51.50246
## geographic CRS: WGS 84
## id CNTR_CODE NUTS_NAME
## 1 BG BG <U+0411><U+042A><U+041B><U+0413><U+0410><U+0420><U+0418><U+042F>
## 2 CH CH SCHWEIZ/SUISSE/SVIZZERA
## 3 CY CY <U+039A><U+03A5><U+03A0><U+03A1><U+039F>S
## 4 AL AL SHQIPËRIA
## 5 CZ CZ CESKÁ REPUBLIKA
## 6 BE BE BELGIQUE-BELGIË
## LEVL_CODE FID NUTS_ID geometry geo
## 1 0 BG BG MULTIPOLYGON (((22.99717 43... BG
## 2 0 CH CH MULTIPOLYGON (((8.61383 47.... CH
## 3 0 CY CY MULTIPOLYGON (((33.75237 34... CY
## 4 0 AL AL MULTIPOLYGON (((19.831 42.4... AL
## 5 0 CZ CZ MULTIPOLYGON (((14.49122 51... CZ
## 6 0 BE BE MULTIPOLYGON (((5.10218 51.... BE
mapdata_0 %>%
ggplot(., aes()) +
geom_sf(fill="purple", color="white", size = 0.1) +
theme_minimal() +
xlim(c(-30, 44)) +
ylim(c(35, 75)) +
ggtitle("NUTS-0")
NUTS-1
# NUTS-1
mapdata_1 <- get_eurostat_geospatial(nuts_level = 1)
head(mapdata_1)
## Simple feature collection with 6 features and 7 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: 2.84672 ymin: 39.64579 xmax: 21.05607 ymax: 50.91189
## geographic CRS: WGS 84
## id CNTR_CODE NUTS_NAME
## 1 AL0 AL SHQIPËRIA
## 2 AT1 AT OSTÖSTERREICH
## 3 AT2 AT SÜDÖSTERREICH
## 4 BE1 BE RÉGION DE BRUXELLES-CAPITALE/BRUSSELS HOOFDSTEDELIJK GEWEST
## 5 BE3 BE RÉGION WALLONNE
## 6 AT3 AT WESTÖSTERREICH
## LEVL_CODE FID NUTS_ID geometry geo
## 1 1 AL0 AL0 MULTIPOLYGON (((19.831 42.4... AL0
## 2 1 AT1 AT1 MULTIPOLYGON (((15.54245 48... AT1
## 3 1 AT2 AT2 MULTIPOLYGON (((15.84791 47... AT2
## 4 1 BE1 BE1 MULTIPOLYGON (((4.47678 50.... BE1
## 5 1 BE3 BE3 MULTIPOLYGON (((5.682 50.75... BE3
## 6 1 AT3 AT3 MULTIPOLYGON (((14.69101 48... AT3
mapdata_1 %>%
ggplot(., aes()) +
geom_sf(fill="purple", color="white", size = 0.1) +
theme_minimal() +
xlim(c(-30, 44)) +
ylim(c(35, 75)) +
ggtitle("NUTS-1")
NUTS-2
# NUTS-2
mapdata_2 <- get_eurostat_geospatial(nuts_level = 2)
head(mapdata_2)
## Simple feature collection with 6 features and 7 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: 7.09629 ymin: 46.29368 xmax: 20.10688 ymax: 61.08726
## geographic CRS: WGS 84
## id CNTR_CODE NUTS_NAME LEVL_CODE FID NUTS_ID
## 1 DE24 DE Oberfranken 2 DE24 DE24
## 2 NO03 NO Sør-Østlandet 2 NO03 NO03
## 3 HU11 HU Budapest 2 HU11 HU11
## 4 HU12 HU Pest 2 HU12 HU12
## 5 HU21 HU Közép-Dunántúl 2 HU21 HU21
## 6 HU22 HU Nyugat-Dunántúl 2 HU22 HU22
## geometry geo
## 1 MULTIPOLYGON (((11.48157 50... DE24
## 2 MULTIPOLYGON (((10.60072 60... NO03
## 3 MULTIPOLYGON (((18.93274 47... HU11
## 4 MULTIPOLYGON (((18.96591 47... HU12
## 5 MULTIPOLYGON (((18.68843 47... HU21
## 6 MULTIPOLYGON (((17.24743 48... HU22
mapdata_2 %>%
ggplot(., aes()) +
geom_sf(fill="purple", color="white", size = 0.1) +
theme_minimal() +
xlim(c(-30, 44)) +
ylim(c(35, 75)) +
ggtitle("NUTS-2")
NUTS-3
# NUTS-3
mapdata_3 <- get_eurostat_geospatial(nuts_level = 3)
head(mapdata_3)
## Simple feature collection with 6 features and 7 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: 2.3948 ymin: 39.02837 xmax: 22.2582 ymax: 60.65644
## geographic CRS: WGS 84
## id CNTR_CODE
## 1 FRK23 FR
## 2 FRK24 FR
## 3 AT313 AT
## 4 FI200 FI
## 5 FR102 FR
## 6 EL611 EL
## NUTS_NAME
## 1 Drôme
## 2 Isère
## 3 Mühlviertel
## 4 Åland
## 5 Seine-et-Marne
## 6 <U+039A>a<U+03C1>d<U+03AF>tsa, <U+03A4><U+03C1><U+03AF><U+03BA>a<U+03BB>a
## LEVL_CODE FID NUTS_ID geometry geo
## 1 3 FRK23 FRK23 MULTIPOLYGON (((5.67604 44.... FRK23
## 2 3 FRK24 FRK24 MULTIPOLYGON (((5.10107 45.... FRK24
## 3 3 AT313 AT313 MULTIPOLYGON (((13.72709 48... AT313
## 4 3 FI200 FI200 MULTIPOLYGON (((19.94374 60... FI200
## 5 3 FR102 FR102 MULTIPOLYGON (((2.59053 49.... FR102
## 6 3 EL611 EL611 MULTIPOLYGON (((21.91769 39... EL611
mapdata_3 %>%
ggplot(., aes()) +
geom_sf(fill="purple", color="white", size = 0.1) +
theme_minimal() +
xlim(c(-30, 44)) +
ylim(c(35, 75)) +
ggtitle("NUTS-3")
TODOS LOS NIVELES NUTS
# ALL NUTS
mapdata_all <- get_eurostat_geospatial(nuts_level = "all", resolution = 60)
head(mapdata_all)
## Simple feature collection with 6 features and 7 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: 2.54601 ymin: 34.56908 xmax: 34.56859 ymax: 51.50246
## geographic CRS: WGS 84
## id CNTR_CODE NUTS_NAME
## 1 BG BG <U+0411><U+042A><U+041B><U+0413><U+0410><U+0420><U+0418><U+042F>
## 2 CH CH SCHWEIZ/SUISSE/SVIZZERA
## 3 CY CY <U+039A><U+03A5><U+03A0><U+03A1><U+039F>S
## 4 AL AL SHQIPËRIA
## 5 CZ CZ CESKÁ REPUBLIKA
## 6 BE BE BELGIQUE-BELGIË
## LEVL_CODE FID NUTS_ID geometry geo
## 1 0 BG BG MULTIPOLYGON (((22.99717 43... BG
## 2 0 CH CH MULTIPOLYGON (((8.61383 47.... CH
## 3 0 CY CY MULTIPOLYGON (((33.75237 34... CY
## 4 0 AL AL MULTIPOLYGON (((19.831 42.4... AL
## 5 0 CZ CZ MULTIPOLYGON (((14.49122 51... CZ
## 6 0 BE BE MULTIPOLYGON (((5.10218 51.... BE
mapdata_all %>%
mutate(LEVL_CODE_2 = recode_factor(LEVL_CODE,
`0`= "NUTS-0",
`1`= "NUTS-1",
`2`= "NUTS-2",
`3`= "NUTS-3" )) %>%
ggplot(., aes()) +
geom_sf(fill="purple", color="white", size = 0.1) +
theme_minimal() +
xlim(c(-30, 44)) +
ylim(c(35, 75)) +
facet_wrap(~LEVL_CODE_2) +
ggtitle("Unidades Territoriales Estadísticas (NUTS)")
Spatial Polygon Dataframe (spdf)
En segundo lugar podemos descargar un Spatial Polygon Dataframe (spdf) utilizando el paquete {sf}, donde encontramos la información geográfica de todos los NUTS levels (0-3). De nuevo utilizamos la función get_eurostat_geospatial()
y las funciones características de {tidyverse} y {ggplot2} para modificar el spdf y para seleccionar el nivel NUTS deseado.
# El Spatial Polygon Dataframe:
mapdata_spdf <- get_eurostat_geospatial(output_class = "spdf", resolution = 60)
NUTS-0
# NUTS 0
mapdata_spdf[mapdata_spdf$LEVL_CODE == 0,] %>%
ggplot(., aes(x=long,y=lat,group=group)) +
geom_polygon(fill="violetred4", color="white") +
theme_minimal()+
xlim(c(-30, 44)) +
ylim(c(35, 75)) +
ggtitle("NUTS-0")
NUTS-1
# NUTS 1
mapdata_spdf[mapdata_spdf$LEVL_CODE == 1,] %>%
ggplot(., aes(x=long,y=lat,group=group)) +
geom_polygon(fill="violetred4", color="white") +
theme_minimal()+
xlim(c(-30, 44)) +
ylim(c(35, 75)) +
ggtitle("NUTS-1")
NUTS-2
# NUTS 2
mapdata_spdf[mapdata_spdf$LEVL_CODE == 2,] %>%
ggplot(., aes(x=long,y=lat,group=group)) +
geom_polygon(fill="violetred4", color="white") +
theme_minimal()+
xlim(c(-30, 44)) +
ylim(c(35, 75))+
ggtitle("NUTS-2")
NUTS-3
# NUTS 3
mapdata_spdf[mapdata_spdf$LEVL_CODE == 3,] %>%
ggplot(., aes(x=long,y=lat,group=group)) +
geom_polygon(fill="violetred4", color="white") +
theme_minimal()+
xlim(c(-30, 44)) +
ylim(c(35, 75))+
ggtitle("NUTS-3")
TODOS LOS NIVELES NUTS
Para representar los cuatro niveles de forma conjunta, y con la única intención de mostrar la funcionalidad de otro paquete de R, vamos a cambiar de procedimiento y utilizamos el paquete {cowflow} y su función plot_grid()
. Para ello descargaremos los cuatro niveles NUTS por separado, guardamos cada uno de los gráficos de forma individualizada y utilizamos el paquete y la función mencionada para representar conjuntamente los cuatro gráficos.
mapdata_psdf_0 <- get_eurostat_geospatial(output_class = "spdf", nuts_level= 0, resolution = 60)
mapdata_psdf_1 <- get_eurostat_geospatial(output_class = "spdf", nuts_level= 1, resolution = 60)
mapdata_psdf_2 <- get_eurostat_geospatial(output_class = "spdf", nuts_level= 2, resolution = 60)
mapdata_psdf_3 <- get_eurostat_geospatial(output_class = "spdf", nuts_level= 3, resolution = 60)
nuts_0 <- mapdata_psdf_0 %>%
ggplot(., aes(x=long,y=lat,group=group)) +
geom_polygon(fill="tomato1", color="white", size = 0.1) +
theme_minimal()+
xlim(c(-30, 44)) +
ylim(c(35, 75))
nuts_1 <- mapdata_psdf_1 %>%
ggplot(., aes(x=long,y=lat,group=group)) +
geom_polygon(fill="tomato2", color="white", size = 0.1) +
theme_minimal()+
xlim(c(-30, 44)) +
ylim(c(35, 75))
nuts_2 <- mapdata_psdf_2 %>%
ggplot(., aes(x=long,y=lat,group=group)) +
geom_polygon(fill="tomato3", color="white", size = 0.1) +
theme_minimal()+
xlim(c(-30, 44)) +
ylim(c(35, 75))
nuts_3 <- mapdata_psdf_3 %>%
ggplot(., aes(x=long,y=lat,group=group)) +
geom_polygon(fill="tomato4", color="white", size = 0.1) +
theme_minimal()+
xlim(c(-30, 44)) +
ylim(c(35, 75))
plot_grid(nuts_0, nuts_1, nuts_2, nuts_3,
labels= c("NUTS-0","NUTS-1","NUTS-2","NUTS-3"),
label_size = 12)
Dataframe (df)
Una tercera posibilidad consiste en descargar con la función get_eurostat_geospatial()
un dataframe donde viene recopilada la información de todos los niveles de NUTS conjuntamente.
# Guardamos el dataframe con resolución 60
mapdata_df <- get_eurostat_geospatial(output_class = "df", resolution = 60)
head(mapdata_df)
## # A tibble: 6 x 13
## long lat order hole piece group id CNTR_CODE NUTS_NAME LEVL_CODE FID
## <dbl> <dbl> <int> <lgl> <fct> <fct> <chr> <chr> <chr> <int> <chr>
## 1 23.0 43.8 1 FALSE 1 1.1 1 BG <U+0411><U+042A><U+041B><U+0413><U+0410><U+0420><U+0418><U+042F> 0 BG
## 2 23.1 43.8 2 FALSE 1 1.1 1 BG <U+0411><U+042A><U+041B><U+0413><U+0410><U+0420><U+0418><U+042F> 0 BG
## 3 23.1 43.8 3 FALSE 1 1.1 1 BG <U+0411><U+042A><U+041B><U+0413><U+0410><U+0420><U+0418><U+042F> 0 BG
## 4 23.2 43.8 4 FALSE 1 1.1 1 BG <U+0411><U+042A><U+041B><U+0413><U+0410><U+0420><U+0418><U+042F> 0 BG
## 5 23.3 43.8 5 FALSE 1 1.1 1 BG <U+0411><U+042A><U+041B><U+0413><U+0410><U+0420><U+0418><U+042F> 0 BG
## 6 23.3 43.8 6 FALSE 1 1.1 1 BG <U+0411><U+042A><U+041B><U+0413><U+0410><U+0420><U+0418><U+042F> 0 BG
## # ... with 2 more variables: NUTS_ID <chr>, geo <chr>
Podemos guardar un dataframe específico para cada nivel de NUTS. Utilizando el paquete {ggplot2} tal y como se ha utilizado en los ejemplos anteriores podemos realizar los diferentes mapas de Europa. En este caso, para evitar ser excesivamente repetitivos, únicamente vamos a representar el mapa conjunto utilizando la función facet_wrap()
.
# NUTS-0
mapdata_df_0 <- mapdata_df %>%
filter(LEVL_CODE == 0)
# NUTS-1
mapdata_df_1 <- mapdata_df %>%
filter(LEVL_CODE == 1)
# NUTS-2
mapdata_df_2 <- mapdata_df %>%
filter(LEVL_CODE == 2)
# NUTS-3
mapdata_df_3 <- mapdata_df %>%
filter(LEVL_CODE == 3)
# Usando la función facet_wrap() podemos visualizar los cuatro niveles de forma conjunta
mapdata_df %>%
mutate(LEVL_CODE_2 = recode_factor(LEVL_CODE, `0`= "NUTS-0", `1`= "NUTS-1", `2`= "NUTS-2", `3`= "NUTS-3" )) %>%
ggplot(., aes(x=long,y=lat, group=group)) +
geom_polygon(fill="orange", color="white", size = 0.1) +
theme_minimal() +
xlim(c(-30, 44)) +
ylim(c(35, 75)) +
facet_wrap(~LEVL_CODE_2) +
ggtitle("Unidades Territoriales Estadísticas (NUTS)")
Mapas nacionales de las Unidades Territoriales Estadísticas (NUTS)
Podemos sustraer los códigos identificativos de cada país presentes en el dataframe utilizando la función unique()
y, a partir de ahí, seleccionar los distintos niveles NUTS para examinar sus particularidades en los países de la Unión Europea. Veamos unos ejemplos examinando algunos países elegidos al azar:
unique(mapdata_df$CNTR_CODE)
## [1] "BG" "CH" "CY" "AL" "CZ" "BE" "AT" "DE" "DK" "EE" "EL" "ES" "FI" "HR" "FR"
## [16] "HU" "IE" "IS" "IT" "LI" "LT" "LU" "LV" "ME" "MK" "MT" "NL" "NO" "PL" "PT"
## [31] "RO" "RS" "SE" "SI" "SK" "TR" "UK"
España
spain <- mapdata_df %>%
mutate(LEVL_CODE_2 = recode_factor(LEVL_CODE,
`0`= "NUTS-0",
`1`= "NUTS-1",
`2`= "NUTS-2",
`3`= "NUTS-3" )) %>%
filter(grepl("ES", NUTS_ID))
ggplot(spain, aes(x=long, y=lat, group=group)) +
facet_wrap(~LEVL_CODE_2) +
geom_polygon(fill="orange", color="white", size = 0.2) +
theme_minimal() +
ggtitle("España")
Italia
italy <- mapdata_df %>%
mutate(LEVL_CODE_2 = recode_factor(LEVL_CODE,
`0`= "NUTS-0",
`1`= "NUTS-1",
`2`= "NUTS-2",
`3`= "NUTS-3" )) %>%
filter(grepl("IT", NUTS_ID))
ggplot(italy, aes(x=long, y=lat, group=group)) +
facet_wrap(~LEVL_CODE_2) +
geom_polygon(fill="orange", color="white", size = 0.2) +
theme_minimal()+
ggtitle("Italia")
Francia
france <- mapdata_df %>%
mutate(LEVL_CODE_2 = recode_factor(LEVL_CODE,
`0`= "NUTS-0",
`1`= "NUTS-1",
`2`= "NUTS-2",
`3`= "NUTS-3" )) %>%
filter(grepl("FR", NUTS_ID))
ggplot(france, aes(x=long, y=lat, group=group)) +
facet_wrap(~LEVL_CODE_2) +
geom_polygon(fill="orange", color="white", size = 0.2) +
xlim(c(-8, 12)) +
ylim(c(40, 53)) +
theme_minimal()+
ggtitle("Francia")
Alemania
germany <- mapdata_df %>%
mutate(LEVL_CODE_2 = recode_factor(LEVL_CODE,
`0`= "NUTS-0",
`1`= "NUTS-1",
`2`= "NUTS-2",
`3`= "NUTS-3" )) %>%
filter(grepl("DE", NUTS_ID))
ggplot(germany, aes(x=long, y=lat, group=group)) +
facet_wrap(~LEVL_CODE_2) +
geom_polygon(fill="orange", color="white", size = 0.2) +
theme_minimal()+
ggtitle("Alemania")
Reino Unido
unitedkingdom <- mapdata_df %>%
mutate(LEVL_CODE_2 = recode_factor(LEVL_CODE,
`0`= "NUTS-0",
`1`= "NUTS-1",
`2`= "NUTS-2",
`3`= "NUTS-3" )) %>%
filter(grepl("UK", NUTS_ID))
ggplot(unitedkingdom, aes(x = long, y=lat, group = group)) +
facet_wrap(~LEVL_CODE_2) +
geom_polygon(fill="orange", color="white", size = 0.2) +
theme_minimal()+
ggtitle("Reino Unido")
Aplicación práctica utilizando datos de Eurostat
NUTS-0. Ratio de Mortalidad Infantil
En primer lugar vamos a representar en un mapa el ratio de mortalidad infantil en el año 2017 por países (NUTS 0). En Eurostat este ratio (infant mortality rate) indica el número de muertes de bebés menores de 1 año por cada mil nacimientos. Para ello, lo primero que hacemos es buscar en la base de datos de Eurostat indicando la palabra “mortality” y, una vez seleccionado el dataframe que nos interesa, lo descargamos y guardamos como inf_mort_rate
.
# Buscamos el dataset
mortality <- search_eurostat(pattern = "mortality",
type = "table")
mortality %>%
select(title, code)
## # A tibble: 4 x 2
## title code
## <chr> <chr>
## 1 Infant mortality rate tps00027
## 2 Standardised preventable and treatable mortality sdg_03_~
## 3 Standardised preventable and treatable mortality sdg_03_~
## 4 Assessed fish stocks exceeding fishing mortality at maximum sustaina~ sdg_14_~
# Descargamos el dataset "Infant mortality rate" utilizando el id (tps00027)
inf_mort_rate <- get_eurostat(id= "tps00027", time_format = "num")
head(inf_mort_rate)
## # A tibble: 6 x 5
## unit indic_de geo time values
## <fct> <fct> <fct> <dbl> <dbl>
## 1 RT INFMORRT AD 2007 2.4
## 2 RT INFMORRT AL 2007 6.2
## 3 RT INFMORRT AM 2007 10.8
## 4 RT INFMORRT AT 2007 3.7
## 5 RT INFMORRT AZ 2007 11.6
## 6 RT INFMORRT BA 2007 6.8
Los códigos que identifican los países incluidos en el mapa base previamente realizado son los siguientes:
country_codes <- unique(mapdata_0$NUTS_ID)
country_codes
## [1] "BG" "CH" "CY" "AL" "CZ" "BE" "AT" "DE" "DK" "EE" "EL" "ES" "FI" "HR" "FR"
## [16] "HU" "IE" "IS" "IT" "LI" "LT" "LU" "LV" "ME" "MK" "MT" "NL" "NO" "PL" "PT"
## [31] "RO" "RS" "SE" "SI" "SK" "TR" "UK"
Realizamos una serie de modificaciones al dataframe inf_mort_rate
para seleccionar el año 2017 e identificar las regiones que debemos incluir en nuestro mapa.
inf_mort_2017 <- inf_mort_rate %>%
filter( time == "2017") %>%
filter(geo %in% country_codes )
Unimos los dos dataframes en uno que denominamos inf_mort_2017_mapa
y seleccionamos el número de rangos en los que queremos clasificar los ratios de mortalidad infantil (en este caso determinamos 10 categorías).
inf_mort_2017_mapa <- mapdata_0 %>%
right_join(inf_mort_2017) %>%
mutate(cat = cut_to_classes(values, n=10, decimals = 1))
Y finalmente graficamos:
ggplot(inf_mort_2017_mapa, aes(fill=cat)) +
geom_sf(color = alpha("white", 1/2), alpha= .9) +
xlim(c(-20, 44)) +
ylim(c(35, 70)) +
labs(title = "Ratio de Mortalidad Infantil (%), 2017",
subtitle = "Núm de muertes infantiles (menores de 1 año) por cada mil nacidos vivos",
caption = "Fuente: Eurostat",
fill= "") +
theme_minimal() +
theme(
axis.line = element_blank(),
axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank(),
plot.background = element_rect(fill = "snow", color = NA),
panel.background = element_rect(fill= "snow", color = NA),
plot.title = element_text(size = 16, hjust = 0.5),
plot.subtitle = element_text(size = 10, hjust = 0.5),
plot.caption = element_text(size = 8, hjust = 1),
legend.title = element_text(color = "grey40", size = 8),
legend.text = element_text(color = "grey40", size = 7, hjust = 0),
legend.position = c(0.93, 0.6),
plot.margin = unit(c(0.5,2,0.5,1), "cm")) +
scale_fill_brewer(palette= "Spectral")
NUTS-2. Jóvenes que ni estudian ni trabajan
En el segundo ejemplo vamos a tratar de representar en un mapa de Europa (NUTS-2) el ratio de jóvenes que no se encuentraban trabajando ni cursando algún tipo de formación en el año 2016. Eurostat denomina a este ratio como el NEET rate (Youth not in employment, education or training).
De nuevo buscamos y descargamos la información directamente de Eurostat al igual que hicimos en el ejemplo anterior. En este caso el id que vamos a utilizar es edat_lfse_22
.
neet <- get_eurostat(id= "edat_lfse_22", time_format = "num")
neet_label <- label_eurostat(neet, fix_duplicated = T)
Conviene examinar las variables del dataframe y las categorías que comprende dicho dataframe:
label_eurostat_vars(names(neet))
## [1] "Sex" "Age class"
## [3] "Training" "Activity and employment status"
## [5] "Unit of measure" "Geopolitical entity (reporting)"
## [7] "Period of time"
levels(neet$sex)
## [1] "F" "M" "T"
levels(neet$age)
## [1] "Y15-24" "Y18-24"
levels(neet$training)
## [1] "NO_FE_NO_NFE"
levels(neet$wstatus)
## [1] "NEMP"
levels(neet$unit)
## [1] "PC"
Seleccionamos los códigos regionales del mapa base que mostramos en apartados previos con el objetivo de, posteriormente, seleccionar dichos valores del dataset neet
obtenido de Eurostat.
regions_codes <- unique(mapdata_df_2$geo)
Posteriormente realizamos algunas modificaciones sobre el dataset para identificar el año, ambos sexos y el rango de edad que vamos a tener en consideración: 15-24 años. Además, seleccionamos los valores que se corresponden a las regiones presentes en el mapa base utilizando los códigos identificados previamente.
neet_total_2016 <- neet %>%
filter(sex == "T",
age == "Y15-24",
time == 2016,
geo %in% regions_codes) %>%
select(geo, values)
Unimos los dataset y aplicamos un conjunto de rangos atendiendo a los valores. En este caso identificamos de nuevo 10 rangos para su posterior representación gráfica.
neet_total_map <- mapdata_df_2 %>%
right_join(neet_total_2016) %>%
mutate(cat = cut_to_classes(values, n=10, decimals=1))
Utilizamos básicamente los colores de la paleta denominada “Spectral”. No obstante, sobre los colores de dicha paleta realizamos alguna sencilla modificación con el objetivo de incluir en nuestra selección un color gris para indicar las regiones europeas donde no tenemos información disponible.
La función brewer.pal()
del paquete RColorBrewer
nos permite identificar los colores que componen la paleta en questión y la función display.brewer.pal()
nos permite visualizar dichos colores. De esta forma podemos identificar los colores que queremos conservar y los colores que nos interesa añadir en nuestra selección de colores final.
brewer.pal(11, "Spectral")
## [1] "#9E0142" "#D53E4F" "#F46D43" "#FDAE61" "#FEE08B" "#FFFFBF" "#E6F598"
## [8] "#ABDDA4" "#66C2A5" "#3288BD" "#5E4FA2"
display.brewer.pal(11, "Spectral")
colores <- c("grey60", "#5E4FA2", "#3288BD", "#66C2A5", "#ABDDA4", "#FFFFBF", "#FEE08B","#FDAE61", "#F46D43","#D53E4F", "#9E0142")
Y graficamos indicando los colores seleccionados con la función scale_fill_manual()
.
ggplot(neet_total_map, aes(x= long, y=lat, group= group)) +
geom_polygon(aes(fill = cat),
color = "white",
alpha= .9,
size = 0.05) +
xlim(c(-24, 44)) +
ylim(c(35, 72)) +
labs(title = "Young people (15-24 Yrs) neither in employment nor in education/training \n(NEET rate in 2016)",
subtitle = "NUTS-2 regions",
caption = "Fuente: Eurostat",
fill= "") +
theme_minimal() +
theme(
axis.line = element_blank(),
axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank(),
plot.background = element_rect(fill = "snow", color = NA),
panel.background = element_rect(fill= "snow", color = NA),
plot.title = element_text(size = 13, hjust = 0.5),
plot.subtitle = element_text(size = 10, hjust = 0.5),
plot.caption = element_text(size = 8, hjust = 1),
legend.title = element_text(color = "grey40", size = 8),
legend.text = element_text(color = "grey40", size = 7, hjust = 0),
legend.position = c(0.93, 0.6),
plot.margin = unit(c(0.5,2,0.5,1), "cm")) +
scale_fill_manual(values= colores)
NUTS-3. Edad promedio de las madres en el nacimiento
Para terminar vamos a exponer un ejemplo de mapa a nivel NUT-3. En esta ocasión vamos a representar gráficamente la edad promedio (media) de las madres en los nacimientos. Para ello seguimos un procedimiento similar al seguido en el apartado anterior.
En primer lugar buscamos y descargamos la información que se ajusta a nuestro interés.
fertility <- get_eurostat(id= "demo_r_find3", time_format = "num")
fertility_label <- label_eurostat(fertility, fix_duplicated = T)
Examinamos las variables del dataset y las categorías en las que se estructura el mismo.
label_eurostat_vars(names(fertility))
## [1] "Demographic indicator" "Unit of measure"
## [3] "Geopolitical entity (reporting)" "Period of time"
levels(fertility$indic_de)
## [1] "AGEMOTH" "MEDAGEMOTH" "TOTFERRT"
levels(fertility_label$indic_de)
## [1] "Mean age of women at childbirth" "Median age of women at childbirth"
## [3] "Total fertility rate"
Seleccionamos el código de las regiones en función al mapa base realizado previamente.
regions_3_codes <- unique(mapdata_df_3$geo)
Manipulamos el dataframe para seleccionar únicamente el año de interés, en este caso el año 2017, y la categoría que nos interesa: la edad media de las madres.
fertility_total_2017 <- fertility %>%
filter(time == 2017,
indic_de == "AGEMOTH",
geo %in% regions_3_codes) %>%
select(geo, values)
Unimos los datasets en uno que nos servirá para realizar nuestro mapa final.
fertility_total_map <- mapdata_df_3 %>%
right_join(fertility_total_2017) %>%
mutate(cat = cut_to_classes(values, n=8, decimals=1))
Seleccionamos los colores que vamos a utilizar para los rangos de valores. En este caso hemos establecido 8 rangos y, consecuentemente, seleccionamos 8 colores.
colores_2 <- c("#5E4FA2", "#3288BD", "#66C2A5", "#ABDDA4","#FDAE61", "#F46D43","#D53E4F", "#9E0142")
Realizamos el gráfico final
ggplot(fertility_total_map, aes(x= long, y=lat, group= group)) +
geom_polygon(aes(fill = cat),
color = "white",
size = 0.005) +
xlim(c(-24, 44)) +
ylim(c(35, 72)) +
labs(title = "Edad media de las madres en el nacimiento, 2017",
subtitle = "NUTS-3 regions",
caption = "Fuente: Eurostat",
fill= "") +
theme_minimal() +
theme(
axis.line = element_blank(),
axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank(),
plot.background = element_rect(fill = "snow", color = NA),
panel.background = element_rect(fill= "snow", color = NA),
plot.title = element_text(size = 13, hjust = 0.5),
plot.subtitle = element_text(size = 10, hjust = 0.5),
plot.caption = element_text(size = 8, hjust = 1),
legend.title = element_text(color = "grey40", size = 8),
legend.text = element_text(color = "grey40", size = 7, hjust = 0),
legend.position = c(0.93, 0.6),
plot.margin = unit(c(0.5,2,0.5,1), "cm")) +
scale_fill_manual(values= colores_2)