Código
# pacotes ----------------------------------------------------------------------
library(tidyverse)
library(gganimate)
library(spcrimr)
library(lubridate)
## Transform: `pop -> faixa_etaria` --------------------------------------------
### define os textos dos eixos em vetores
y_labs <- as.character(c(seq(2500, 0, -250), seq(250, 2500, 250)))
x_labs <-
c(paste(seq(0, 70, by=5), "até", seq(4, 74, by=5)), "75 e mais") %>%
str_replace("5 até 9", "05 até 09") %>%
str_replace("^0 até 4", "0 até 04")
### os labels dos eixos entram como variáveis categóricas na tabela
# repete 'x_lab' e 'y_lab' para elas terem o tamando da tabela 'seade'
faixa_etaria <-
tibble(faixa_etaria = rep(x_labs, 40), id = rep(seq(1,16), 40)) %>%
arrange(id)
faixa_etaria <- bind_rows(faixa_etaria, faixa_etaria) %>% select(faixa_etaria)
### define a tabela 'faixa_etaria'
faixa_etaria <-
unnest(seade_completa) %>%
select(
ano,
populacao_masculina_de_0_a_4_anos,
populacao_masculina_de_5_a_9_anos,
populacao_masculina_de_10_a_14_anos:populacao_masculina_de_45_a_49_anos,
populacao_masculina_de_50_a_54_anos:populacao_masculina_de_75_anos_e_mais,
populacao_feminina_de_0_a_4_anos,
populacao_feminina_de_5_a_9_anos,
populacao_feminina_de_10_a_14_anos:populacao_feminina_de_45_a_49_anos,
populacao_feminina_de_50_a_54_anos:populacao_feminina_de_75_anos_e_mais
) %>%
group_by(ano) %>%
summarise_all(sum, na.rm = TRUE) %>%
gather(key = ano, value = populacao) %>%
rename(cod = ano) %>%
mutate(genero = as.factor(c(rep("Masculina", 640), rep("Feminina", 640))),
faixa_etaria = faixa_etaria$faixa_etaria,
ano = rep(year(seq(as.POSIXct("1980-01-01"),
by = "year", length.out = 40)), 32),
cod = as.factor(cod))
### este será o label com as idades
grupo_etario <-
faixa_etaria %>%
group_by(faixa_etaria) %>%
summarise()
# espelha "feminino" e "masculino"
faixa_etaria$populacao <- ifelse(faixa_etaria$genero=="Masculina",
-1 * faixa_etaria$populacao,
faixa_etaria$populacao)
## Viz `faixa_etaria`: Pirâmide etária -----------------------------------------
options(gganimate.dev_args = list(width = 900, height = 700))
# começa ggplot -----------------------------------------------------#
ggplot(faixa_etaria, aes(x = faixa_etaria,
y = populacao,
fill = genero,
color = genero)) +
# as barras ---------------------------------------------------------#
geom_bar(data = filter(faixa_etaria, genero=="Feminina" ),
alpha =.5,
stat ="identity",
color ="black", size=.2) +
geom_bar(data = filter(faixa_etaria, genero=="Masculina"),
alpha = .5,
stat = "identity",
color = "black",
size = .2) +
# escalas ----------------------------------------------------------#
scale_y_continuous(breaks = seq(-2500000, 2500000, 250000),
labels = y_labs) +
scale_x_discrete(labels = grupo_etario) +
scale_fill_manual(values = c("coral2", "plum4")) +
# gira o eixo ------------------------------------------------------#
coord_flip() +
# textos -----------------------------------------------------------#
labs(title = "Pirâmide Etária - População (em milhares) e Faixas Etárias",
subtitle = "Estado de São Paulo {frame_time}",
x = "Idade",
y = "População (em milhares)") +
# temas ------------------------------------------------------------#
theme(plot.title = element_text(hjust = .5, size = 20, face = 'bold'),
plot.subtitle = element_text(hjust = .5, size = 20, face = 'bold'),
legend.position = c(.85,.85),
legend.title = element_blank(),
legend.background = element_rect(line = 'solid', color = 'black'),
legend.key.size = unit(.5, "cm"),
axis.ticks = element_line(),
legend.text = element_text(size = 17, hjust = 1),
axis.text.x = element_text(size = 12, angle = 45, hjust = 1, vjust = 1),
axis.text.y = element_text(size = 12),
axis.line.x = element_line(),
axis.line.y = element_blank(),
axis.title.x = element_text(size = 12),
axis.title.y = element_blank(),
panel.background = element_rect(fill = "azure",
colour = "azure",
size = 0.5, linetype = "solid"),
panel.grid.major = element_line(size = 0.5, linetype = 'solid',
colour = "azure2"),
panel.grid.minor = element_line(size = 0.5, linetype = 'solid',
colour = "azure2")) +
# animations params --------------------------------------------------#
transition_time(as.integer(ano))

# fim ggplot ---------------------------------------------------------#