在R中实现动态气泡图

最近我逐渐发现了ggplot2这个包的好处——只要用过一次,就再也不想回头使用R中自带的作图函数了。前两天鼓捣完一个地图的数据,又受到统计之都最新文章的影响,我忽然想起了Hans Rosling在TED上的精彩演讲。在图中横坐标是国民收入,纵坐标是国民的期望寿命,气泡的大小则是该国人口。整个图从1800年的统计数据开始,一直到2009年不断动态地展示,图上的气泡也随着时间变化不停地抖动上升。有一位在斯坦福专做可视化的博士用JavaScript在网页上重现了这段动态效果图,点开页面即可观看:http://bost.ocks.org/mike/nations/

于是今天我便将这个图尝试着用R中的ggplot2与animation包实现了出来,边实现边研究ggplot2的用法,花了一天的时间做成了下面的这个视频

简单地说一下流程:首先是数据文件的获取。数据能够在github上找到,但是数据是JSON格式的,只有一行,因此我的大部分代码都在为让数据变成一个二维矩阵的形式而努力着……很多国家会出现某些年没有统计数据的情况,因此我用了线性插值填补。最后,有两个国家只有一年有数据,我只能将它们删掉了。

弄好了数据就可以使用ggplot2画图了。为了让图像好看,我调整了图像的属性,比如圆圈的大小范围,学习加边框,学习图中加文字(annotate)等语法。但我现在感觉还是有一些地方能够微调改进。

最后使用animation包中的saveMovie函数,结合ffmpeg导出成了一个视频。

最后附上代码

在R中实现动态气泡图》有12个想法

  1. 我觉得ggplot2在这个案例中最大的好处就是给每个国家自动生成漂亮的颜色。魔王做了一件我几年前就在琢磨但一直没有勇气做的事情:插值。animation默认输出的动画都是一蹦一蹦的,不是连贯的。

    2011年useR!会议的时候我发现有个人写了一个animatoR包(至今还没有发CRAN),主要工作就是插值。我没做这件事主要有两个原因:一是嫌麻烦,做一个特定的案例容易,但要做一个广泛的框架就不简单了(例如一个矩形过渡到另一个矩形等等);二是其它工具包里这个功能已经很成熟了,例如SVG(也就是魔王提到的D3背后的大靠山)。

    再次感谢魔王的贡献以及小轩哥的排版!

    1. 我记得您的animation包中就有一个动态气泡图的演示函数,使用的是R自带的作图功能。相比之下,我不得不说ggplot2的作者配色做得真的挺好,搭配起来让整个画面都显得很精致,估计是它流行的一个重要因素。
      另外,将单张图片变成GIF从原理上只能是一蹦一蹦的吧,除非向flash学习,在这中间插入更多帧画面,这时候就要人为控制每帧画面了。如果将animation与ggplot2结合起来,会发现这里有个缺点:ggplot2的绘图速度比较慢。上面的视频一共用到了230帧图片,R中绘制这些图即花去了一分钟左右的时间。如果还要做得更细致一些,那就难以忍受了……

      1. 对啊,我当时就想ggplot2虽然更新了绘图速度有提升,但是做成动画想这么流畅还是不容易的。速度看来还是限制ggplot2的一个因素啊~

  2. 好吧,最近一直有点忙,你做得这个东西,不日会看到HTML5版本,基于前端流畅交互,无需插值噢。。。:)

  3. 问一个正则的问题:data=unlist(strsplit(rawdata,"\[\{"|":"|","|":\[\[|\],\[|\]\],"|\]\]\},\{"|\]\]\}\]")),为什么正则里面有两个反斜杠,而原始数据里面没有反斜杠啊。为什么换成一个就行不通了

发表评论

邮箱地址不会被公开。 必填项已用*标注