You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
2.8KB

  1. source(here::here("R", "00_base_tidyr.R"))
  2. sg_wide <- wide %>%
  3. proc_data("0-wide", colorize_wide_tidyr) %>%
  4. mutate(frame = 1, .id = "0-wide")
  5. sg_long <- wide %>%
  6. tidyr::gather("key", "val", -id) %>%
  7. proc_data("3-tall", color_fun = function(x, y) x) %>%
  8. split(.$label)
  9. sg_long$id <-
  10. sg_wide %>%
  11. filter(label == "id") %>%
  12. select(value, color) %>%
  13. left_join(sg_long$id, ., by = "value") %>%
  14. mutate(alpha = 1)
  15. sg_long$key <-
  16. sg_wide %>%
  17. filter(label != "id") %>%
  18. select(label, color) %>%
  19. left_join(sg_long$key, ., by = c("value" = "label")) %>%
  20. distinct() %>%
  21. mutate(alpha = 1)
  22. sg_long$val <-
  23. sg_wide %>%
  24. filter(label != "id", .y < 0) %>%
  25. select(value, color) %>%
  26. left_join(sg_long$val, ., by = "value") %>%
  27. mutate(alpha = 0.6)
  28. sg_long <- bind_rows(sg_long) %>% mutate(frame = 2)
  29. sg_long_labels <- data_frame(id = 1, a = "id", x = "key", y = "val") %>%
  30. proc_data("4-label") %>%
  31. filter(label != "id") %>%
  32. mutate(color = "#FFFFFF", .y = 0, .x = .x -1, frame = 2, alpha = 1, label = recode(label, "a" = "id"))
  33. sg_wide_labels <- data_frame(id = 1, a = "id") %>%
  34. proc_data("2-label") %>%
  35. filter(label != "id") %>%
  36. mutate(color = "#FFFFFF", .y = 0, .x = .x -1, frame = 1, alpha = 1, label = recode(label, "a" = "id"))
  37. sg_long_extra_keys <- map_dfr(
  38. seq_len(nrow(wide) - 1),
  39. ~ filter(sg_wide, .y > -1) # Extra key blocks in long column
  40. )
  41. n_key_cols <- length(setdiff(colnames(wide), "id"))
  42. sg_long_extra_id <- map_dfr(
  43. seq_len(n_key_cols - 1),
  44. ~ filter(sg_wide, .x == 1) # Extra id column blocks for long column
  45. )
  46. sg_data <- bind_rows(
  47. sg_wide,
  48. sg_wide_labels,
  49. sg_long,
  50. sg_long_labels,
  51. sg_long_extra_keys,
  52. sg_long_extra_id
  53. ) %>%
  54. mutate(
  55. label = ifelse(value %in% setdiff(colnames(wide), "id"), "key", label),
  56. label = ifelse(value %in% c("key", "val"), "zzz", label),
  57. .text_color = ifelse(grepl("label", .id), "black", "white"),
  58. .text_size = ifelse(grepl("label", .id), 8, 12)
  59. ) %>%
  60. arrange(label, .id, value) %>%
  61. mutate(frame = factor(frame, labels = c('spread(long, key, val)', 'gather(wide, key, val, x:z)'))) %>%
  62. select(.x, .y, everything())
  63. sg_static <-
  64. sg_data %>%
  65. split(.$frame) %>%
  66. imap(~ plot_data(.x, .y) +
  67. ylim(-6.5, 0.5) +
  68. labs(subtitle = "returns") +
  69. theme(plot.subtitle = element_text(family = "Fira Sans", size = 14, color = "grey50", hjust = 0.5, margin = margin(25)))
  70. )
  71. save_static_plot(sg_static[[1]], "tidyr-spread")
  72. save_static_plot(sg_static[[2]], "tidyr-gather")
  73. sg_anim <-
  74. sg_data %>%
  75. plot_data() %>%
  76. animate_plot() +
  77. view_follow() +
  78. labs(title = "{ifelse(transitioning, next_state, ifelse(grepl('gather', next_state), 'long', 'wide'))}") +
  79. ease_aes("sine-in-out", x = "exponential-out")
  80. sg_anim <- animate(sg_anim)
  81. anim_save(here::here("images", "tidyr-spread-gather.gif"), sg_anim)