用R画有图例的中国地图

近期在网上找了几种画中国地图方法,终于认为这种方法还是最适用的

1.用googlevis包。因为中国国情如今已经不能訪问google地图了。所以大多中国用户来说仅仅能望洋兴叹了。


2.用ggplot包,尽管也不错是,但试了后还是些限制的,要用到的gpclib包,在windows和redhat linux系统上是不被支持的,仅仅有ubuntu系统上支持,所以对于想在win和redhad linux绘图不太easy。并且画出来的地图easy变形,不好调整。

3.最后还是plot工具画的,看上还不错。经过多方法參考和改动后,分享给大家。


library(maps)
library(mapdata)
library(maptools)

# 中国地图
# map("china")

# 载入GIS数据
# GIS数据下载:http://cos.name/wp-content/uploads/2009/07/chinaprovinceborderdata_tar_gz.zip
x <- readShapePoly("bou2_4p.shp")

# 測试数据
# plot(x,col=gray(924:0/924));

# 定义地图颜色函数
getColor <- function(mapdata,provname,provcol,othercol) 
{ f=function(x,y) ifelse(x %in% y,which(y==x),0); 
  colIndex=sapply(iconv(x@data$NAME,"GBK","UTF-8"),f,provname); 
  col=c(othercol,provcol)[colIndex+1]; 
  return(col); 
}

# 測试数据
# provname=c("北京市","天津市","上海市","重庆市"); provcol=c("red","green","yellow","purple");
# provcol=c("red","green","yellow","purple"); 
# plot(x,col=getColor(x,provname,provcol,"white"));

# 查看省份名
# as.character(na.omit(unique(x@data$NAME)));

# 画地图数据
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); 

# 构建图例的位置
nf <- layout(matrix(c(1,1,1,1,1,2,1,1,1),3,3,byrow=TRUE), c(3,1), c(3,1), TRUE)
layout.show(nf)

#provcol <- rgb(red=1-pop/max(pop)/2,green=1-pop/max(pop)/2,blue=0); 
#plot(x,col=getColor(x,provname,provcol,"white"),xlab="aaa",ylab="bbb");

provcol <- rgb(red=1-pop/max(pop)/1,green=1-pop/max(pop)/1,blue=1/1.5);
plot(x,col=getColor(x,provname,provcol,"white"),xlab="",ylab="")


## 整理数据
pop <- pop - min(pop)
pop=pop-min(pop)

# 加入图例
par(mar=c(0,0,0,0))
par(mar=c(1,1,2,0),cex=0.5)
barplot(as.matrix(rep(1,31)),col=sort(provcol,dec=T),horiz=T,axes=F,border = NA )
axis(1,seq(1,32,by=3),sort(pop[seq(1,32,by=3)]))

# 參考: http://blog.sina.com.cn/s/blog_7e4ac8b50101f1bh.html








posted @ 2017-07-16 18:08  zsychanpin  阅读(2771)  评论(0编辑  收藏  举报