R 中的动画 ggplot2 堆叠折线图
Animate ggplot2 stacked line chart in R
我正在尝试在 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")
我正在寻找第一张显示所有坐标轴和文本的图像。第二次迭代,我想随着时间的推移从左到右逐渐显示 "Research" 堆叠线(包括颜色和边框)。第三次迭代,我想从左到右逐渐显示 "Clinical Work" 堆叠线。四、"Coursework"叠行。最后,"Teaching" 堆叠线。
理想情况下,输出格式应该非常流畅(没有锯齿状的跳跃)并且与 PowerPoint 兼容。
很抱歉引入了一个非程序员的解决方案,但我会简单地为每次迭代分别生成图表,将它们放在 power point 中(一张幻灯片上的一个图表),并使用一些奇特的幻灯片过渡效果(我试过随机条对你的例子有影响,看起来不错)。
如果您决定寻找基于 R 的解决方案,您可以查看 animate
程序包(参见 Strategic Zombie Simulation 示例 here)。
这是一个基于 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()
}
我正在尝试在 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")
我正在寻找第一张显示所有坐标轴和文本的图像。第二次迭代,我想随着时间的推移从左到右逐渐显示 "Research" 堆叠线(包括颜色和边框)。第三次迭代,我想从左到右逐渐显示 "Clinical Work" 堆叠线。四、"Coursework"叠行。最后,"Teaching" 堆叠线。
理想情况下,输出格式应该非常流畅(没有锯齿状的跳跃)并且与 PowerPoint 兼容。
很抱歉引入了一个非程序员的解决方案,但我会简单地为每次迭代分别生成图表,将它们放在 power point 中(一张幻灯片上的一个图表),并使用一些奇特的幻灯片过渡效果(我试过随机条对你的例子有影响,看起来不错)。
如果您决定寻找基于 R 的解决方案,您可以查看 animate
程序包(参见 Strategic Zombie Simulation 示例 here)。
这是一个基于 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()
}