【问题标题】:How to animate grouped barplots with gganimate?如何使用 gganimate 为分组条形图设置动画?
【发布时间】:2019-12-27 04:38:51
【问题描述】:

我想为分组条形图制作动画,这样每个系列依次绘制,然后保持可见。在下面的示例图中,我希望先绘制 id = 1 的条形图,然后依次绘制 id = 2、id = 3、id = 4 的条形图。

df <- data.frame(id = factor(c(1:4)),
                    var1 = c(0, 20,60, 80),
                    var2 = c(18, 64, 91, 100),
                    var3 = c(8, 73, 100, 100),
                    var4 = c(18, 48, 67, 85))

df_melt <- melt(df, id.var = "id")
df_melt <- df_melt %>% mutate(show_time = 1, reveal_time = cumsum(show_time))

ggplot(data = df_melt, aes(x = variable, y = value, fill = id)) + 
    geom_bar(stat = "identity", position = "dodge")

我已经能够使用 transition_reveal 生成动画线图,如下所述:https://www.datanovia.com/en/blog/gganimate-how-to-create-plots-with-beautiful-animation-in-r/

我曾尝试使用 transition_reveal 和 transition_states(单独和组合)来实现我的目标,但到目前为止都没有成功。例如:transition_states(id)。

我也尝试在我的数据中添加一个reveal_time 列并使用transition_reveal(reveal_time) 无济于事。

我生成的所有动画都将 id = 2 的值绘制在 id = 1 的顶部而不是侧面。因此,最后一帧是一个有四个条的条形图,而不是四组,每组四个。

任何帮助将不胜感激 - 谢谢!

【问题讨论】:

  • 嗨 - 我的理解是facet_wrap 将绘制四个单独的条形图,这些条形图会一一出现。我真的很希望能够绘制一个分组条形图,在单个绘图区域上逐系列显示。

标签: r bar-chart gganimate


【解决方案1】:

这个想法是指定数据存在于哪些时间点。例如,来自id == 1 的柱线存在于四个不同的时间点(即在 1、2、3、4 中),id == 2 在三个不同的时间点,等等:

library(tidyr)
library(dplyr)
library(gganimate)
df <- data.frame(id = factor(c(1:4)),
                 var1 = c(0, 20,60, 80),
                 var2 = c(18, 64, 91, 100),
                 var3 = c(8, 73, 100, 100),
                 var4 = c(18, 48, 67, 85))

df$show_time <- 1:4
for(i in 1:nrow(df)){
          df$show_time[i] <- list(df$show_time[i][[1]]:4)
}
df <- unnest(df, show_time)

这是它的样子:

> head(df, 5)
  id show_time variable value
1  1         1     var1     0
2  1         2     var1     0
3  1         3     var1     0
4  1         4     var1     0
5  2         2     var1    20

从这里我将数据重塑为建议的格式并绘制动画:

df <- gather(df, variable, value, -c(id,show_time))  # reshape

ggplot(data = df, aes(x = variable, y = value, fill = id)) + 
          geom_bar(stat = "identity", position = "dodge") +
          transition_states(show_time, wrap = F) 

这是结果:


编辑 一种方法(我相信还有其他方法)慢慢显示条而不是让它们突然出现是在 transition_states 函数中调整 transition_length 参数并添加 enter_fade到动画。

ggplot(data = df, aes(x = variable, y = value, fill = id)) + 
          geom_bar(stat = "identity", position = "dodge") +
          transition_states(show_time, wrap = F, transition_length = 5) +
          enter_fade()

此外,您可以让条形“漂移”到情节中:

ggplot(data = df, aes(x = variable, y = value, fill = id)) + 
          geom_bar(stat = "identity", position = "dodge") +
          transition_states(show_time, wrap = F, transition_length = 5) +
          enter_fade() +
          enter_drift(x_mod = 0, y_mod = -max(df$value))

就像我说的,可能有很多不同的方法可以做到这一点,但这是一个开始:

【讨论】:

  • 感谢您的回复和解释。对我所拥有的东西真的有很大的改进。最后一个小问题是,是否有一种方法可以显示新条而不是立即出现。我已经尝试过使用您的代码,但无法实现。
  • @BenNutzer 这很受启发!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
相关资源
最近更新 更多