【注】新版本的 鉴于最近有不少人在讨论用R软件绘制地图的问题,我也就跟着凑了凑热闹,对相应的方法学习了一番。下面的这篇文章是一个初步的介绍,还有很多内容仍在学习和探索中,如果大家有什么意见或建议,我将根据自己学习的情况对文章进行进一步的补充。 在R中绘制地图其实是十分方便的,最直接的办法大概就是安装 library(maps) library(mapdata) map("china") 其中 幸运的是,通过谢益辉的这篇博文我们已经可以大体知道该如何操作了,下面就为大家介绍一下具体的步骤。 首先,从这里下载中国地图的GIS数据,这是一个压缩包,完全解压后包含三个文件(bou2_4p.dbf、bou2_4p.shp和bou2_4p.shx),将这三个文件解压到同一个目录下,并在R中设好相应的工作空间,然后安装 library(maptools); x=read.shape('bou2_4p.shp');#下文中会继续用到x这个变量, #如果你用的是其它的名称, #请在下文的程序中也进行相应的改动。 plot(x); 【修改】新版本的maptools包不再提供read.shape()函数,请用readShapePoly()代替。 这时一张完整的中国地图就已经画好了。但是在实际使用的过程中,我们往往会根据自己的需要对地图中的某些省份着以特定的颜色,这时就可以通过调节 ======================传说中的分割线===================== 在绘制地图时,每一个省市自治区或者岛屿都是用一个多边形来表示的。之前的GIS数据,其实就是提供了每一个行政区其多边形逐点的坐标,然后R软件通过顺次连接这些坐标,就绘制出了一个多边形区域。在上面的数据中,一共包含了925个多边形的信息,之所以有这么多是因为一些省份有很多小的附属岛屿。在这925个多边形中,每一个都对应一个唯一的ID,编号分别从1到925。 ======================传说中的分割线===================== 回到刚才的话题, plot(x,fg=gray(924:0/924)); 【修改】新版本的 于是自然就产生了一个问题:如何获取某一个特定地区的ID,进而设置我们想要的颜色?事实上,在变量x中,就已经存储了我们想要的信息。在R中输入“ 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); } 【修改】地图数据的组织形式有所变化,上面函数中的 其中 provname=c("北京市","天津市","上海市","重庆市"); provcol=c("red","green","yellow","purple"); plot(x,fg=getColor(x,provname,provcol,"white")); 注意 as.character(na.omit(unique(x$att.data$NAME))); 由此生成的向量有33个元素,少了澳门特别行政区,这是这个数据中的一块瑕疵。在 利用类似的方法就可以根据自己的需要对不同的区域进行着色,下面再举一例。从国家统计局获取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=""); 其中颜色越深的地方代表人口数越多,反之为人口数越少。 此外,在绘制地图的过程中,还有一个比较有用的参数是 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="");
【修改】新版本的 plot(x, col = getColor(x, midchina, rep("green", 6), "white"), border = "white", xlab = "", ylab = "") 最后要说的是,在画出的图上仍然可以用 从以上的内容来看,本文所述的都是一些最基本的绘图方法,还没有对地理信息数据进行更进一步的分析。如果有机会的话,这一主题的下一篇文章将为大家介绍地图数据的组成结构,并说明如何将不同格式的地理数据整合起来,例如如何在上面的地图上绘制出我国的铁路、水系分布等内容。 |
|