用R软件绘制中国分省市舆图
用R软件绘制中国分省市舆图
【注】新版本的maptools包对许多函数举办了修改,对付修改的内容,文章顶用赤色的文字举办了说明。
鉴于最近有不少人在接头用R软件绘制舆图的问题,我也就随着凑了凑热闹,对相应的要领进修了一番。下面的这篇文章是一个劈头的先容,尚有许多内容仍在进修和摸索中,假如各人有什么意见或发起,我将按照本身进修的环境对文章举办进一步的增补。
在R中绘制舆图其实是十分利便的,最直接的步伐或许就是安装maps和mapdata这两个包,然后输入下面的呼吁:
library(maps)library(mapdata)map(“china”)个中map()函数还可以加上许多参数,在这里就纷歧一详述,详细的用法只需问号之。然而仔细看一看这张舆图你会发明重庆市和四川省仍然是十全十美,可见该舆图的数据应该是有些年初了。
幸运的是,通过谢益辉的这篇博文我们已经可以概略知道该如何操纵了,下面就为各人先容一下详细的步调。
首先,从这里下载中国舆图的GIS数据,这是一个压缩包,完全解压后包括三个文件(bou2_4p.dbf、bou2_4p.shp和bou2_4p.shx),将这三个文件解压到同一个目次下,并在R中设好相应的事情空间,然后安装maptools包,运行如下措施:
library(maptools);x=read.shape(‘bou2_4p.shp’);#下文中会继承用到x这个变量, #假如你用的是其它的名称, #请在下文的措施中也举办相应的窜改。plot(x);【修改】新版本的maptools包不再提供read.shape()函数,请用readShapePoly()取代。
这时一张完整的中国舆图就已经画好了。可是在实际利用的进程中,我们往往会按照本身的需要对舆图中的某些省份着以特定的颜色,这时就可以通过调理plot呼吁中的fg参数来予以实现。然而为了清楚地说明这部门的内容,我需要插播一段R绘制舆图的道理。
======================传说中的支解线=====================
在绘制舆图时,每一个省市自治区可能岛屿都是用一个多边形来暗示的。之前的GIS数据,其实就是提供了每一个行政区其多边形逐点的坐标,然后R软件通过顺次毗连这些坐标,就绘制出了一个多边形区域。在上面的数据中,一共包括了925个多边形的信息,之所以有这么多是因为一些省份有许多小的隶属岛屿。在这925个多边形中,每一个都对应一个的ID,编号别离从1到925。
======================传说中的支解线=====================
回到适才的话题,plot呼吁中的fg参数在本例中应该是一个长度为925的向量,其第i个分量的取值就代表了舆图中第i个多边形的颜色。一个简朴的实验是运行下面这个呼吁看看结果:
plot(x,fg=gray(924:0/924));【修改】新版本的maptools包的画图参数也有所改变,请将fg换成col。
于是自然就发生了一个问题:如何获取某一个特定地域的ID,进而配置我们想要的颜色?事实上,在变量x中,就已经存储了我们想要的信息。在R中输入“x[[2]]”或“x$att.data”,会获得一个925行7列的数据框,这其实是bou2_4p.dbf这个文件中存储的信息,之前的read.shape()函数固然读取的是bou2_4p.shp文件,但在默认环境下会把dbf文件的信息也放到变量之中。对付这个数据框,其行名就是每一个区域的ID编号,第一列和第二列别离是面积和周长,最后一列是该区域所属的行政区名,其它的列应该也是一些编号性质的变量。于是,通过查找相应的行政区对应的行名,就可以对fg参数举办赋值了。下面是我编的一个函数,用来生成所需的fg向量:
getColor=function(mapdata,provname,provcol,othercol){ f=function(x,y) ifelse(x %in% y,which(y==x),0); colIndex=sapply(mapdata$att.data$NAME,f,provname); fg=c(othercol,provcol)[colIndex+1]; return(fg);}【修改】舆图数据的组织形式有所变革,上面函数中的mapdata$att.data$NAME需要替换为[email protected]$NAME。
个中mapdata是存放舆图数据的变量,在上面的例子中就是x,provname是需要改变颜色的地域的名称,provcol是对应于provname的代表颜色的向量(名称和数字均可),othercol是其它地域的颜色。举譬喻下:
provname=c(“北京市”,”天津市”,”上海市”,”重庆市”);provcol=c(“red”,”green”,”yellow”,”purple”);plot(x,fg=getColor(x,provname,provcol,”white”));
留意provname必然要写地域的全称,写法可以参照下面这条呼吁生成的向量:
as.character(na.omit(unique(x$att.data$NAME)));由今生成的向量有33个元素,少了澳门出格行政区,这是这个数据中的一块瑕疵。在x$att.data的第899行有一个NA,不知道它代表的是否就是澳门。
操作雷同的要领就可以按照本身的需要对差异的区域举办着色,下面再举一例。从国度统计局获取2007年我国各地域的人口数据,然后按照人口的几多对各省份举办着色。措施如下:
provname=c(“北京市”,”天津市”,”河北省”,”山西省”,”内蒙古自治区”, “辽宁省”,”吉林省”,”黑龙江省”,”上海市”,”江苏省”, “浙江省”,”安徽省”,”福建省”,”江西省”,”山东省”, “河南省”,”湖北省”,”湖南省”,”广东省”, “广西壮族自治区”,”海南省”,”重庆市”,”四川省”,”贵州省”, “云南省”,”西藏自治区”,”陕西省”,”甘肃省”,”青海省”, “宁夏回族自治区”,”新疆维吾尔自治区”,”台湾省”, “香港出格行政区”);pop=c(1633,1115,6943,3393,2405,4298,2730,3824,1858,7625, 5060,6118,3581,4368,9367,9360,5699,6355,9449, 4768,845,2816,8127,3762,4514,284,3748,2617, 552,610,2095,2296,693);provcol=rgb(red=1-pop/max(pop)/2,green=1-pop/max(pop)/2,blue=0);plot(x,fg=getColor(x,provname,provcol,”white”),xlab=””,ylab=””);
个中颜色越深的处所代表人口数越多,反之为人口数越少。
另外,在绘制舆图的进程中,尚有一个较量有用的参数是recs,它是一个由多边形ID构成的向量,暗示在舆图中只画出这些ID所代表的区域。操作这个参数,就可以画出某一部门的舆图,譬喻下面的例子是我国中部六省的舆图:
getID=function(mapdata,provname){ index=mapdata$att.data$NAME %in% provname; ids=rownames(mapdata$att.data[index,]); return(as.numeric(ids));}midchina=c(“河南省”,”山西省”,”湖北省”,”安徽省”,”湖南省”,”江西省”);plot(x,recs=getID(x,midchina),fg=”green”,ol=”white”,xlab=””, ylab=””);
上面的getID()是我编写的一个成果与getColor()雷同的函数,用来返回指定省份的ID。
【修改】新版本的maptools包的画图函数已经打消了recs这个参数,此刻要实现这个成果,可以在颜色上把不需要的省份酿成白色,个中填充色用col参数,界线颜色用border参数。譬喻上面的例子可以用下面的函数来实现:
plot(x, col = getColor(x, midchina, rep(“green”, 6), “white”), border = “white”, xlab = “”, ylab = “”)最后要说的是,在画出的图上仍然可以用points()函数和text()函数加上点和文字,而maptools包中还提供了一个pointLabel()函数,用来办理文本标签的重叠问题。这部门内容请参阅博文:用R画中国舆图并标注都市位置,以及制止文本标签重叠:maptools中的pointLabel()。
从以上的内容来看,本文所述的都是一些最根基的画图要领,还没有对地理信息数据举办更进一步的阐明。假如有时机的话,这一主题的下一篇文章将为各人先容舆图数据的构成布局,并说明如何将差异名目标地理数据整合起来,譬喻如安在上面的舆图上绘制出我国的铁路、水系漫衍等内容。