Los datos de la población de México fueron adquiridos a partir del idbr package for R, que permite el acceso a indicadores demográficos del United States Census: International Database (IDB) y descargarlos en formato de datasets en R. En el caso de México, los datos de población están disponibles desde 1980 a 2100 (proyectado).
if(!require('pacman')) install.packages('pacman')
pacman::p_load(idbr, tidyverse, animation, kableExtra)
- pacman: Cargar todas las librerias a la vez
- tidyverse: Preparar el dataframe (tidyr), manipular el dataframe (dplyr, stringr), crear graficos (ggplot2)
- animation: Animación de los graficos en formato GIF
- kableExtra: Crear tablas visualmente atractivas
La API Key puede ser obtenida del US Census Bureau en http://api.census.gov/data/key_signup.html.
idb_api_key("Inserta la API Key")
Solicitar los datos de población de México por genero, desde el año 1980 al año 2100, de acuerdo a la publicación de la IDB.
# Datos de la poblacion masculina.
Hombres <- idb1('Mexico', 1980:2100, sex = 'male') %>%
mutate(POP = POP * -1, SEX = 'Hombres')
# Datos de la población femenina.
Mujeres <- idb1('Mexico', 1980:2100, sex = 'female') %>%
mutate(SEX = 'Mujeres')
Por último, crear un data frame con ambos resultados.
mexico_pop <- rbind(Hombres, Mujeres) %>%
mutate(abs_pop = abs(POP))
# Guardar el data frame en formato csv.
write.csv(mexico_pop, 'Mexico-Population-1980-2100.csv')
# Revisión de las dimesiones del dataframe
dim(mexico_pop)
## [1] 24442 8
Lo anterior nos muestran las carcteristicas del dataframe: 24442 registros y 9 atributos. A continuación se muestran los primeros 6 registros, con la finalidad de observar cuál es el estado de los datos despues de la aplicación de dplyr.
kable(head(mexico_pop)) %>%
kable_styling(bootstrap_options = 'striped', font_size = 12, full_width = FALSE)
AGE | AREA_KM2 | NAME | POP | FIPS | time | SEX | abs_pop |
---|---|---|---|---|---|---|---|
0 | 1943945 | Mexico | -1137819 | MX | 1980 | Hombres | 1137819 |
1 | 1943945 | Mexico | -1111649 | MX | 1980 | Hombres | 1111649 |
2 | 1943945 | Mexico | -1102493 | MX | 1980 | Hombres | 1102493 |
3 | 1943945 | Mexico | -1098743 | MX | 1980 | Hombres | 1098743 |
4 | 1943945 | Mexico | -1095436 | MX | 1980 | Hombres | 1095436 |
5 | 1943945 | Mexico | -1088913 | MX | 1980 | Hombres | 1088913 |
# Comienzo de la creación del GIF
saveGIF({
# Crear un bucle de acuerdo al rango de los datos (1980:2100)
for (i in 1980:2100) {
title <- as.character(i)
year_data <- filter(mexico_pop, time == i)
# Crear el grafico con ggplot
Pyramid_Mex <- ggplot(year_data, aes(x = AGE, y = POP, fill = SEX, width = 1)) +
coord_fixed() +
coord_flip() +
# Constucción de los gráficos de barras para hombres y mujeres
geom_bar(data = subset(year_data, SEX == "Mujeres"), stat = "identity") +
geom_bar(data = subset(year_data, SEX == "Hombres"), stat = "identity") +
# Modificar el eje Y del gráfico d acuerdo a los datos del dataframe
scale_y_continuous(breaks = seq(-1400000, 1400000, 200000),
labels = paste0(as.character(c(seq(1.4, 0, -0.2), c(seq(0.2, 1.4,0.2)))), "m"),
limits = c(min(mexico$POP), max(mexico$POP))) +
scale_fill_manual(values = c('#4682b4', '#ee7989')) +
# Tema del grafico (Estilo 1)
theme(
plot.background = element_rect(fill = "#232227", colour = "#232227"),
axis.ticks = element_blank(),
axis.title.y = element_blank(),
legend.title = element_blank(),
panel.background = element_rect("#111111", colour = 'white'),
panel.border = element_blank(),
strip.background = element_blank(),
strip.text.x = element_blank(),
panel.grid.minor = element_blank(),
panel.grid.major = element_blank(),
axis.text = element_text(size = 14, color = 'white'),
legend.key.size = unit(0.75, 'cm'),
legend.text = element_text(
size = 16,
face = 'bold',
color = 'white'
),
plot.title = element_text(
size = 22,
hjust = 0.5,
face = 'bold',
color = 'white'
),
plot.subtitle = element_text(
size = 22,
hjust = 0.5,
face = 'bold',
color = 'white'
),
axis.title.x = element_text(
size = 16,
face = 'bold',
color = 'white'
),
plot.caption = element_text(
size = 15,
hjust = 0.5,
face = 'italic',
color = 'white'
)
) +
# Agregar títulos y subtítulos al gráfico y a los ejes
labs(
title = 'Estructura de la población de México 1980 - 2100\n',
subtitle = title,
y = '\nPoblación',
caption = '\nFuente: US Census Bureau IDB; idbr R package'
) +
# Adecuar el recuadro de leyenda al tema
theme(legend.position = "bottom", legend.title = element_blank(),
legend.background = element_rect(fill = "#232227")) +
guides(fill = guide_legend(reverse = TRUE))
print(Pyramid_Mex)
}
# Gyardar el gráfico con formato con extensión GIF
}, movie.name = 'mexico-pyramid-style1.gif', interval = 0.2, ani.width = 800, ani.height = 700)
Si se desea aplicar el estilo 2, utilizar el siguiente tema
# Tema del gráfico (Estilo 2)
theme(
plot.background = element_blank(),
axis.ticks = element_blank(),
axis.title.y = element_blank(),
legend.title = element_blank(),
panel.background = element_blank(),
panel.border = element_blank(),
strip.background = element_blank(),
strip.text.x = element_blank(),
panel.grid.minor = element_blank(),
panel.grid.major = element_blank(),
axis.text = element_text(size = 14, color = 'black'),
legend.key.size = unit(0.75, 'cm'),
legend.text = element_text(
size = 16,
face = 'bold',
color = 'black'
),
plot.title = element_text(
size = 22,
hjust = 0.5,
face = 'bold',
color = 'black'
),
plot.subtitle = element_text(
size = 22,
hjust = 0.5,
face = 'bold',
color = 'black'
),
axis.title.x = element_text(
size = 16,
face = 'bold',
color = 'black'
),
plot.caption = element_text(
size = 15,
hjust = 0.5,
face = 'italic',
color = 'gray'
)
)
# Cambiar la sección del recuadro de leyenda por la siguiente
theme(legend.position = "bottom", legend.title = element_blank(),
legend.background = element_blank())