¿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}

visualización de datos
solicitantes de protección
ggplot2
gráfico de áreas apiladas
Alemania
Author

Juan Armando Torres Munguía

Published

August 1, 2025

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)
Personas solicitando protección, por estatus, 2007 a 2024
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 showtext

Citation

BibTeX citation:
@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}
}
For attribution, please cite this work as:
Torres Munguía, Juan Armando. 2025. “¿Cómo Ha Cambiado a Lo Largo Del Tiempo El Número de Personas Solicitando Protección En Alemania?” August 1, 2025. https://juan-torresmunguia.netlify.app/blog/posts-es/germany-persons-seeking-protection-stacked-area-chart.