标签归档:地图

REmap入门示例

REmap是一个基于Echarts2.0 http://echarts.baidu.com 的一个R包。主要的目的是为广大数据玩家提供一个简便的,可交互的地图数据可视化工具。目前托管在github,https://github.com/lchiffon/REmap

使用如下步骤安装:

library(devtools)
install_github('lchiffon/REmap')

REmap目前更新到V0.3,提供百度迁徙,分级统计,百度地图,热力图等功能的实现。

提示:请使用Chrome或者Firefox来作为默认浏览器

最后要声明的一点:这个包的目的是简化使用和学习的流程,如果你是一个好学的geek,请深入的学习Echarts!

特性

  1. 使用Echarts2.0封包,地图绘制使用的是SVG图形
  2. 采用百度API来自动获取城市的经纬度数据
  3. 支持Windows!

继续阅读REmap入门示例

R绘制中国航线分布夜景图

本文作者:李根,资深数据分析师,数学爱好者。

绘制数据地图是一种有效展现空间数据的方法,美丽的数据展示更容易引起读者的共鸣。本地图设计的初衷是展示中国航线的分布规律,进而可以分析成本、客流量等问题。

flight-night-scene本文参考了以下文献进行绘制:
http://spatialanalysis.co.uk/2012/06/mapping-worlds-biggest-airlines/

一、地图数据来源

地图所使用的数据均可以从网上下免费下载。
航线、机场坐标:http://openflights.org/data.html

  • 机场:airports.dat
  • 航线:routes.dat

板块地图、都市地图:http://www.naturalearthdata.com/downloads/

  • 世界地图:ne_10m_admin_0_countries.shp
  • 都市地图:ne_10m_urban_areas.shp

(注:都市地图是用来绘制灯光效果的。)

继续阅读R绘制中国航线分布夜景图

R绘制中国地图,并展示流行病学数据

本文作者:姜晓东,博士毕业于上海交通大学,目前任教于湖南师范大学医学院,专业神经毒理学。

流行病学的数据讲究“三间分布”,即人群分布、时间分布和空间分布。其中的“空间分布”最好是在地图上展示,才比较清楚。R软件集统计分析与高级绘图于大成,是最适合做这项工作了。关于地图的绘制过程,谢益辉、邱怡轩和陈丽云等人都早有文章讲述,开R地图中文教程之先河。由于目前指导毕业论文用到,因此研究了一下。本来因为网上教程很多,曾打消了写些文字的计划,但怡轩版主鼓励说“教程者众,整合者鲜”,所以才战胜拖延症,提起拙笔综述整合一下,并对DIY统计GIS地图提出了一点自己的想法。

1 地图GIS数据的来源与R绘制软件包

