¿Cómo ha cambiado a lo largo del tiempo el número de personas solicitando protección en Alemania?
Un gráfico de áreas apiladas con {ggplot2}
Descripción general
En Alemania, al 31 de diciembre de 2024, según el Registro Central de Extranjeros, más de 14 millones de los 83.6 millones de habitantes son extranjeros.
Es importante señalar que alrededor de 3.3 millones llegaron al país en busca de protección. Esta cifra es aproximadamente 78% mayor que la reportada en 2020, y 343% más que hace 10 años.
Una herramienta eficaz para analizar estos datos son los gráficos de áreas apiladas, que permiten visualizar la evolución de la variable de interés, personas que solicitan protección en este caso, desagregándola por categorías. En esta publicación, crearé un gráfico de áreas apiladas con esta información utilizando {ggplot2} en R.
Sobre los datos
Los datos son producidos por el Registro Central de Extranjeros y presentados por la Oficina Federal de Estadística (Destatis) en su sitio web, en la tabla Persons seeking protection, by protection status, 2007 to 2024. Descargué esta información y la guardé en un archivo de Excel llamado persons-seeking-protection-germany.xlsx.
Preparación
Primero, cargo los paquetes necesarios:
Carga de datos
Descargué la tabla Persons seeking protection, by protection status, 2007 to 2024 y la guardé en un archivo de Excel llamado persons-seeking-protection-germany.xlsx.
seeking_protection <- read_excel("persons-seeking-protection-germany.xlsx")La tabla se ve así:
seeking_protection |>
kbl(
caption = "Personas solicitando protección, por estatus, 2007 a 2024"
) |>
kable_paper("hover", full_width = F)| Reference date | Population | Foreign population | Persons seeking protection | unsettled | recognised | temporary | permanent | refused |
|---|---|---|---|---|---|---|---|---|
| 31 December 2007 | 82217837 | 6744880 | 457430 | 20145 | 301995 | 164350 | 137650 | 135290 |
| 31 December 2008 | 82002356 | 6727620 | 456050 | 18930 | 330365 | 150795 | 179570 | 106755 |
| 31 December 2009 | 81802257 | 6694775 | 477595 | 24620 | 361775 | 158735 | 203040 | 91195 |
| 31 December 2010 | 81751602 | 6753620 | 503470 | 35835 | 382325 | 168205 | 214115 | 85310 |
| 31 December 2011 | 80327900 | 6930895 | 505925 | 47130 | 373875 | 151045 | 222825 | 84920 |
| 31 December 2012 | 80523746 | 7213710 | 549825 | 65920 | 399050 | 165610 | 233440 | 84860 |
| 31 December 2013 | 80767463 | 7633630 | 613925 | 110335 | 410570 | 174110 | 236460 | 93020 |
| 31 December 2014 | 81197537 | 8152970 | 746320 | 177900 | 460140 | 208460 | 251675 | 108280 |
| 31 December 2015 | 82175684 | 9107895 | 1036235 | 349810 | 547935 | 285805 | 262130 | 138495 |
| 31 December 2016 | 82521653 | 10039080 | 1597570 | 574945 | 867500 | 599235 | 268265 | 155120 |
| 31 December 2017 | 82792351 | 10623940 | 1680700 | 348640 | 1154365 | 888355 | 266010 | 177700 |
| 31 December 2018 | 83019214 | 10915455 | 1781750 | 306095 | 1283225 | 1017760 | 265465 | 192430 |
| 31 December 2019 | 83166711 | 11228300 | 1839115 | 266470 | 1360070 | 1090475 | 269590 | 212575 |
| 31 December 2020 | 83155031 | 11432460 | 1856785 | 215960 | 1397685 | 1116970 | 280715 | 243140 |
| 31 December 2021 | 83237124 | 11817790 | 1936350 | 238945 | 1451375 | 1133545 | 317835 | 246030 |
| 31 December 2022 | 83118501 | 13383910 | 3078650 | 570060 | 2253875 | 1916630 | 337245 | 254710 |
| 31 December 2023 | 83456045 | 13895865 | 3173135 | 454795 | 2528935 | 2188665 | 340275 | 189405 |
| 31 December 2024 | 83577140 | 14061640 | 3304705 | 427415 | 2706320 | 2377115 | 329205 | 170970 |
Diseño del gráfico de áreas apiladas
Antes de graficar, transformo los datos y renombro algunas columnas para facilitar su uso en {ggplot2}..
seeking_protection <- seeking_protection |>
# Extraigo el año de la fecha de referencia
mutate(year = year(dmy(`Reference date`))) |>
# Solo selecciono las variables de interés
select(year, unsettled, temporary, permanent, refused) |>
# Reestructuración de los datos a formato largo
pivot_longer(!year,
names_to = "status",
values_to = "persons")FA continuación, defino un tema para el gráfico y establezco la tipografía “Josefin Sans” con el paquete showtextMás opciones disponibles en https://fonts.google.com/.
font_add_google("Josefin Sans", "Josefin Sans")
showtext_auto()
theme_stacked_chart <- function() {
theme_minimal(
base_family = "Josefin Sans"
) +
# Ajustes personalizados
theme(
# Configuración de títulos
plot.title.position = "plot",
plot.title = element_textbox(
color = "#800000",
face = "bold",
size = 20,
margin = margin(5, 0, 15, 0),
hjust = 0,
halign = 0 ),
plot.subtitle = element_textbox(
color = "#767676",
size = 18,
margin = margin(5, 0, 35, 0),
hjust = 0,
halign = 0
),
# Configuración de ejes
axis.line = element_line(
size = 1.1,
colour = "#800000"
),
axis.title.y = element_text(
color = "#800000",
face = "bold",
size = 16
),
axis.text.y = element_text(
color = "#800000",
face = "bold",
size = 13
),
axis.title.x = element_blank(),
axis.text.x = element_text(
color = "#800000",
face = "bold",
size = 13
),
# Configuración de la leyenda
legend.position.inside = c(0.15, 0.80),
legend.title = element_text(
color = "#800000",
face = "bold",
size = 14
),
legend.text = element_text(
color = "#800000",
size = 13
),
# Configuración del pie de figura
plot.caption = element_text(
color = "#800000",
face = "italic",
size = 14,
hjust = 0,
margin = margin(20, 0, 5, 0),
),
plot.background = element_rect(
color = "#D6D6CE",
fill = "#D6D6CE"
),
plot.margin = margin(40, 40, 40, 40)
)
}El gráfico se crea con el siguiente código:
seeking_protection <- seeking_protection |>
mutate(status = str_to_title(status))
ggplot(seeking_protection,
aes(
x = year,
y = persons,
fill = status,
color = status
)
) +
geom_area() +
guides(fill = guide_legend(title = "Estatus de protección",
position = "inside"),
color = guide_legend(title = "Estatus de protección",
position = "inside")
) +
scale_fill_manual(
values = c("Unsettled"= "#767676",
"Temporary"= "#CC8214",
"Refused" = "#8A9045",
"Permanent" = "#155F83"
)
) +
scale_color_manual(
values = c("Unsettled"= "#767676",
"Temporary"= "#CC8214",
"Refused" = "#8A9045",
"Permanent" = "#155F83"
)
) +
scale_y_continuous(
labels = label_number(
scale = 1e-6
)
) +
scale_x_continuous(
expand = c(0, 0),
limits = c(2006.5, 2024.5),
breaks = seq(2007, 2024, by = 1)
) +
labs(
title = "Personas solicitando protección en Alemania por estatus | 2007-2024",
y = "Número de personas \n(en millones)",
caption = "Fuente: Registro Central de Extranjeros. \nDiseño: Juan Torres Munguía."
) +
theme_stacked_chart() showtext_opts(dpi = 320)
ggsave(
"stacked-area-germany-seeking-protection.png",
dpi = 320,
width = 12,
height = 9,
units = "in"
)
showtext_auto(FALSE) # Desactiva la funcionalidad de showtextCitation
@online{torres munguía2025,
author = {Torres Munguía, Juan Armando},
title = {¿Cómo Ha Cambiado a Lo Largo Del Tiempo El Número de Personas
Solicitando Protección En {Alemania?}},
date = {2025-08-01},
url = {https://juan-torresmunguia.netlify.app/blog/posts-es/germany-persons-seeking-protection-stacked-area-chart},
langid = {en}
}
