gganimate: как сделать, чтобы гистограмма с накоплением росла плавно вверх от оси x - PullRequest
0 голосов
/ 20 сентября 2019

У меня проблемы с анимацией сложенного статического сюжета.(См. Анимацию ниже)

Анимация движется волатильным образом слева направо, вместо того, чтобы каждый столбец рос вверх от оси x.Сложенные части также не очень гладко растут вместе, что я не могу решить.

Что мне нужно изменить в моем коде, чтобы по мере перехода анимированного графика вдоль оси xотдельные бары растут вверх?Я также хотел бы, чтобы сгруппированные столбцы росли более плавно, чтобы части сгруппированных стержней не «перекидывались» друг на друга.

Как это возможно?

Верхний рисунокв этой статье то, что я ищу, но я не понимаю, как и где его код отличается от моего: идеальная анимация

Вот мой репрезентация:

#Static df
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
year <- as.numeric(c(1996:2015,
                       1996:2015,
                       1996:2015))
c <- c(39, 40, 67, 80, 30, 140, 90, 23, 100, 123,
       140, 160, 100, 89, 173, 200, 32, 90, 100, 211,
       1, 2, 1, 13, 3, 3, 30, 1, 3, 3,
       1, 1, 20, 2, 1, 10, 1, 2, 1, 1,
       1, 3, 1, 2, 1, 3, 1, 3, 6, 1,
       1, 30, 1, 1, 8, 9, 1, 32, 1, 1)
cat <- as.character(c("out", "out", "out", "out", "out", "out", "out", "out", "out", "out",
                   "out", "out", "out", "out", "out", "out", "out", "out", "out", "out",
                   "in", "in", "in", "in", "in", "out", "in", "in", "in", "in",
                   "in", "in", "in", "in", "in", "in", "in", "in", "in", "in",
                   "other", "other", "other", "other", "other", "other", "other", "other", "other", "other",
                   "other", "other", "other", "other", "other", "other", "other", "other", "other", "other"))
cat <- as.factor(cat)
static_df_test <- data.frame(year, c, cat) %>%
  select(year, cat, c) %>%
  arrange(year, cat)


#Static plot
library(ggplot2)
(static_plot <- ggplot(static_df_test) +
    geom_bar(data = static_df_test, stat="identity", position ="stack",
             aes(x = year, y = c, fill = cat)) +
    scale_x_continuous(breaks = seq(1996, 2015, 1),
                       expand = c(0.003, 0.003),
                       labels = c(1996, 97, 98, 99, 2000,
                                  "01", "02", "03", "04", "05", "06",
                                  "07", "08", "09", 10, 11, 12, 13, 14, 15)) +
    scale_y_continuous(breaks = seq(0, 250, 25),
                       expand = c(0,0),
                       limits = c(0,250)) +
    labs(x = "year", y = "c")
)

#Animated plot
library(gganimate)
library(ggplot2)
ani <- (static_plot) +
  transition_time(as.integer(year)) +
  enter_grow() + shadow_mark(past = TRUE)

animate(ani, fps = 8, 50, duration = 15,
        width = 1500, height = 750, renderer = gifski_renderer())

Прямо сейчас, бары переходят, двигаясь вправо от предыдущего бара.Смотрите текущую анимацию здесь: Current animation

Заранее благодарю за любую помощь!

1 Ответ

1 голос
/ 25 сентября 2019

Вероятно, есть более правильный способ сделать это, но этого можно достичь, изменив способ построения исходного статического графика и используя transition_layers() и enter_drift().

Обратите внимание, что для упрощения моего примера я приведу только 1996-2000 годы.Чтобы анимировать все годы, просто скопируйте и вставьте разделы geom_bar() и измените фильтруемый год.

#Static plot
library(ggplot2)
(static_plot <- ggplot(static_df_test) +
    geom_bar(data = static_df_test %>% filter(year == 1996), stat="identity", position ="stack",
             aes(x = year, y = c, fill = cat)) +
    geom_bar(data = static_df_test %>% filter(year == 1997), stat="identity", position ="stack",
             aes(x = year, y = c, fill = cat)) +
    geom_bar(data = static_df_test %>% filter(year == 1998), stat="identity", position ="stack",
             aes(x = year, y = c, fill = cat)) +
    geom_bar(data = static_df_test %>% filter(year == 1999), stat="identity", position ="stack",
             aes(x = year, y = c, fill = cat)) +
    geom_bar(data = static_df_test %>% filter(year == 2000), stat="identity", position ="stack",
             aes(x = year, y = c, fill = cat)) +
    scale_x_continuous(breaks = seq(1996, 2015, 1),
                       expand = c(0.003, 0.003),
                       labels = c(1996, 97, 98, 99, 2000,
                                  "01", "02", "03", "04", "05", "06",
                                  "07", "08", "09", 10, 11, 12, 13, 14, 15)) +
    scale_y_continuous(breaks = seq(0, 250, 25),
                       expand = c(0,0),
                       limits = c(0,250)) +
    labs(x = "year", y = "c")
)

#Animated plot
library(gganimate)
library(ggplot2)

ani <- (static_plot) +
  transition_layers(layer_length = 1, transition_length = 2) +
  enter_drift(x_mod = 0, y_mod = -max(static_df_test$c))

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

Размещая каждый годовой бар на своем слое, мы можем использовать transition_layers(), чтобы сделать ихпоявляются один за другим, сохраняя все старые слои.Мы используем enter_drift() для анимации каждого бара, как если бы он дрейфовал вверх из-под графика.

Анимированный вывод здесь: ссылка

...