gganimate: объединение transition_layers и geom_smooth - PullRequest
1 голос
/ 26 сентября 2019

Как мне объединить функцию geom_smooth (method = "lm) с gganimate ()'s transition_layers, чтобы по мере смещения / роста отдельных баров появлялась линейная линия geom_smooth, например: Примержелаемый вид линии geom_smooth Единственное отличие состоит в том, что в моем случае вместо точек бары будут дрейфовать вверх при появлении линии.

Ток баров работает хорошо, появляясь при смещении вверх,возможно с помощью функции transition_layers из gganimate.

Однако я не могу понять, как добавить строку geom_smooth, поэтому она появляется по мере того, как столбцы растут вверх. Прямо сейчас линия появляется только в конце,как показано ниже.

См. ниже текущий вид анимации.

Вот простой пример моей проблемы:

#Df for reprex
library(ggplot2)
library(tidyverse)

year <- as.numeric(c(1996:2002,
                     1996:2002,
                     1996:2002))
c <- c(39, 40, 67, 80, 30, 140, 90, 23, 100, 123,
       140, 1, 2, 1, 13, 3, 3, 30, 1, 3, 3)
df <- data.frame(year, c) %>%
  select(year, c) %>%
  arrange(year)

#Static plot
(static_plot <- ggplot(data = df) +
    geom_bar(data = df %>% filter(year == 1996), stat="identity", position ="stack",
             aes(x = year, y = c)) +
    geom_bar(data = df %>% filter(year == 1997), stat="identity", position ="stack",
             aes(x = year, y = c)) +
    geom_bar(data = df %>% filter(year == 1998), stat="identity", position ="stack",
             aes(x = year, y = c)) +
    geom_bar(data = df %>% filter(year == 1999), stat="identity", position ="stack",
             aes(x = year, y = c)) +
    geom_bar(data = df %>% filter(year == 2000), stat="identity", position ="stack",
             aes(x = year, y = c)) +
    geom_bar(data = df %>% filter(year == 2001), stat="identity", position ="stack",
             aes(x = year, y = c)) +
    geom_bar(data = df %>% filter(year == 2002), stat="identity", position ="stack",
             aes(x = year, y = c)) +
  labs(y = "year",
       x = "c",
       title = "Reprex") +
  geom_smooth(df, mapping = aes(x = year, y = c), method = "lm",
              colour = "black", se = F)
  )

#Animation
library(gganimate)
anim <- static_plot +
  transition_layers(layer_length = 1, transition_length = 1) +
  enter_drift(x_mod = 0, y_mod = -max(df$c))

animate(anim, fps = 10, duration = 10,
        width = 600, height = 500, renderer = gifski_renderer())

Current animation

Ответы [ 2 ]

3 голосов
/ 28 сентября 2019

Это подход, при котором данные реплицируются, а затем фильтруются, поэтому каждая версия показывает все больше лет.

library(dplyr); library(tidyr)

animate(
  df %>%
    count(year, wt = c, name = "c") %>%   # Aggregate for each year's total
    uncount(7, .id = "year_disp") %>%     # Make 7 copies, one for each year
    arrange(year_disp, year) %>% 
    mutate(year_disp = year_disp + min(df$year) - 1) %>%
    filter(year <= year_disp) %>%         # Only keep years up to "year_disp"
    ggplot(aes(year, c)) +
    geom_col(aes(group = year)) +   # "group" here connects each year to itself between frames
    geom_smooth(method = "lm", se = F) +
    transition_states(year_disp) +
    enter_drift(y_mod = -max(df$c)),
  fps = 10, duration = 10,
  width = 600, height = 500, renderer = gifski_renderer())

enter image description here

0 голосов
/ 28 сентября 2019

geom-line вычисляется в конце и, следовательно, появляется только в конце.После каждого вычисления geom-bar вы должны также рассчитать geom-line, чтобы линия появлялась одновременно с ростом баров.

geom_bar(data = df %>% filter(year == 1997), stat="identity", position ="stack",
             aes(x = year, y = c)) +
geom_line(filter(df, year %in% c(1996, 1997)), mapping = aes(x = year, y = lm),
                colour = "black")

Делайте это все годы, и вы должны получатьожидаемый результат!

...