【问题标题】:gganimate stacked bar chart over timegganimate 堆积条形图随时间变化
【发布时间】:2019-01-05 06:46:48
【问题描述】:

我正在尝试随着时间的推移为堆积条形图制作动画。特别是,我希望每个堆栈首先在给定年份建立,然后过渡到下一年。另外,我想确保过去的酒吧是可见的。以下代码一次绘制每个条形图并过渡到下一年,同时使前几年不可见。有没有办法解决这个问题?

library(tidyr)  
library(ggplot2)
library(gganimate)
library(dplyr)

df <- data.frame(stringsAsFactors=FALSE,
                 Year = c("2010", "2011", "2012"),
                 LabelOne = c(1000, 1500, 2000),
                 LabelTwo = c(50, 100, 150),
                 LabelThree = c(20, 30, 40)
)

df_long <- gather(df, lbs, Value, LabelOne:LabelThree, -Year)
head(df_long)

pp <- ggplot(df_long, aes(Year, Value)) +
  geom_bar(stat = "identity", aes(fill = lbs)) +
  transition_states(Year, 
          transition_length = 4, state_length = 2) +
    ease_aes('cubic-in-out')

animate(pp, nframes = 300, fps = 50, width = 400, height = 550)

【问题讨论】:

    标签: r gganimate


    【解决方案1】:

    如果你让你的数据看起来像这样:

    df2 <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), Year = c(2010L, 2010L, 2010L, 
    2010L, 2010L, 2010L, 2011L, 2011L, 2011L, 2010L, 2010L, 2010L, 
    2011L, 2011L, 2011L, 2012L, 2012L, 2012L), lbs = structure(c(1L, 
    3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 
    2L), .Label = c("LabelOne", "LabelThree", "LabelTwo"), class = "factor"), 
        Value = c(1000L, 50L, 20L, 1000L, 50L, 20L, 1500L, 100L, 
        30L, 1000L, 50L, 20L, 1500L, 100L, 30L, 2000L, 150L, 40L)), class = "data.frame", row.names = c(NA, 
    -18L))
    

    您可以在ID 而不是Year 上进行动画处理,并且它会按顺序构建。第 1 组是 2010 年,第 2 组是 2010 年和 2011 年,第 3 组是 2010 年、2011 年和 2012 年

    pp <- ggplot(df2, aes(Year, Value)) +
      geom_bar(stat = "identity", aes(fill = lbs)) +
      transition_states(ID, 
              transition_length = 4, state_length = 2) +
        ease_aes('cubic-in-out')
    

    【讨论】:

    • 非常感谢。很好的解决方案。不过是个小问题。我希望这些值每年按顺序累积,然后过渡到下一年。照原样,代码一次绘制给定年份的堆积条形图,然后移动到下一年。有可能解决这个问题吗?谢谢。