Las librerías utilzadas son las siguientes:

library(ggplot2)
library(gridExtra)
library(ggthemes)
library(scales)
library(dplyr)
library(readr)
library(reshape2)
library(DT)
library(extrafont)
library(utf8)
library(kableExtra)

Introducción

Prox.

Datos del INE 2002-2019

El 11 de diciembre de 2019 el INE publicó los datos demográficos de España - Nota de prensa, acceso general a datos.

Se puede leer en el enlace anterior el alcance de estas estadísticas:

Por tanto, en primera aproximación, nos quedamos con las series semestrales desde 2002, que podrías encontrar aquí (digo podrías porque tiene pinta de ser un enlace poco permanente -la web del INE es más bien del siglo pasado y terminarán pudiendo invertir en su modernización). En cualquier caso, se aceptan como buenos, no he visto inconsistencias y a partir de ellos está generada la tabla que voy a utilizar, y que podéis consultar en este gist. Incluye los datos totales de población por procedencia.

Lectura de datos

Se trata de una tabla con 35 filas correspondientes a los sondeos semestrales desde el 1 de enero de 2002 al 1 de enero de 2019, 1 columna de fechas y 10 con los datos totales y desglosados por origen.

Total, españoles y extranjeros.

inm2k2_19 <- as.data.frame(read.csv("INM2002-2019.csv", encoding = "UTF-8", header = TRUE))

## Datos de población total

total_ciud <- inm2k2_19$Total

total_es <- inm2k2_19$España

total_ex <- inm2k2_19$Total - inm2k2_19$España

total <- as.data.frame(ts(cbind(total_ciud, total_es, total_ex)))

## Generar secuencia de fechas (1 cada seis meses, tal cual los datos)

ts <- seq.Date(from = as.Date("2002-01-01"), to = as.Date("2019-01-01"), by="6 month")

total[,"date"] <- ts

colnames(total) <- c("Total", "Españoles", "Extranjeros", "Fecha")

save(total,file = "total.Rda")
datatable(total)

Extranjeros por origen.

Para simplificar un poco la tabla se han unido los datos de Centro América y Caribe con los de Sudamérica, y los de Asia con Oceanía.

inm2k2_19 <- as.data.frame(read.csv("INM2002-2019.csv", encoding = "UTF-8", header = TRUE))



## Datos de población extranjera por regiones de procedencia

total_UE <- inm2k2_19$UE

total_RE <- inm2k2_19$Resto.de.Europa

total_AF <- inm2k2_19$África

total_AN <- inm2k2_19$América.del.Norte

total_CySA <- inm2k2_19$Centro.América.y.Caribe + inm2k2_19$Sudamérica # por simplificar 

total_AyO <- inm2k2_19$Asia + inm2k2_19$Oceanía

totalext <- as.data.frame(ts(cbind(total_UE, total_RE, total_AF, total_AN, total_CySA, total_AyO)))

## Generar secuencia de fechas (1 cada seis meses, tal cual los datos)

ts <- seq.Date(from = as.Date("2002-01-01"), to = as.Date("2019-01-01"), by = "6 month")

totalext[,"date"] <- ts

colnames(totalext) <- c("UE", "Resto.de.Europa", "África", "América.del.Norte", "Centro.y.Sudamérica", "Asia.y.Oceanía", "Fecha")

save(totalext,file = "totalext.Rda")
datatable(totalext)

Gráficos generales

A partir de los datos anteriores (gist), veamos como ha evolucionado la población en España entre 2002 y 2019.

### Cifras totales

load("total.Rda")

# Usamos unidades en millones - dividimos por 1000000

total$Total <- total$Total/1000000
total$Españoles <- total$Españoles/1000000
total$Extranjeros <- total$Extranjeros/1000000