中国地图GIS数据的官方数据可以在国家基础地理信息中心的网站(http://nfgis.nsdi.gov.cn)里面可以免费下载。官方公开的数据包括:地图数据,及居住地、交通、河流等辅助数据。今年6月开始,官方正组织开始制作新版数据。老数据暂时无法下载,读者要自行百度搜索,本文以旧版数据为例。旧版地图数据中部分地名和地市区划已经过时,使用时需注意。

地图数据有4个压缩文件:bou1_4m.zip、bou2_4m.zip、bou3_4m.zip和bou4_4m.zip。bou代表边界的意思,数字1~4代表国家、省、市、县的4级行政划分;4m代表比例是400万分之一,这个比例的图形是公开的。每个文件解压缩后含有两类文件:以字母p结尾的表示多边形数据,用来绘制区域;以字母l结尾的文件是线形数据,用来绘制边界。但是老版数据中,市级数据中缺少绘制区域的多边形数据,让市级分布图的绘制稍麻烦一些,新版中也许会有改进。

用R绘制地图比较简单。比如画一下全国范围的区域,可以用如下代码:

library(maptools)
mydat = readShapePoly("maps/bou1/bou1_4p.shp")
plot(mydat)

unnamed-chunk-1
但是,可以看出这样绘制的地图的形状有些扁平。这是因为,在绘图的过程中,默认把经度和纬度作为普通数据,均匀平等对待,绘制在笛卡尔坐标系上造成的。其实,地球的球面图形如何映射到平面图上,在地理学上是有一系列不同的专业算法的。地图不应该画在普通的笛卡尔坐标系上,而是要画在地理学专业的坐标系上。在这一点上,R的ggplot2包提供了专门的coord_map()函数。所以推荐R的ggplot2包来绘制地图。

library(ggplot2)
mymap = ggplot(data = fortify(mydat)) +
    geom_polygon(aes(x = long, y = lat, group = id), colour = "black",
                 fill = NA) +
    theme_grey()
print(mymap + coord_map())

unnamed-chunk-2
这次中国地图的形状与百度地图一样了。 继续阅读R绘制中国地图,并展示流行病学数据

粉丝地图的可视化

Rweibo问世以来,我就对它的可视化感到兴趣盎然。通过它我们可以得到微博关注者的各项信息,其中比较有意思的一项是地点(location),这也就意味着,通过关注者的location(省市),可以找到他们的地理分布信息,同时,又可以得到他们的粉丝数目信息(可以判断是否是“微博名人”)。所以,既然万事俱备,为什么不用它做个“粉丝地图”来展示个人的粉丝信息呢?通过如下五步,我便基本得到了我想要的效果。

  1. 收集关注者的信息,整理地点信息;
  2. 获取并整理经纬度信息;
  3. 结合Himsic与ggmap包绘制图形;
  4. 结合animation包绘制动态图形。

1. 收集关注者的信息,整理location信息

首先,收集关注者的信息,并进行整理,我的做法是去除在“海外”,或者所在地为“其他”的人群(如果市的信息为“其他”而省份不为“其他”,令它与省份相同)。整理工作的代码如下:

roauth < - createOAuth(app_name = "pudding", access_name = "rweibo")
my_fri <- friendships.friends(roauth, uid = 2530951134, count = 200, cursor = 0)
save(my_fri, file = "my_fri.rda")
fri = my_fri[[1]]
info1=lapply(fri,function(x) c(x$name,x$location,x$followers_count))
info=do.call(rbind,info1)
loc=strsplit(info[,2]," ")
a=do.call(rbind,loc)
a[,1][a[,1]=="台湾"]="台"
a[,2][a[,2]=="台湾"]="台"
a[,2][a[,2]=="其他"]=a[,1][a[,2]=="其他"]
 
myfri=data.frame(name=info[,1],province=a[,1],city=a[,2],loc=apply(a,1,paste,collapse=" ")
 ,follower=as.numeric(info[,3]))
myfri=myfri[which(myfri$province!="其他"&myfri$province!="海外"),]

2. 获取并整理经纬度信息

不过,有了地理位置的名称是不够的,我们必须知道他们的经纬度信息,这一部分信息可以通过网页抓取而得:

library(XML)
# get data from web
webpage < - "http://blog.csdn.net/svrsimon/article/details/8255051"
tables <- readHTMLTable(webpage, stringsAsFactors = FALSE)
raw <- tables[[1]]
zh_posi <- raw[-1, ]
colnames(zh_posi) = c("province", "city", "county", "lon", "lat")
save(zh_posi, file = "zh_posi.rda")
zh_posi$loc = apply(zh_posi[, 1:3], 1, paste, collapse = " ")
zh_posi[, 4:5] = apply(zh_posi[, 4:5], 2, as.numeric)

get.loc <- function(loc) {
    pro = grepl(loc[1], zh_posi$loc)
    cit = grepl(loc[2], zh_posi$loc)
    match = which(pro & cit)
    show(match)
    return(c(mean(zh_posi$lon[match]), mean(zh_posi$lat[match])))
}

b = apply(myfri[, 2:3], 1, get.loc)
myfri$lon = b[1, ]
myfri$lat = b[2, ]

鉴于关注人数在某些地区过于集中,此处只取在这些地区的均值表示:

library(sqldf)
myfri2 = sqldf("select province,city, avg(lon) as m_lon,avg(lat) as m_lat, avg(follower) as m_fol from myfri group by province,city")
Encoding(myfri2$province) = "UTF-8"
Encoding(myfri2$city) = "UTF-8"

继续阅读粉丝地图的可视化

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时代,你要怎样画地图?