找回密码
 注册
查看: 8851|回复: 4

R软件绘制中国分省市地图

[复制链接]
发表于 2011-1-20 17:33:29 | 显示全部楼层 |阅读模式
library(maps)
library(mapdata)
map("china")
******************
library(maptools);
x=read.shape('bou2_4p.shp');#下文中会继续用到x这个变量,
                            #如果你用的是其它的名称,
                            #请在下文的程序中也进行相应的改动。
plot(x);
新版本的maptools包不再提供read.shape()函数,请用readShapePoly()代替。
*******************************************************************
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参数进行赋值了。
**************************************************************
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需要替换为mapdata@data$NAME
**********************************************************
provname=c("北京市","天津市","上海市","重庆市");
provcol=c("red","green","yellow","purple");
plot(x,fg=getColor(x,provname,provcol,"white"));
++++++++++++++++++++++++++++++
其中mapdata是存放地图数据的变量,在上面的例子中就是x,
provname是需要改变颜色的地区的名称,provcol是对应于
provname的代表颜色的向量(名称和数字均可),othercol是其
它地区的颜色。
*************************************************************
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个元素,少了澳门特别行政区,
这是这个数据中的一块瑕疵。在x$att.data的第899行有一个NA,
不知道它代表的是否就是澳门。
*****************************************************
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="");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
新版本的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()。

______________________________________________
par(mar=rep(0,4))
dat = read.csv(textConnection("城市,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"))
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))
axis(1, lwd = 0); axis(2, lwd = 0); axis(3, lwd = 0); axis(4, lwd = 0)
***********************************************



回复

使用道具 举报

发表于 2011-1-20 19:33:05 | 显示全部楼层
总结的很好。
不过下次可以放在
http://www.biostatistic.net/forum-42-1.html
回复 支持 反对

使用道具 举报

发表于 2012-2-25 19:02:35 | 显示全部楼层
楼主威武~~
回复 支持 反对

使用道具 举报

发表于 2012-2-26 14:03:40 | 显示全部楼层
神奇的R啊
回复 支持 反对

使用道具 举报

发表于 2013-5-19 23:12:28 | 显示全部楼层
地图Map,学习ing
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-25 04:04 , Processed in 0.039760 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表