ggtot <- ggplot(data = total) +
  geom_line(aes(x = Fecha, y = Total),
            size = 1.5,
            color = "#048a8f",
            alpha = 0.6) +
  # geom_text(aes(x = as.Date("2010-06-07"), y = 48, label = "Total", color = "gray")) + 
  geom_label(x = as.Date("2010-06-07"), y = 44, label = "Total", color = "#048a8f") +
  geom_line(aes(x = Fecha, y = Españoles),
            size = 1.5,
            color = "#c90a5a",
            alpha = 0.6) +
  # geom_text(aes(x = as.Date("2010-06-07"), y = 42, label = "Españoles", color = "gray")) +
  geom_label(x = as.Date("2010-06-07"), y = 37, label = "Españoles", color = "#c90a5a") +
  geom_line(aes(x = Fecha, y = Extranjeros),
            size = 1.5,
            color = "#06d117",
            alpha = 0.6) +
  # geom_text(aes(x = as.Date("2010-06-07"), y = 9, label = "Extranjeros", color = "gray")) +
  geom_label(x = as.Date("2010-06-07"), y = 9, label = "Extranjeros", color = "#06d117") +
  labs(x = "", 
       y = "Ciudadanos - millones",
       title = "Evolución de la población española",
       subtitle = "2002 - 2019",
       caption = "@scienceisbeauty"
       ) +
  theme_solarized() +
  theme(
    legend.position = "none",
    panel.background = element_rect(fill = "grey75",
                                colour = "grey75",
                                size = 0.3, linetype = "solid"),
    plot.background = element_rect(fill = "azure3")
  )
print(ggtot)

### Sólo extranjeros

ggex <- ggplot(data = total) +
  geom_line(aes(x = Fecha, y = Extranjeros),
            size = 1.2,
            color = "#06d117",
            alpha = 0.6) +
  scale_y_continuous(sec.axis = sec_axis(~.*100/(max(total$Total)), name = "%")) +
  labs(x = "", 
       y = "Extranjeros - millones",
       title = "Evolución del número y porcentaje de extranjeros en España",
       subtitle = "2002 - 2019",
       caption = "@scienceisbeauty"
  ) +
  theme_solarized() +
  theme(
  panel.background = element_rect(fill = "grey75",
                                colour = "grey75",
                                size = 0.3, linetype = "solid"),
  plot.background = element_rect(fill = "azure3"),
  )

print(ggex)

###

load("totalext.Rda")

# Usamos unidades en miles - dividimos por 1000

totalext$UE <- totalext$UE/1000 #Unión Europea
totalext$Resto.de.Europa <- totalext$Resto.de.Europa/1000 #Resto de Europa
totalext$África <- totalext$África/1000 # África
totalext$América.del.Norte <- totalext$América.del.Norte/1000 # Norteamérica
totalext$Centro.y.Sudamérica <- totalext$Centro.y.Sudamérica/1000 # Centro y Sudamérica
totalext$Asia.y.Oceanía <- totalext$Asia.y.Oceanía/1000 # Centro y Sudamérica

# Se usa reshape2 (`melt`) que resulta más versatil para representar múltiples series.

totalext_rs = melt(totalext, id=c("Fecha"))

ggexprors <- ggplot(totalext_rs) +
  
  geom_line(aes(x = Fecha, y = value, colour = variable), size = 1.2) +
  
  # Procedencias
  # "UE" = "#300ce8","Resto.de.Europa" = "#1daecf", "África" = "#ff1a05",
  # "América.del.Norte" = "#5d4dab","Centro.y.Sudamérica" = "#04c21a",
  # "Asia.y.Oceanía" = "#ffdd00"
  
  scale_colour_manual(values = c("#300ce8","#1daecf","#ff1a05","#5d4dab","#04c21a","#ffdd00")) +
  labs(x = "", 
       y = "Extranjeros - miles",
       title = "Evolución del número de extranjeros en España por procedencia",
       subtitle = "2002 - 2019",
       caption = "@scienceisbeauty",
       fill= ''
  ) +
  theme_solarized() +
  theme(
  panel.background = element_rect(fill = "grey75",
                                colour = "grey75",
                                size = 0.3, linetype = "solid"),
  plot.background = element_rect(fill = "azure3"),
  legend.background = element_rect(fill = "transparent", colour = NA),
  legend.key = element_rect(fill = "grey90"),
  legend.title = element_blank()
  )
print(ggexprors)


Datos por provincias

Próximamente. No se si utilizaré las opciones que ofrece R (sin salir de ggplot2 y sf), o si pasarme a QGIS, o a una mezcla de los dos.