标签归档:ggplot2

R时代,你要怎样画地图?

不知道各位平常有没有过需要画地图的需求,有的时候需要在地图上标出特定位置的数据表现或者一些数值,然而怎么实现?

这里主要介绍下在R语言中绘制地图的个人琢磨的思路。绘制地图步骤有三:

  1. 你得需要绘制地图;(约等于废话)
  2. 你得有要绘制地图的地理信息,经纬度啊,边界啊等等;
  3. 你得利用2的数据在R中画出来。

以上步骤中,目前最关键的是2,一旦2的数据有了,在R中不就是把它们连起来嘛,这个对于R来说就是调戏它,就跟全民调戏小黄鸡一样。

R语言中绘制地图的思路也是由于2的获取方式不一样而分开的。

第一种思路:有一些R包中存储着常见地图的数据,比如maps包中存有世界地图、美国地图、美国各州郡地图、法国地图以及加拿大城市地图等,加载了这个包,就可以轻松愉快地绘制上述地图。mapdata包中存有中国地图的数据,但是比较旧了,这个数据,重庆还没有从四川分出来呢。

总体来讲,第一种思路受包中已有的数据数量限制(但我R包多!),如果各个包中都没有梵蒂冈的信息,那咋办啊(其实可以通过绘制世界地图,然后限制区域把梵蒂冈画出来)。而且,如果我想画中国人民大学的地图怎么办???哭……

第二种思路:我先去一个地方下载所画图的地理数据,然后读入R进行绘制。比如由于mapdata中的中国地图比较久远了,谢老大的《终于搞定中国分省市地图》一文中就介绍了,先从国家基础地理信息中心下载中国各省市的地理数据,之后再绘制。后来肖凯老师又介绍googleVis包也可以按照这个思路来绘制地图,具体可参考《利用googleVis包实现环境数据可视化》(友情提示,需科学上网)。之后的OpenStreetMap包也是提供了方便下载地理数据的途径。

如您所看到的,第二种途径的步骤稍多,不利于大家上手。我知道,如果过程越长,越艰辛,最终绘制出地图的那一刻的快感就越强烈,但是“少折腾”的指示,还是提醒我们,尽量化繁为简。于是第三种的思路,就是既继承了第一种思路简洁的操作方式,又吸取了第二种思路的数据来源广泛的优势。

第三种思路:既然R是自由的,那我能不能直接去调取专业的地图企业或者网站的数据呢,这样就不会受包中数据集所限,我只需要有一个途径去专业的地图供应商那取数据就可以了,比如Google Map,Baidu Map等,这可都是专业的地图网站,里面的地理数据应有尽有,想取啥取啥。自由的R只需要连接Google Map的API,一切就都有了,当然Google大爷不会让你无限制的取数据,目前的限制是2000次(应该是单天的限制),于是ggmap包诞生了,两位作者David Kahle和 Hadley Wickham真是太会解放全球人民了,并且该包中有几个让我无比激动的命令,下文见!!!

继续阅读R时代,你要怎样画地图?

在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导出成了一个视频。

最后附上代码

日历中的夏天

看着有节,摸着无节,打一生活用品

不知不觉,夏日已慢慢临近。姑娘们飞扬的裙角,小贩叫卖的西瓜,蚊蝇嗡嗡的声音,以及翻过的一页日历,都提醒着你夏天快来了。夏季有着不同的定义:根据中国人的日历,我们所俗称的夏季从立夏开始,到立秋结束;但在气候学上,夏季是指连续五天平均温度超过22摄氏度即算作夏季的开始,若连续五天平均温度低于22度则算作入秋;而天文学上的夏季一般是指六、七、八这三个月。

那么哪一种夏季的定义更合适一些呢?还是用数据可视化来说话吧。这项任务基本上有两个步骤:一是获取某城市的2011年日平均温度数据,二是根据数据绘制日历热图(Calendar-Heatmap)继续阅读日历中的夏天