如何在R里面画一个动态图形之:gganimate 让你的统计图动
--原文链接--

在绘图中,我们经常看到有动态的统计图,当然,在实际科研论文发表的时候,动图应用的比较少,但是在做ppt展示成果的时候,完全可以贴几张动态图,使可视化效果更好。下面开始我们学习旅程吧!
动态交互图的绘制在R中应用比较多的就是使用gganimate包,本文也主要是基于这个包讲解。首先,需要了解的是动图的原理:GIF格式的动图其实和动画片是相同的道理,就像是老式电影胶片,将多个图片按照顺序依次展示,给人一种动态的效果。在R语言中,也是将数据绘制成多个图像,然后按照一定的顺序依次播放,达到动态的效果。

先安装所需要的包:
install.packages("devtools")
devtools::install_github("jl5000/barRacer")
install.packages("gapminder")
install.packages("gifski")
为使绘制动态图更加方便,有人开发了barRacer包用来快捷的绘制动态图,以网站的例子试一下:
代码来自网站 https://github.com/jl5000/barRacer
library(barRacer)
bar_chart_race(gapminder::gapminder, cat_col=country, val_col=pop, time_col=year,
max_bars=20,duration=10,fps=10,width=1200,
height=900,title = "Population over time")

数据展示不同年每个国家人口数的情况,以时间为线动态展示出来(点击一下上图观看效果)。

gganimate包是包含了各种动态图绘制函数的比较常用的工具,柱状图、点图、线图、箱型图等各种动态图的绘制均离不开这个包。具体的实现的方法请往下看:
▉ 先看一下包里的函数

函数有些多,这里简单介绍几个,方便于后边的使用:
animate:调整图像动态效果
anim_save: 保存所绘制的图像
enter: 设置图像进去的行为方式
exit: 设置图像退出的行为方式
shadow_mark: 将原始已出现过的数据保留在图中
shadow_trail: 在移动轨迹上设置一定的长度保留一个数据
shadow_wake: 设置图形移动轨迹上的足迹
transition_components: 在动态周期内转换单个组件
transition_events: 使单个组件依次进入和退出,适用于柱状图
transition_filter: 在不同组件之间进行切换
transition_layers: 按照不同图层进行展示不同分组
transition_manual: 通过直接指定框架成员来创建动画
transition_null: 保持所有数据一致性展示
transition_reveal: 按照一个序列依次展示数据
transition_states: 根据数据不同阶段进行过渡展示
transition_time: 在时间序列上展示
view_follow: 根据数据分布位置移动绘图面板
view_static: 规定某一个窗口展示数据
view_step: 随着数据进行梯度展示
参数有点难懂,还是用例子画图观察不同的效果来认清一下他们比较方便:
使用包gapminder里的数据作为展示示例,先画一个点图:
library(ggplot2)
ggplot(gapminder,aes(x=gdpPercap,y=lifeExp,size=pop,color=country))+
geom_point(show.legend=F,alpha=0.7)+
scale_color_viridis_d()+
scale_size(range=c(2,12))+
scale_x_log10()+
labs(subtitle = 'year:{frame_time}',title="abs")

-
通过函数transition_time() 添加动态图:
plot2.gif
-
可以通过函数shadow_mark() 将原始数据也显示在背景中:(如下图)
plot3.gif
-
可以通过函数shadow_wake为点的移动轨迹加个小尾巴:(如下图)
plot4.gif
-
可以通过函数shadow_trail() 在点的移动轨迹上每隔一定梯度添加一个轨迹点,然后设置在一定时间后从尾部消失(注意观察下图中最右边单个点的轨迹):
plot5.gif
函数transition_states()和view_zoom() 可以用来根据点的分布位置缩放显示:
原始点分布图如下:
ggplot(iris, aes(Petal.Length, Petal.Width, colour = Species)) +
geom_point(show.legend = F)










点图基本上介绍完了,现在开始学习一下柱状图的动态效果:
先加载数据
mean.temp <- airquality %>%
group_by(Month) %>%
summarise(Temp=mean(Temp)) %>%
mutate(class="A")
mean.temp
# A tibble: 5 x 3
Month Temp class
<int> <dbl> <chr>
1 5 65.5 A
2 6 79.1 A
3 7 83.9 A
4 8 84.0 A
5 9 76.9 Axian'ka
先看一下静态图是什么样子的:
ggplot(mean.temp,aes(Month,Temp,fill=Temp))+
geom_col()+
theme_minimal()+
theme(legend.position = "right")



柱状图介绍完了,接着我们来看折线图:
折线图也可以根据一个时间尺度进行动态化展示,如下图为不同月份的空气温度数据绘制的折线图和点图,进行动态展示后视觉效果会更好。

使用transition_reveal()函数添加动画

除此之外,gganimate包还可以给箱型图、点阵图等加动态效果,喜欢的小伙伴赶紧去尝试一下吧!
精彩推荐:
R语言绘制散点图geom_point
R语言添加拟合曲线geom_smooth
R语言箱线图boxplot
R语言线图geom_line