使用 gganimate 构建堆叠直方图

Fra*_*ank 5 r ggplot2 gganimate

我正在尝试显示随着时间的推移构建的直方图。它将从 1952 年的数据开始,然后每年更新直方图,并不断增长。

这条路似乎很笨拙,我想transition_reveal随着时间的推移慢慢地揭示更多的数据。这似乎不起作用。

假设我从这个开始:

library(gapminder)
library(tidyverse)
library(gganimate)

ggplot(gapminder, 
       aes(lifeExp, fill = fct_rev(factor(year)), group = fct_rev(factor(year)))) +
  geom_histogram(position = "stack", bins = 20) +
  transition_reveal(year)  
Run Code Online (Sandbox Code Playgroud)

这很失败。

我可以将一些东西与 混合在一起transition_layer,如下所示:

ggplot(gapminder, aes(lifeExp, fill = fct_rev(factor(year)))) +
  geom_histogram(position = "stack", bins = 20, 
                 data = filter(gapminder, year<= 1952)) +
  geom_histogram(position = "stack", bins = 20, 
                 data = filter(gapminder, year<= 1957)) +
  geom_histogram(position = "stack", bins = 20, 
                 data = filter(gapminder, year<= 1962)) +
  geom_histogram(position = "stack", bins = 20, 
                 data = filter(gapminder, year<= 1967)) +
  geom_histogram(position = "stack", bins = 20, 
                 data = filter(gapminder, year<= 1972)) +
  geom_histogram(position = "stack", bins = 20, 
                 data = filter(gapminder, year<= 1977)) +
  transition_layers()  
Run Code Online (Sandbox Code Playgroud)

这会产生所需的结果,但很笨拙。有没有更便携的方式?

这是我正在寻找的 gif:

增长堆叠直方图

Jon*_*ing 5

我无法弄清楚使用geom_histogram,但我可以通过从geom_rect.

bin_yrs = 2
a <- gapminder %>%
  count(year, life_bin = floor(lifeExp / bin_yrs) * bin_yrs) %>%
  complete(year, life_bin, fill = list(n = 0)) %>%
  arrange(year, life_bin) %>%
  group_by(life_bin) %>%
  mutate(dummy = lag(cumsum(n), default = 0)) %>%
  ungroup() %>%

  ggplot(aes(xmin = life_bin, 
             xmax = life_bin + bin_yrs,
             ymin = dummy, 
             ymax = dummy + n,
             fill = as.factor(year))) +
  geom_rect() +
  transition_manual(year) +
  shadow_trail()
animate(a, nframes = 12, fps = 4, width = 600, height = 300)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明