分享

区域地图绘制方法汇总

 噼里啪啦脆 2016-05-29

前言

   地理分布应该是可视化的重要方法,这一期我将从地理坐标的获取,运用maptools、ggplot包等常用R包绘制地区地图,颜色及标签的添加这几个方面简单总结下区域地图的绘制方法。

一、地理坐标的获取

   绘制地图,其实就是对每个区域都是用一个多边形来表示,通过提供了每个区域其多边形逐点的坐标,然后R软件通过依次连接这些坐标,就绘制出了一个多边形区域。因此,要想绘制出想要的地图,首先必须获取相应的地理坐标。一般可以从以下几个途径获取:
  1. 国际权威地理网站下载

  2. 通过网络抓取维基百科等其他网站得到地理坐标

  3. 运用打包好的集成数据包

1.1  国际权威地理网址下载

   GADM <http:///>是世界行政区域(或行政区域界线)位置的空间数据库,可以用于地理信息系统和类似软件。这个数据库也提供了R语言数据格式。可以找到Download 选择中国,然后选择R数据格式,会有水平0-4从国家、省、市到县级地图坐标集下载。注意数据的读取有特定的语句readRDS:
library(maptools)
library(ggplot2)
library(sp)# 读取地理信息数据
china <-  readRDS('CHN_adm1.rds')
class(china)
## [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'
tables <- readHTMLTable(u,stringsAsFactors = FALSE)
raw <- tables[[1]]
zh_posi <- raw[-1, ]
colnames(zh_posi) = c('province', 'city', 'county', 'lon', 'lat')
zh_posi[, 4:5] = apply(zh_posi[, 4:5], 2, as.numeric)
save(zh_posi, file = 'zh_posi.rda')
tianjinlabel <- subset(zh_posi,province =='天津市')


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);
china_map=readShapePoly('bou2_4p.shp');
plot(china_map)


   运用plot语句,同样得到中国地理,这次有了我们的宝岛台湾了。这个数据包的数据类型同样是SpatialPolygonsDataFrame类型,里面包含了大量的地理信息,感兴趣的可以深入学习下它。

二、绘制区域地图的方法

2.1 运用maps包,mapdata包绘图

   maps包包应该是比较古老的绘图包,可以直接绘制出世界地图和美国各州郡的详细地图数据,绘制中国地图就得用到mapdata包,当然这个包也比较老了(据说有四川没有重庆)。    这是谢老大'用R画中国地图并标注城市位置'的代码,我直接贴上啦!通过上文的dat城市坐标数据,可以在地图上添加城市位置的标注,pos是放置标注上下左右的位置,可以通过maptools包中的pointLabel()改良,这个后面会说到。
library(maps)
library(mapdata)
map('china', col = 'darkgray', ylim = c(18, 54), panel.first = grid())
points(dat$jd, dat$wd, pch = 19, col = rgb(0, 0, 0, 0.5))
text(dat$jd, dat$wd, dat[, 1], cex = 0.9, col = rgb(0, 0, 0, 0.7), pos = c(2, 4, 4, 4, 3, 4, 2, 3, 4, 2, 4, 2, 2, 4, 3, 2, 1, 3, 1, 1, 2, 3, 2, 2, 1, 2, 4, 3, 1, 2, 2, 4, 4, 2))


2.2 运用maptools包绘图

   在上节地理坐标的获取中,我们运用的plot语句绘制的地图,就是运用maptools包绘制的。maptools包绘制地图可以参考统计之都的“用R软件绘制中国分省市地图”这篇非常优秀的博文来学习,里面包括颜色的填充及编写的函数,非常收益。在这里照猫画虎,绘制一个天津市区域地图试试。    首先通过readRDS语句获取中国各区县行政区域地理坐标,通过subset获取天津地区的坐标集,绘制出天津“海马”的轮廓,通过getColor2编制的函数给'宝坻区', '北辰区', '大港区' ,'蓟县'添加上颜色,并通过网络抓取的区县坐标给“海马”加上标签,运用pointLabel()函数可以自动调整标签位置,解决文本标签的重叠问题。
CHN3 <-  readRDS('CHN_adm3.rds')
tianjin <- subset(CHN3,CHN3@data$NAME_2=='Tianjin')
plot(tianjin)


getColor2=function(mapdata,name,col,othercol){    f=function(x,y) ifelse(x %in% y,which(y==x),0);
   colIndex=sapply(mapdata@data$NL_NAME_3,f,name);    
   fg=c(othercol,col)[colIndex 1];    
   return(fg);
   }
name=c('宝坻区', '北辰区', '大港区' ,'蓟县' );
col=c('red','green','yellow','purple');
plot(tianjin,col=getColor2(tianjin,name,col,'white'),xlab='',ylab='');
points(tianjinlabel$lon, tianjinlabel$lat, pch = 19, col = rgb(0, 0, 0, 0.5));
pointLabel(tianjinlabel$lon, tianjinlabel$lat, tianjinlabel$county, cex = 0.6, col = rgb(0,0, 0, 0.7))


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
xs<-data.frame(x,id=seq(0:924)-1)
china_map1<-fortify(china_map)
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)
CHN1 <-  readRDS('CHN_adm1.rds')
china.map <- fortify(CHN1)
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命令绘图
ggplot(vals, aes(map_id = id))    geom_map(aes(fill = val), map =china.map)    expand_limits(x = china.map$long, y = china.map$lat)    scale_fill_continuous(low = 'red2',high ='yellowgreen', guide = 'colorbar') xlab('') ylab('')



参考资料:

要想获取分析代码,可查看原文,进入本人的GitHub查看下载,或通过本人邮箱yuwenhuajiayou@sina.cn与本人联系



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多