r中绘图不显示legend也不报错_R 语言动图之gganimate:更多动态效果

本文介绍了如何在R中使用gganimate创建动态坐标轴的图表,强调了view系列函数的作用,如view_follow(),并讨论了transition_time()的使用。文章还提及了在制作动画过程中遇到的依赖包安装、图片补帧、视频输出参数调整等问题,包括fps限制、设备渲染选择和抗锯齿设置。最后,作者分享了一个可能报错的情况,但指出输出视频相对于gif的优点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上次关于gganimate的动画效果不知道各位觉得如何?

微笑牛油果:随笔:R 语言动图之gganimate​zhuanlan.zhihu.com

老板是满意了,但我非常不满意,我原本想的是在R里实现类似Line chart race的动画。但老实说,上一篇文章那种效果我拿静态图用ppt来做也能完美还原,因此之后我又尝试了gganimate中更多的函数,终于得到了还可以的结果。顺带一提,gganimate这个包学习起来不麻烦,麻烦的是有些依赖包需要自己手动再安装,输出也要一直试错,本文中也会提到一些报错的解法。

如果要做出更好的动态效果,可以参考gganimate的views系列函数,详见:

Function reference​gganimate.com

这系列函数功能是坐标轴动态缩放。

举个例子,一个静态坐标轴的动图是这样的:

a0f52ea254fdf249a8b4ce266401ea45.gif

代码:

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

而一个动态坐标轴的动图是这样的:

1308f1657a399fc6e3e32bc601344250.gif

代码:

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轴就会被限定在一个小范围,效果会变成这样:

6899ab5ae28eadb00767e6895bce0535.gif

当然这种图表类型不太适合这种表现方式,这里想说的是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会显示信息:

6523650926b904ecb7cd4884627e1852.png

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

输出的视频如下:

514b4642ba93161ee7007409b48df650.png
gganimate动态趋势线视频https://www.zhihu.com/video/1217530136381210624
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值