No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

189 líneas
6.4KB

  1. ## ----setup, include=FALSE------------------------------------------------
  2. knitr::opts_chunk$set(echo=FALSE)
  3. ## ----library-------------------------------------------------------------
  4. library(dplyr)
  5. library(purrr)
  6. library(tidyr)
  7. library(stringr)
  8. library(readr)
  9. library(forcats)
  10. library(gganimate)
  11. DATA_DIR <- "data-raw"
  12. ANIM_OUT <- "anim"
  13. fs::dir_create(here::here(ANIM_OUT))
  14. pop <- readRDS(here::here("data", "pop_estimates_by_age.rds"))
  15. ## ------------------------------------------------------------------------
  16. ga <-
  17. pop %>%
  18. bind_rows() %>%
  19. mutate(age_group_int = as.integer(Age) %/% 5) %>%
  20. group_by(age_group_int) %>%
  21. mutate(
  22. # age_group = paste(min(Age), max(Age), sep = " - "),
  23. age_group = paste(min(Age)),
  24. age_group = ifelse(Age >= 100, "100+", age_group)
  25. ) %>%
  26. ungroup() %>%
  27. arrange(age_group_int, Year) %>%
  28. mutate(age_group = fct_inorder(age_group)) %>%
  29. select(-age_group_int) %>%
  30. group_by(Year, age_group) %>%
  31. summarize(Total = sum(Total)) %>%
  32. group_by(Year) %>%
  33. mutate(GrandTotal = sum(Total)) %>%
  34. ungroup() %>%
  35. mutate(Total = Total/GrandTotal) %>%
  36. arrange(Year, age_group) %>%
  37. # complete(Year, age_group, fill = list(Total = 0)) %>%
  38. # filter(Year > 2000) %>%
  39. {
  40. ggplot(.) +
  41. # aes(age_group, Total) +
  42. # geom_vline(xintercept = c(1980, 1990), color = "grey50") +
  43. # geom_line(aes(group = age_group)) +
  44. # geom_point(size = 0.2) +
  45. # geom_col(fill = "grey40") +
  46. # facet_wrap(~ Year) +
  47. # coord_flip() +
  48. # scale_y_continuous(labels = function(x) {grkmisc::pretty_num(x, decimal_digits = 0)}) +
  49. geom_segment(aes(yend = age_group, y = age_group, xend = Total), x = 0, size = 5) +
  50. geom_segment(aes(yend = age_group, y = age_group, xend = Total),
  51. x = 0,
  52. size = 5,
  53. color = "grey40",
  54. alpha = 0.25,
  55. data = filter(., Year == min(Year)) %>% select(-Year)
  56. ) +
  57. # annotate("text", label = "{closest_state}", x = max(.$Total) * 0.8, y = 20, size = 12) +
  58. theme_minimal(base_size = 16, base_family = "Fira Sans Condensed") +
  59. theme(panel.grid.major.y = element_blank()) +
  60. scale_x_continuous(labels = scales::percent, expand = c(0, 0, 0.05, 0)) +
  61. # labs(x = "Percent of Population", y = NULL) +
  62. theme(axis.title.x = element_text(hjust = 0.5, size = 30)) +
  63. labs(x = "{closest_state}", y = NULL) +
  64. gganimate::transition_time(Year) +
  65. gganimate::transition_states(Year, 1, 0, wrap = FALSE) +
  66. gganimate::ease_aes("linear") +
  67. gganimate::enter_fade()
  68. }
  69. grkmisc::logger(msg = "Writing MP4 population bar animation")
  70. anim_save(
  71. here::here(ANIM_OUT, "pop-anim.mp4"),
  72. animate(ga, width = 1040*2, height = 480*2, res = 144,
  73. fps = 20, nframes = 161*2, renderer = av_renderer())
  74. )
  75. grkmisc::logger(msg = "Writing gif population bar animation")
  76. anim_save(
  77. here::here(ANIM_OUT, "pop-anim.gif"),
  78. animate(ga, width = 1040*2, height = 480*2, res = 144,
  79. fps = 20, nframes = 161*2,
  80. renderer = gganimate::gifski_renderer(loop = FALSE))
  81. )
  82. pop %>%
  83. bind_rows() %>%
  84. mutate(age_group_int = as.integer(Age) %/% 5) %>%
  85. select(1:3, age_group_int) %>%
  86. filter(age_group_int > 5) %>%
  87. mutate(
  88. old = age_group_int >= 13,
  89. old = c("Adult", "Older Adult")[old + 1]
  90. ) %>%
  91. group_by(Year, old) %>%
  92. summarize(n = sum(Total)) %>%
  93. spread(old, n) %>%
  94. {
  95. ggplot(.) +
  96. aes(x = Year) +
  97. geom_segment(aes(xend = Year, y = Adult, yend = `Older Adult`)) +
  98. geom_point(aes(y = Adult), color = grkmisc::moffitt_colors$blue) +
  99. geom_point(aes(y = `Older Adult`), color = grkmisc::moffitt_colors$orange, size = 2)
  100. } %>%
  101. invisible()
  102. elder_dependency <-
  103. pop %>%
  104. bind_rows() %>%
  105. mutate(age_group_int = as.integer(Age) %/% 5) %>%
  106. select(1:3, age_group_int) %>%
  107. mutate(
  108. old = case_when(
  109. age_group_int < 3 ~ "Children",
  110. age_group_int >= 13 ~ "Older Adult",
  111. TRUE ~ "Adult"
  112. )
  113. ) %>%
  114. group_by(Year, old) %>%
  115. summarize(n = sum(Total)) %>%
  116. spread(old, n) %>%
  117. mutate(
  118. dependency_elder = `Older Adult` / Adult,
  119. dependency_all = (`Older Adult` + Children) / Adult
  120. )
  121. ga_elder_dep <-
  122. ggplot(elder_dependency) +
  123. aes(Year, dependency_elder) +
  124. geom_point(color = "#00589a") +
  125. geom_point(data = filter(elder_dependency, Year == 2018), size = 4, color = "#eb1455") +
  126. labs(y = "Dependency Ratio", x = NULL) +
  127. theme_minimal(base_size = 24, base_family = "Fira Sans Condensed") +
  128. scale_y_continuous(labels = scales::percent) +
  129. gganimate::transition_states(Year, 1, 0, FALSE) +
  130. gganimate::shadow_mark()
  131. grkmisc::logger(msg = "Writing mp4 elder dependency animation")
  132. anim_save(
  133. here::here(ANIM_OUT, "pop-dependency.mp4"),
  134. animate(ga_elder_dep, width = 1040*2, height = 480*2, res = 144,
  135. fps = 18, nframes = 161, renderer = av_renderer())
  136. )
  137. grkmisc::logger(msg = "Writing gif elder dependency animation")
  138. anim_save(
  139. here::here(ANIM_OUT, "pop-dependency.gif"),
  140. animate(ga_elder_dep, width = 1040*2, height = 480*2, res = 144,
  141. fps = 18, nframes = 161,
  142. renderer = gganimate::gifski_renderer(loop = FALSE))
  143. )
  144. elder_dep_together <-
  145. elder_dependency %>%
  146. ungroup() %>%
  147. gather(timeseries, ratio, starts_with("depend")) %>%
  148. select(-Adult:-`Older Adult`) %>%
  149. mutate(timeseries = ifelse(timeseries == "dependency_elder", 0, 1))
  150. ga_dep_together <-
  151. ggplot(elder_dep_together) +
  152. aes(Year, ratio) +
  153. geom_point(color = "#00589a") +
  154. # geom_point(color = "#82c878") +
  155. # geom_point(data = filter(., Year == 2018), size = 4, color = "#eb1455") +
  156. labs(y = "Dependency Ratio", x = NULL) +
  157. theme_minimal(base_size = 24, base_family = "Fira Sans Condensed") +
  158. scale_y_continuous(labels = scales::percent) +
  159. gganimate::transition_states(timeseries, 1, 0, FALSE) +
  160. gganimate::view_follow(fixed_x = TRUE) +
  161. gganimate::ease_aes("sine-in-out")+
  162. gganimate::shadow_mark()
  163. grkmisc::logger(msg = "Writing mp4 all dependency animation")
  164. anim_save(
  165. here::here(ANIM_OUT, "pop-dependency-both.mp4"),
  166. animate(ga_dep_together, width = 1040*2, height = 480*2, res = 144,
  167. fps = 18, nframes = 80,
  168. renderer = av_renderer())
  169. )
  170. grkmisc::logger(msg = "Writing gif all dependency animation")
  171. anim_save(
  172. here::here(ANIM_OUT, "pop-dependency-both.gif"),
  173. animate(ga_dep_together, width = 1040*2, height = 480*2, res = 144,
  174. fps = 18, nframes = 80,
  175. renderer = gganimate::gifski_renderer(loop = FALSE))
  176. )