如何在R里面画一个动态图形之:gganimate 让你的统计图动起来!

\color{blue}{此文内容首发于微信公众号:R语言搬运工,关注公众号浏览更多精彩内容}

\color{red}{交流分享扣扣群:925920448}

--原文链接--

image.png

在绘图中,我们经常看到有动态的统计图,当然,在实际科研论文发表的时候,动图应用的比较少,但是在做ppt展示成果的时候,完全可以贴几张动态图,使可视化效果更好。下面开始我们学习旅程吧!

动态交互图的绘制在R中应用比较多的就是使用gganimate包,本文也主要是基于这个包讲解。首先,需要了解的是动图的原理:GIF格式的动图其实和动画片是相同的道理,就像是老式电影胶片,将多个图片按照顺序依次展示,给人一种动态的效果。在R语言中,也是将数据绘制成多个图像,然后按照一定的顺序依次播放,达到动态的效果。


image.png

先安装所需要的包:

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")
plot1.gif

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


image.png

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

▉ 先看一下包里的函数


image.png

函数有些多,这里简单介绍几个,方便于后边的使用:
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: 随着数据进行梯度展示

参数有点难懂,还是用例子画图观察不同的效果来认清一下他们比较方便:

\color{red}{▉ } \color{blue}{动态的点图(transition_time())}

使用包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")
image.png
  1. 通过函数transition_time() 添加动态图:


    plot2.gif
  2. 可以通过函数shadow_mark() 将原始数据也显示在背景中:(如下图)


    plot3.gif
  3. 可以通过函数shadow_wake为点的移动轨迹加个小尾巴:(如下图)


    plot4.gif
  4. 可以通过函数shadow_trail() 在点的移动轨迹上每隔一定梯度添加一个轨迹点,然后设置在一定时间后从尾部消失(注意观察下图中最右边单个点的轨迹):


    plot5.gif

\color{red}{▉ } \color{blue}{ 动态的点图(transition_states())}

函数transition_states()和view_zoom() 可以用来根据点的分布位置缩放显示:

原始点分布图如下:

ggplot(iris, aes(Petal.Length, Petal.Width, colour = Species)) +
  geom_point(show.legend = F)

image.png

\color{red}{1. view_zoom 添加动画效果图:}
plot7.gif

\color{red}{2. 使用参数pan_zoom=-3 换一下缩放的比例,效果如下:}
plot8.gif

\color{red}{ 3. 可以加view_step函数让点自己一步一步的移动,如下图:}
plot9.gif

\color{red}{4. 当不添加颜色分组时,效果如下:}
plot10.gif

\color{red}{5. 改变参数pause_first = TRUE, 使画面中一直出现点:}
plot11.gif

\color{red}{6. 改变参数wrap = FALSE:最后进行缩放}
plot12.gif

\color{red}{7. view_follow()函数的动态效果:}

plot13.gif

\color{red}{8. 固定X轴不缩放:}

plot14.gif

\color{red}{9. 或者设置X轴在0到4,和Y轴在0到2的范围内不缩放:}
plot15.gif

点图基本上介绍完了,现在开始学习一下柱状图的动态效果:

先加载数据

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")

image.png

\color{red}{1. 使用transition_states()函数加个动态:}
plot16.gif

\color{red}{2. transition_events() 控制条形图增长方式:} \color{blue}{(获取数据可以关注公众号(R语言搬运工)后台回复“数据819”进行下载)}

plot17.gif

柱状图介绍完了,接着我们来看折线图:

折线图也可以根据一个时间尺度进行动态化展示,如下图为不同月份的空气温度数据绘制的折线图和点图,进行动态展示后视觉效果会更好。


image.png

使用transition_reveal()函数添加动画


plot18.gif

除此之外,gganimate包还可以给箱型图、点阵图等加动态效果,喜欢的小伙伴赶紧去尝试一下吧!

\color{blue}{此文内容首发于微信公众号:R语言搬运工,关注公众号浏览更多精彩内容}

\color{red}{交流分享扣扣群:925920448}

精彩推荐:

R语言绘制散点图geom_point
R语言添加拟合曲线geom_smooth
R语言箱线图boxplot
R语言线图geom_line

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容