哈佛教授公开R语言源码,教你用R制做gif动图

做者Rafael Irizarry是哈佛大学以及the Dana-Farber Cancer Institute的应用统计教授,他专一于研究基因组学,而且教授数门数据科学课程。在本文中他公开了本身授课时所使用的gif动图的R语言源码,同时也对涉及的几个话题进行了简单的论述,对于但愿了解数据科学原理、如何使用R语言来进行可视化的读者都有所助益。
php


本文长度为1800字,建议阅读4分钟。git

本文受权转自数据派THU(ID:DatapiTHU)github

做者 | Rafael Irizarry算法

翻译 | 贾琳数据库

在平常教学的过程当中,我有时会用动画来形象地解释概念,而且经过 @rafalab帐号(https://twitter.com/rafalab)在社交媒体上分享。api

John Storey最近问我是否能够公开这些源代码。因为我不甚有条理,并且这些动画都是灵机一动想出来的,因此以前这些代码分散在几个不相关联的文件中。John的请求促使我把这些代码整理在一块儿发布在这里。
函数

全部的gif动图都是用R语言绘制的数张图片的叠加。在代码中你能够发现,我用几种不一样的方法将单独的图片转化成动态gif图。
工具

第一种方法(不推荐)是将图片文件存储下来,而后调用ImageMagick转化工具(https://www.imagemagick.org/script/index.php)。
学习

在R环境下,我如今使用的方法是animation包的saveGIF函数,这是经过读者Yihui Xie在我simplystats博客下面的评论学习到的。当用ggplot画图时,我会使用David Robinson的gganimate包(https://github.com/dgrtwo/gganimate)。
动画

最后一种方法是我在加特效(例如调相)时会用到的:在线Animated GIF maker(https://ezgif.com/maker)。

如下就是这些gif动图的源代码,我大体按流行程度排序。由于代码是很着急写出来的,请不要过于苛责我。事实上,你能够随意批判,这就是咱们学习的方式。

辛普森悖论

这张gif阐述的是辛普森悖论:咱们看到X变量和Y变量有很强的负相关关系。不过,一旦咱们用一个混杂因素Z变量进行分层,用不一样颜色来表示Z,每一层中的相关性就会转化为正相关。这里的数据是虚构的,不过假设说X表明学生参加辅导的次数,Y表明九年级的测验分数,而后再用八年级的测验分数Z来对学生进行分层,咱们也会发现这样的现象。


这张动图仅用三张图片组成。我用RStudio的Export功能将它们把存下来,而后用Animated GIF maker(https://ezgif.com/maker)来制做gif。如下是这三张图片的代码:


局部加权回归散点平滑法(Loess)

我分享的第一个教学动图是为了解释局部加权回归散点平滑法(Loess)的原理。具体来讲,咱们对于每个自变量,好比x0,都让其对任何一个临近点有正的加权值,用加权回归拟合一条线,保留通过拟合所得的结果,而后移动向下一个点。


这里的数据来源是某个基因芯片实验。图中所示的是MA图,即比例对数与对数平均值之间的关系。我用animation包来保存gif动图。


预期寿命 vs 生育率

这个gif动图是复制Hans Rosling(https://en.wikipedia.org/wiki/ Hans_Rosling)在他的演讲“关于贫穷的新发现”—New Insights on Poverty,(https://www.ted.com/talks/ hans_rosling_reveals_new_insights_on_poverty?language=en)中展现的动画。

该图很好地展示出数据可视化在消除误解方面的做用,Hans Rosling经过这张动图展现了现在并不如40年前同样可以简单将世界划分红两半。以前,人们通常把世界分为拥有更长寿命、较少家庭人口的西方富有国家和较短寿命、较多家庭人口的发展中国家,而这个图向咱们展现了这种划分的不合理性。


感谢gganimate包,画这个图使用的代码很是简单。


联合国选举模式

这里,咱们使用Erik Voeten和Anton Strezhnev提供的联合国选举数据来阐释距离的概念。


如下是代码。整理数据的代码是由David Robinson(https://twitter.com/drob)提供的。你会看到咱们将随时间变化的距离进行了平滑处理,从而避免一些点跳动范围过大。




随机森林

在过去的很长一段时间里,我都以为很难理解为什么随机森林做为一种基于树的算法,却可以产平生滑的预测。这里的gif图帮助我理解了缘由。我用的是2008年总统选举的数据库,由于我认为该数据的趋势整体是平滑的,可是有几个尖锐的边,就连局部加权回归散点平滑法都很难预测。须要注意的是,咱们只有一个影响因素,这个gif并不能展现出随机森林的另外一个重要特色:随机的特征选取能够减小树与树之间的相关程度。


你能够看到我在代码中使用的方式是传统的、我并不推荐的方式:保存全部的图片文件而后调用系统指令转化。



生态谬误

在分享辛普森悖论的动图之后,有些人问我生态谬误是否是相同的状况。其实这两者是不一样的。生态谬误是咱们试图经过平均值的强相关性来推断个体之间的相关性。为了更好的解释,我用dslabs包中自带的gapminder的数据(http://gapminder.org/)画出了一个动图,展现新生儿存活率的对数与日均收入的对数之间的关系。能够看到在地区层面上两者相关度很高,但在各个国家层面上相关度很低。这是由于同一地区国家与国家之间的差别致使的。



这张gif只由三张图构成。我用RStudio的Export功能保存图片,而后用Animated GIF maker(https://ezgif.com/maker)来制做gif。

第一张图是地区平均值;撒哈拉以南非洲国家的数值,你能够看到一个平均值被分红数个不一样的数值;第三张是全部国家的状况。我标出了一些(与本地区相比)变化较大的国家,而且用了色盲也能识别的颜色。这里的代码有些复杂,缘由是我不得不对Gapminder数据进行预处理。




贝叶斯定律

这个简单的动图展现的是将一种很是准确的诊断方法应用于一个发病率很低的群体的诊断结果。它展现出来的是,在已知诊断结果是阳性的状况下发病的先验几率,比该诊断方法的初试准确率要低。你能够用贝叶斯定律来肯定真实的条件几率。

更多细节请参考这里

https://simplystatistics.org/2014/10/17/bayes-rule-in-a-gif/


由于咱们要作动态图,代码有一些复杂难懂。


吃豆子

最后,我作了这个动画,向大家展现饼图惟一的用处。




原文标题:

Code for my educational gifs

原文连接:

https://simplystatistics.org/2017/08/08/code-for-my-educational-gifs/

译者简介:贾琳,清华大学2012级本科毕业生,现就读于美国达特茅斯学院工程管理硕士专业。爱好数据分析、数据科学,期待在数据派THU这个平台上向更多志同道合的朋友学习和交流。
相关文章
相关标签/搜索