Pirâmide Etária

Caio VAOS

2024


Pacotes

library(tidyr)
library(dplyr)
library(ggplot2)
library(ggpol)
library(gganimate)

Base de dados

# Carregando
pop_2000_2010 <- readxl::read_xlsx("DF`s/tabela1552-piramide.xlsx",
                                   skip = 6,
                                   col_names = c("code_state", "local", "idade", "sexo", "pop_2000", "pop_2010"),
                                   n_max = 3192)|>
  fill(code_state, local, idade) |> 
  mutate(idade = factor(idade, levels = unique(idade)))
pop_2022 <- readxl::read_xlsx("DF`s/tabela9514.xlsx",
                              skip = 5,
                              col_names = c("code_state", "local", "idade", "sexo", "pop_2022"),
                              n_max = 1848)|>
  fill(code_state, local, idade)
# Agrupando 80-48, 85-89, 90-94, 95-99
pop_2000_2010 <- pop_2000_2010 |> 
  mutate(idade = case_when(
    idade == "80 anos" ~ "80 a 84 anos",
    idade == "81 anos" ~ "80 a 84 anos",
    idade == "82 anos" ~ "80 a 84 anos",
    idade == "83 anos" ~ "80 a 84 anos",
    idade == "84 anos" ~ "80 a 84 anos",
    idade == "85 anos" ~ "85 a 89 anos",
    idade == "86 anos" ~ "85 a 89 anos",
    idade == "87 anos" ~ "85 a 89 anos",
    idade == "88 anos" ~ "85 a 89 anos",
    idade == "89 anos" ~ "85 a 89 anos",
    idade == "90 anos" ~ "90 a 94 anos",
    idade == "91 anos" ~ "90 a 94 anos",
    idade == "92 anos" ~ "90 a 94 anos",
    idade == "93 anos" ~ "90 a 94 anos",
    idade == "94 anos" ~ "90 a 94 anos",
    idade == "95 anos" ~ "95 a 99 anos",
    idade == "96 anos" ~ "95 a 99 anos",
    idade == "97 anos" ~ "95 a 99 anos",
    idade == "98 anos" ~ "95 a 99 anos",
    idade == "99 anos" ~ "95 a 99 anos",
    TRUE ~ idade )) |> 
  group_by(code_state, local, idade, sexo) |> 
  summarise(pop_2000 = sum(pop_2000),
            pop_2010 = sum(pop_2010), .groups = "drop") |> 
  mutate(local = factor(local, levels = unique(pop_2022$local)),
         idade = factor(idade, levels = unique(pop_2022$idade)),
         sexo = factor(sexo, levels = c("Total", "Homem", "Mulher"))) |> 
  arrange(local,idade, sexo)
# Juntando/Organizando
DF_PIRAMIDE_ETARIA_1 <- cbind(pop_2000_2010,pop_2022[,"pop_2022"]) |> 
  filter(local == "Brasil",
         idade != "Total",
         sexo != "Total")
idade_rotulada <- c("0-4","5-9","10-14","15-19","20-24","25-29","30-34","35-39","40-44","45-49","50-54",
                    "55-59","60-64","65-69","70-74","75-79","80-84","85-89","90-94","95-99","100+")
DF_PIRAMIDE_ETARIA_1$idade_rotulada <- rep(c(rep(idade_rotulada, each=2)), length.out= nrow(DF_PIRAMIDE_ETARIA_1)) |> 
  factor(levels = idade_rotulada)
DF_PIRAMIDE_ETARIA_2 <- DF_PIRAMIDE_ETARIA_1 |> 
  pivot_longer(cols = 5:7,
               names_to = "ano",
               values_to = "pop") |> 
  mutate(ano = case_when(
    ano == "pop_2000" ~ 2000,
    ano == "pop_2010" ~ 2010,
    ano == "pop_2022" ~ 2022))

DF_PIRAMIDE_ETARIA_1

## # A tibble: 6 × 8
##   code_state local  idade        sexo  pop_2000 pop_2010 pop_2022 idade_rotulada
##   <chr>      <fct>  <fct>        <fct>    <dbl>    <dbl>    <dbl> <fct>         
## 1 1          Brasil 0 a 4 anos   Homem  8326926  7016987  6461689 0-4           
## 2 1          Brasil 0 a 4 anos   Mulh…  8048802  6779171  6243171 0-4           
## 3 1          Brasil 5 a 9 anos   Homem  8402353  7624144  7011282 5-9           
## 4 1          Brasil 5 a 9 anos   Mulh…  8139974  7345231  6738158 5-9           
## 5 1          Brasil 10 a 14 anos Homem  8777639  8725413  6992746 10-14         
## 6 1          Brasil 10 a 14 anos Mulh…  8570428  8441348  6682215 10-14

DF_PIRAMIDE_ETARIA_2

## # A tibble: 6 × 7
##   code_state local  idade      sexo   idade_rotulada   ano     pop
##   <chr>      <fct>  <fct>      <fct>  <fct>          <dbl>   <dbl>
## 1 1          Brasil 0 a 4 anos Homem  0-4             2000 8326926
## 2 1          Brasil 0 a 4 anos Homem  0-4             2010 7016987
## 3 1          Brasil 0 a 4 anos Homem  0-4             2022 6461689
## 4 1          Brasil 0 a 4 anos Mulher 0-4             2000 8048802
## 5 1          Brasil 0 a 4 anos Mulher 0-4             2010 6779171
## 6 1          Brasil 0 a 4 anos Mulher 0-4             2022 6243171

Plot

