создать гистограмму с накоплением по цвету гистограммы - PullRequest
1 голос
/ 30 апреля 2019

Я видел тот же вопрос, но без рабочего решения этот на первый взгляд выглядит так же, но на самом деле не охватывает мой вопрос.

Я хотел бы сначала построить и анимировать нижние фиолетовые столбцы, затем светло-голубые сверху для окончательного сложенного результата, а затем зациклить.Как это можно сделать с помощью пакета gganimate.

Сначала моя анимированная гистограмма со стеками за год одновременно.

enter image description here

Вот мои данные:

example_df <- structure(list(jaar = c(2019, 2019, 2018, 2018, 2017, 2017, 2016, 
2016, 2015, 2015, 2014, 2014, 2013, 2013, 2012, 2012, 2011, 2011, 
2010, 2010), type = c("purple", "blue", "purple", "blue", "purple", 
"blue", "purple", "blue", "purple", "blue", "purple", "blue", 
"purple", "blue", "purple", "blue", "purple", "blue", "purple", 
"blue"), aantal = c(322L, 338L, 328L, 354L, 303L, 302L, 257L, 
245L, 223L, 185L, 183L, 128L, 141L, 80L, 121L, 58L, 104L, 46L, 
94L, 38L)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-20L))

Вот мой код:

library(tidyverse)
library(gganimate)

anim_bar <- example_df %>%
  ggplot(aes(jaar, aantal)) +
  geom_col(aes(fill = type)) +
  scale_fill_manual(values = c("#1beaae", "#6b38e8")) +
  theme(legend.position = "top") +
  transition_time(jaar) +
  shadow_mark() +
  enter_grow() +
  enter_fade()

animate(anim_bar, fps = 20)

1 Ответ

1 голос
/ 30 апреля 2019

Вот подход, использующий некоторые манипуляции заранее, чтобы указать порядок появления и как должен выглядеть каждый столбец при его появлении.Мне повезло больше, если заранее рассчитать место наложения и указать координаты с помощью geom_tile.

example_df %>%
  arrange(desc(type), jaar) %>%
  mutate(frame_num = row_number()) %>%
  group_by(jaar) %>%
  mutate(space_below = cumsum(lag(aantal, default = 0))) %>%
  ungroup() %>%

  ggplot() +
  geom_tile(aes(jaar, space_below + aantal/2, 
                width = 0.9, height = aantal,
                fill = type)) +
  scale_fill_manual(values = c("#1beaae", "#6b38e8")) +
  theme(legend.position = "top") +
  transition_time(frame_num) +
  shadow_mark() +
  enter_grow() +
  enter_fade() ->   anim_bar

animate(anim_bar, fps = 20)

enter image description here

...