上次关于gganimate的动画效果不知道各位觉得如何?
微笑牛油果:随笔:R 语言动图之gganimatezhuanlan.zhihu.com老板是满意了,但我非常不满意,我原本想的是在R里实现类似Line chart race的动画。但老实说,上一篇文章那种效果我拿静态图用ppt来做也能完美还原,因此之后我又尝试了gganimate中更多的函数,终于得到了还可以的结果。顺带一提,gganimate这个包学习起来不麻烦,麻烦的是有些依赖包需要自己手动再安装,输出也要一直试错,本文中也会提到一些报错的解法。
如果要做出更好的动态效果,可以参考gganimate的views系列函数,详见:
Function referencegganimate.com这系列函数功能是坐标轴动态缩放。
举个例子,一个静态坐标轴的动图是这样的:

代码:
ggthemr('fresh')
anim<-ggplot(test, aes(x = datetime, y = Variable1)) +
geom_line(aes(color = Variable2), size = 0.75)+
scale_color_brewer(palette = 'Dark2',
name = 'Variable2')+
scale_x_date(name = 'Date',
date_labels = '%Y-%m-%d')+
scale_y_continuous(name = 'Variable1')+
transition_reveal(datetime)+
theme(axis.line = element_line(color = 'black', size = 1),
axis.text = element_text(color = 'black'),
axis.title = element_text(color = 'black', face = 'bold'),
legend.title = element_text(color = 'black', face = 'bold'),
legend.text = element_text(color = 'black'),
legend.position = 'none',
panel.grid = element_blank())
anim
而一个动态坐标轴的动图是这样的:

代码:
ggthemr('fresh')
anim<-ggplot(test, aes(x = datetime, y = Variable1)) +
geom_line(aes(color = Variable2), size = 0.75)+
scale_color_brewer(palette = 'Dark2',
name = 'Variable2')+
scale_x_date(name = 'Date',
date_labels = '%Y-%m-%d')+
scale_y_continuous(name = 'Variable1')+
transition_reveal(datetime)+
theme(axis.line = element_line(color = 'black', size = 1),
axis.text = element_text(color = 'black'),
axis.title = element_text(color = 'black', face = 'bold'),
legend.title = element_text(color = 'black', face = 'bold'),
legend.text = element_text(color = 'black'),
legend.position = 'none',
panel.grid = element_blank())+
view_follow()
anim
他们的代码之间只差一个view_follow(),但很明显带给人的视觉冲击是不一样的。
如果我们把上面代码中的transition_reveal(datetime)改成transition_time(datetime)的话,每一帧的x轴就会被限定在一个小范围,效果会变成这样:

当然这种图表类型不太适合这种表现方式,这里想说的是transition_time()需要事先加载transformr包,而安装gganimate的时候程序不会自动帮你装......
view系列的函数会自动对图片之间进行补帧,默认的fps = 10,如果只是做gif的话,这样的效果就可以了,但有时候我们希望动画看起来流畅一些,并且时长长一些(20秒以上),这时候比较推荐输出成视频。
关于视频输出,帮助文档也做了挺完整的介绍,但实践起来问题还是挺多的。
我们先来看看输出视频的函数:
anim_save(anim, filename = 'zhihu4.mp4',
fps = 20,
duration = 90,
device = 'png',
type = 'windows',
antialias = "cleartype",
renderer = av_renderer(),
width = 600, height = 300)
第一个槽点是fps只能设置为100的因数,好像所有提供的渲染器都有这个限制。
一些device类型跟渲染器需要额外安装包,但就算安装了输出也可能会报错。最后还是像素类的device(jpeg、png等)+ av_renderer()能够做到正常的输出。
antialias是抗锯齿,设置成cleartype能输出较高质量的视频,但实际上没有太多区别...
此外,对于上面那个案例,使用transition_time()制作的动图用视频输出会报错
虽然槽点蛮多的,但比起gif,输出成视频不会造成程序卡死,也算是可行的方案了。一般fps设置到20以上就能获得蛮流畅的动态效果。
输出后console会显示信息:

90秒的动画,一共1801张图片,各位可以输出成gif试试,试试就逝世...
输出的视频如下:
