【问题标题】:Animate ggplot2 stacked line chart in RR中的动画ggplot2堆叠折线图
【发布时间】:2015-01-19 16:39:37
【问题描述】:

我正在尝试为 ggplot2 中的堆叠折线图制作动画。

这是我想要制作动画的情节:

这是生成类似图的代码:

#Data
mydata <- data.frame(year=rep(1:6, times=4),
                 activity=as.factor(rep(c("research","coursework","clinical work","teaching"), each=6)),
                 time=c(40, 35, 40, 60, 85, 90,
                        50, 40, 10, 0, 5, 0,
                        5, 20, 20, 40, 10, 10,
                        5, 5, 30, 0, 0, 0))

mydata$activity <- ordered(mydata$activity, levels = c("research","clinical work","coursework","teaching"))

labels <- data.frame(activity=c("research","coursework","clinical work","teaching"),
                 xaxis=c(5, 1.8, 2.5, 2.97),
                 yaxis=c(25, 70, 48, 90))

#Plot
ggplot(mydata, aes(x=year, y=time, fill=activity)) +
  geom_area(stat="smooth", span=.35, color="black") +
  theme(legend.position = "none") +
  geom_text(data=labels, aes(x=xaxis, y=yaxis, label=activity)) +
  ggtitle("Time in Different Activities by Year in Program") +
  ylab("Percentage of Time") +
  xlab("Year in Program")

我正在寻找显示所有轴和文本的第一张图片。第二次迭代,我想随着时间的推移,从左到右逐渐揭示“研究”堆叠线(包括颜色和边框)。第三次迭代,我想从左到右逐渐揭示“临床工作”堆叠线。四是“课业”叠线。最后是“教学”叠线。

理想情况下,输出格式会非常平滑(没有锯齿状的跳跃)并且与 PowerPoint 兼容。

【问题讨论】:

    标签: r animation plot ggplot2 linechart


    【解决方案1】:

    这是一个基于 R 的解决方案。它保存可以在演示文稿中迭代的单个图形 (.png)。

    或者,您可以使用 ImageMagick http://www.imagemagick.org/ 创建动画(例如转换为 .gif)

    #Data
    mydata <- data.frame(year=rep(1:6, times=4),
                         activity=as.factor(rep(c("research","coursework","clinical work","teaching"), each=6)),
                         time=c(40, 35, 40, 60, 85, 90,
                                50, 40, 10, 0, 5, 0,
                                5, 20, 20, 40, 10, 10,
                                5, 5, 30, 0, 0, 0))
    
    #order the activities and then the dataframe
    mydata$activity <- ordered(mydata$activity, levels = c("research","clinical work","coursework","teaching"))
    mydata <- mydata[order(mydata$activity),]
    
    #labels
    labels <- data.frame(activity=c("research","coursework","clinical work","teaching"),
                         xaxis=c(5, 1.8, 2.5, 2.97),
                         yaxis=c(25, 70, 48, 90))
    
    #creates a function to draws a plot for each activity
    draw.stacks<-function(leg){
      int <- leg*6
      a<-ggplot(data=mydata[1:int,], aes(x=year, y=time, fill=activity))+
        geom_area(stat="smooth", span=.35, color="black") +
        theme_bw()+
        scale_fill_discrete(limits = c("research","clinical work","coursework","teaching"), guide="none")+
        theme(panel.grid.major = element_blank(),
              panel.grid.minor = element_blank()) +
        coord_cartesian(xlim=c(1,6),ylim=c(0,100))+
        geom_text(data=labels, aes(x=xaxis, y=yaxis, label=activity)) +
        ggtitle("Time in Different Activities by Year in Program") +
        ylab("Percentage of Time") +
        xlab("Year in Program")  
      print(a)
    }
    
    
    # save individual png figures
    for (i in 0:4) {
    png(paste("activity", i, "png", sep="."))
      draw.stacks(i)
    dev.off()
    }
    

    【讨论】:

      【解决方案2】:

      很抱歉引入了非程序员解决方案,但我会简单地为每次迭代单独生成图,将它们放在 power point 中(一张幻灯片上的一个图),并使用一些花哨的幻灯片过渡效果(我尝试了随机条对您的示例产生影响,看起来不错)。

      如果您确定要找到基于 R 的解决方案,可以查看 animate 包(请参阅战略僵尸模拟示例 here)。

      【讨论】:

      • 这是可能的。不过,我不确定如何绘制单次迭代。我将如何分别绘制每个迭代?即,我将如何绘制 1)仅“研究”折线图,然后 2)“研究”和“临床工作”折线图,然后 3)“研究”、“临床工作”和“课程作业”折线图?
      • 您可以尝试在相应的数据子集上进行绘图,可以通过 e.g. subset(mydata,activity %in% c('research','coursework'))
      • 这通过使用 powerpoint 中的“擦拭”过渡(从左到右擦拭)来工作。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 2014-12-08
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多