前言 地理分布应该是可视化的重要方法,这一期我将从地理坐标的获取,运用maptools、ggplot包等常用R包绘制地区地图,颜色及标签的添加这几个方面简单总结下区域地图的绘制方法。 一、地理坐标的获取 绘制地图,其实就是对每个区域都是用一个多边形来表示,通过提供了每个区域其多边形逐点的坐标,然后R软件通过依次连接这些坐标,就绘制出了一个多边形区域。因此,要想绘制出想要的地图,首先必须获取相应的地理坐标。一般可以从以下几个途径获取:
1.1 国际权威地理网址下载 GADM <http:///>是世界行政区域(或行政区域界线)位置的空间数据库,可以用于地理信息系统和类似软件。这个数据库也提供了R语言数据格式。可以找到Download 选择中国,然后选择R数据格式,会有水平0-4从国家、省、市到县级地图坐标集下载。注意数据的读取有特定的语句readRDS: library(maptools) library(ggplot2) ## [1] 'SpatialPolygonsDataFrame'
## attr(,'package')
## [1] 'sp' plot(china) plot(china[1:10,]) 需要学习的是读取的数据集是SpatialPolygonsDataFrame类型,属于sp包,并且是S4类型的data.frame。这部分的学习可以参考张丹老师的R的极客理想系列文章:R语言天气可视化应用。通过china@data,可以看到中国31个省的信息(为什么没有台湾,坑爹啊)。通过plot语句就可以画出中国的轮廓了。当然也可以画出前10个省的轮廓。 1.2 通过网络抓取地理坐标 在网络上有相当多的绘制地图的方法,当然也有大侠们总结的地理坐标啦。比如说这是谢老大博客里的各城市的地理坐标: dat = read.csv(text = '城市,jd,wd
北 京,116.4666667,39.9
上 海,121.4833333,31.23333333
天 津,117.1833333,39.15
重 庆,106.5333333,29.53333333
哈尔滨,126.6833333,45.75
长 春,125.3166667,43.86666667
沈 阳,123.4,41.83333333
呼和浩特,111.8,40.81666667
石家庄,114.4666667,38.03333333
太 原,112.5666667,37.86666667
济 南,117,36.63333333
郑 州,113.7,34.8
西 安,108.9,34.26666667
兰 州,103.8166667,36.05
银 川,106.2666667,38.33333333
西 宁,101.75,36.63333333
乌鲁木齐,87.6,43.8
合 肥,117.3,31.85
南 京,118.8333333,32.03333333
杭 州,120.15,30.23333333
长 沙,113,28.18333333
南 昌,115.8666667,28.68333333
武 汉,114.35,30.61666667
成 都,104.0833333,30.65
贵 阳,106.7,26.58333333
福 州,119.3,26.08333333
台 北,121.5166667,25.05
广 州,113.25,23.13333333
海 口,110.3333333,20.03333333
南 宁,108.3333333,22.8
昆 明,102.6833333,25
拉 萨,91.16666667,29.66666667
香 港,114.1666667,22.3
澳门,113.5,22.2') 当然,必须还得介绍个更全的,通过XML包抓取网络数据:
通过抓取HTML中table数据,我们得到全国各省市、区县的数据。这里我取了天津地区的地理坐标子集。 library(XML)u <- 'http://blog.csdn.net/svrsimon/article/details/8255051' 1.3 运用打包好的集成数据包 从学习中发现,大多分析从<http:///wp-content/uploads/2009/07/chinaprovinceborderdata_tar_gz.zip>下载中国地图的GIS数据,这是一个压缩包,完全解压后包含三个文件(bou2_4p.dbf、bou2_4p.shp和bou2_4p.shx),将这三个文件解压到同一个目录下,并在R中设好相应的工作空间,然后安装maptools包,运行如下程序: library(maptools); 运用plot语句,同样得到中国地理,这次有了我们的宝岛台湾了。这个数据包的数据类型同样是SpatialPolygonsDataFrame类型,里面包含了大量的地理信息,感兴趣的可以深入学习下它。 二、绘制区域地图的方法2.1 运用maps包,mapdata包绘图 maps包包应该是比较古老的绘图包,可以直接绘制出世界地图和美国各州郡的详细地图数据,绘制中国地图就得用到mapdata包,当然这个包也比较老了(据说有四川没有重庆)。
这是谢老大'用R画中国地图并标注城市位置'的代码,我直接贴上啦!通过上文的dat城市坐标数据,可以在地图上添加城市位置的标注,pos是放置标注上下左右的位置,可以通过maptools包中的pointLabel()改良,这个后面会说到。 library(maps) library(mapdata) 2.2 运用maptools包绘图 在上节地理坐标的获取中,我们运用的plot语句绘制的地图,就是运用maptools包绘制的。maptools包绘制地图可以参考统计之都的“用R软件绘制中国分省市地图”这篇非常优秀的博文来学习,里面包括颜色的填充及编写的函数,非常收益。在这里照猫画虎,绘制一个天津市区域地图试试。
首先通过readRDS语句获取中国各区县行政区域地理坐标,通过subset获取天津地区的坐标集,绘制出天津“海马”的轮廓,通过getColor2编制的函数给'宝坻区', '北辰区', '大港区' ,'蓟县'添加上颜色,并通过网络抓取的区县坐标给“海马”加上标签,运用pointLabel()函数可以自动调整标签位置,解决文本标签的重叠问题。 CHN3 <- readRDS('CHN_adm3.rds') getColor2=function(mapdata,name,col,othercol){
f=function(x,y) ifelse(x %in% y,which(y==x),0); 2.3 运用ggplot绘图 ggplot2作为R的图形系统,其最鲜明的特点在于其分层语法,即把图像元素一层层叠加在基础画布之上。事实上,一张主题地图就相当把地图作为画布,而把基于地理的信息表现在地图上。如果作为基础画布的地图和ggplot2的分层语法结合起来,那么就能更高效绘制主题地图。这部分的学习可参考豆瓣网:数据铺子<https://site.douban.com/182577/room/2177990/>相关博文。
ggplot方法利用地图坐标,首先需要把SpatialPolygonsDataFrame类型数据转换为数据框,并要求有 x 或long, y 或 lat, 及 region 或 id。可通过help(geom_map)查看。
通过fortify函数转换为数据框,运用ggplot() geom_类型绘制地图。下面分别是运用geom_ploygon()绘制不同省份色彩图及geom_map()绘制全国降雨量的区域地图。 x<-china_map@data library(plyr) china_mapdata<-join(china_map1, xs, type = 'full') #合并两个数据框 ggplot(china_mapdata, aes(x = long, y = lat, group = group,fill=NAME)) geom_polygon( ) geom_path(colour = 'grey40') scale_fill_manual(values=colours(),guide=FALSE) library(sp) ater <- c(1085,325,1473,3524,1079,2935,3989,2790,4147,358,2046,434,1652,2490,451,3362,1467,871,2145,182,1000,12278,448,377,182,1221,3135,152,4976,10000,5298)vals <- data.frame(id =unique(china.map$id),val=water)# 用ggplot命令绘图 参考资料:
要想获取分析代码,可查看原文,进入本人的GitHub查看下载,或通过本人邮箱yuwenhuajiayou@sina.cn与本人联系 |
|