如何用gganimate动画化成组的条形图?

时间:2019-08-21 21:38:23

标签: r bar-chart gganimate

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

enter image description here

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的顶部而不是侧面。因此,最后一帧是具有四个条形图的条形图,而不是四组四个的条形图。

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

1 个答案:

答案 0 :(得分:3)

其想法是指定数据存在的时间点。例如,来自let scaleOutput = 1; let output; let canvas; // setup function setup() { // other stuff... output = createGraphics(1000, 640); canvas = createCanvas(1000, 640); } // the draw loop function draw() { // Clear Canvas background(255); output.clear(); // Set scale output.push(); output.scale(scaleOutput); // Draw to your output here... output.pop(); // Show on canvas image(output, 0, 0); } // Scale up graphics before exporting function exportHighRes() { // HighRes Export scaleOutput = 5; output = createGraphics(scaleOutput * 1000, scaleOutput * 640); draw(); save(output, "filename", 'png'); // Reset Default scaleOutput = 1; output = createGraphics(1000, 640); draw(); } // Export when key is pressed function keyReleased() { if (key == 'e' || key == 'E') exportHighRes(); } 的条形图存在于四个不同的时间点(即分别位于1,2,3,4)中,id == 1处于三个不同点,依此类推:

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

这是结果:

enter image description here


编辑一种方法(我确信还有其他方法)可以缓慢显示条形,而不是使其突然出现,这是在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_length参数,然后将transition_states添加到动画中。

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 image description here