2000
ggplot(DF_PIRAMIDE_ETARIA_1)+
  geom_col(aes(x= ifelse(sexo == "Homem", -pop_2000, pop_2000), y= idade_rotulada, fill=sexo), width = 0.7)+
  geom_text(aes(x= ifelse(sexo == "Homem", -pop_2000, pop_2000)*1.08, y= idade_rotulada, label=pop_2000),
            size = 2, col = "gray40")+
  ggpol::facet_share(~sexo, scales = "free_x")+
  scale_fill_manual(values = c("Homem" = "#A2D2FF", "Mulher" = "#FFAFCC"))+
  scale_x_continuous(breaks = c(-8000000, -6000000, -4000000, -2000000, 0, 
                                2000000, 4000000, 6000000, 8000000),
                     labels = c(8, 6, 4, 2, 0, 2, 4, 6, 8))+
  labs(title ="Pirâmide Etária Brasil 2000",
       x = "População (milhões)", y = "",
       fill= "", caption = "Fonte: IBGE - Censo 2000")+
  theme_classic()+
  theme(plot.title = element_text(hjust = 0.5),
        strip.background = element_blank(),
        strip.text = element_text(face = 'bold'),
        legend.position = 'none',
        plot.caption = element_text(hjust = 0, size = 7),
        axis.line.x = element_blank(),
        axis.ticks.x = element_blank(),
        panel.grid.major.x = element_line("gray70"))


2010
ggplot(DF_PIRAMIDE_ETARIA_1)+
  geom_col(aes(x= ifelse(sexo == "Homem", -pop_2010, pop_2010), y= idade_rotulada, fill=sexo), width = 0.7)+
  geom_text(aes(x= ifelse(sexo == "Homem", -pop_2010, pop_2010)*1.08, y= idade_rotulada, label=pop_2010),
            size = 2, col = "gray40")+
  ggpol::facet_share(~sexo, scales = "free_x")+
  scale_fill_manual(values = c("Homem" = "#A2D2FF", "Mulher" = "#FFAFCC"))+
  scale_x_continuous(breaks = c(-8000000, -6000000, -4000000, -2000000, 0, 
                                2000000, 4000000, 6000000, 8000000),
                     labels = c(8, 6, 4, 2, 0, 2, 4, 6, 8))+
  labs(title ="Pirâmide Etária Brasil 2010",
       x = "População (milhões)", y = "",
       fill= "", caption = "Fonte: IBGE - Censo 2010")+
  theme_classic()+
  theme(plot.title = element_text(hjust = 0.5),
        strip.background = element_blank(),
        strip.text = element_text(face = 'bold'),
        legend.position = 'none',
        plot.caption = element_text(hjust = 0, size = 7),
        axis.line.x = element_blank(),
        axis.ticks.x = element_blank(),
        panel.grid.major.x = element_line("gray70"))


2022
ggplot(DF_PIRAMIDE_ETARIA_1)+
  geom_col(aes(x= ifelse(sexo == "Homem", -pop_2022, pop_2022), y= idade_rotulada, fill=sexo), width = 0.7)+
  geom_text(aes(x= ifelse(sexo == "Homem", -pop_2022, pop_2022)*1.08, y= idade_rotulada, label=pop_2022),
            size = 2, col = "gray40")+
  ggpol::facet_share(~sexo, scales = "free_x")+
  scale_fill_manual(values = c("Homem" = "#A2D2FF", "Mulher" = "#FFAFCC"))+
  scale_x_continuous(breaks = c(-8000000, -6000000, -4000000, -2000000, 0, 
                                2000000, 4000000, 6000000, 8000000),
                     labels = c(8, 6, 4, 2, 0, 2, 4, 6, 8))+
  labs(title ="Pirâmide Etária Brasil 2022",
       x = "População (milhões)", y = "",
       fill= "", caption = "Fonte: IBGE - Censo 2022")+
  theme_classic()+
  theme(plot.title = element_text(hjust = 0.5),
        strip.background = element_blank(),
        strip.text = element_text(face = 'bold'),
        legend.position = 'none',
        plot.caption = element_text(hjust = 0, size = 7),
        axis.line.x = element_blank(),
        axis.ticks.x = element_blank(),
        panel.grid.major.x = element_line("gray70"))


Animação

piramide_animada <- ggplot(DF_PIRAMIDE_ETARIA_2)+
  geom_col(aes(x= ifelse(sexo == "Homem", -pop, pop), y= idade_rotulada, fill=sexo), width = 0.7)+
  ggpol::facet_share(~sexo, scales = "free_x")+
  scale_fill_manual(values = c("Homem" = "#A2D2FF", "Mulher" = "#FFAFCC"))+
  scale_x_continuous(breaks = c(-8000000, -6000000, -4000000, -2000000, 0, 
                                2000000, 4000000, 6000000, 8000000),
                     labels = c(8, 6, 4, 2, 0, 2, 4, 6, 8))+
  labs(title ="Pirâmide Etária Brasil {closest_state}",
       x = "População (milhões)", y = "",
       fill= "", caption = "Fonte: IBGE - Censo 2000, 2010 e 2022")+
  theme_classic()+
  theme(plot.title = element_text(hjust = 0.5),
        strip.background = element_blank(),
        strip.text = element_text(face = 'bold'),
        legend.position = 'none',
        plot.caption = element_text(hjust = 0, size = 7),
        axis.line.x = element_blank(),
        axis.ticks.x = element_blank(),
        panel.grid.major.x = element_line("gray70"))+
  transition_states(ano, transition_length = 1, state_length = 1.5)
# Salvar
#anim_save("Plots/piramide_animada.gif", piramide_animada)
# Rodar
piramide_animada