根据各省数值大小,在中国地图上标出颜色深浅

先需要下载中国地图的GIS数据,GIS 地图有很多种存储格式,其中 shapefile 格式(.shp)可以通过 R 的 maptools 包打开。

(http://bbs.pinggu.org/thread-4831599-1-1.html人大经济论坛上有一个链接可下载)

(https://cosx.org/2009/07/drawing-china-map-using-r统计之都上这篇文章也有下载地址)

(https://gadm.org/download_country.html这个简介里可下载任何国家的shap文件)

中国地图 GIS 数据的官方数据可以在国家基础地理信息中心的网站(http://nfgis.nsdi.gov.cn) 里面可以免费下载。官方公开的数据包括:地图数据,及居住地、交通、河流等辅助数据

下图这是下载解压后的情况:

地图数据有 4 个压缩文件:bou1_4m.zip、bou2_4m.zip、bou3_4m.zip 和 bou4_4m.zip。bou 代表边界的意思,数字 1~4 代表国家、省、市、县的 4 级行政划分;4m 代表比例是 400 万分之一,这个比例的图形是公开的。每个文件解压缩后含有两类文件:以字母 p 结尾的表示多边形数据,用来绘制区域;以字母 l 结尾的文件是线形数据,用来绘制边界。但是老版数据中,市级数据中缺少绘制区域的多边形数据,让市级分布图的绘制稍麻烦一些,新版中也许会有改进。

根据各省数值大小,在中国地图上标出颜色深浅

举一个小例子:

根据各省数值大小,在中国地图上标出颜色深浅

自己代码实现:

setwd("E:/中国GIS地图/国家基础地理数据")

library("maptools")

china_map=readShapePoly("bou2_4m/bou2_4p.shp")#导入省级中国地图

plot(china_map)

根据各省数值大小,在中国地图上标出颜色深浅

plot(china_map,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([email protected]$NAME, f, provname);
  fg = c(othercol, provcol)[colIndex + 1];
  return(fg);
}#自己编 获取省份颜色的函数

provname = c("北京市", "天津市", "上海市", "重庆市");
provcol = c("red", "green", "yellow", "purple");

plot(china_map, col = getColor(china_map, provname, provcol, "white"))

或者直接plot(china_map,col=rgetColor(china_map,c("广东省","四川省","重庆市"),c("red","blue","black"),"white"))

根据各省数值大小,在中国地图上标出颜色深浅
根据各省工业企业数绘制中国地图,颜色越深代表,企业个数越多。
provname = c("北京市", "天津市", "河北省", "山西省", "内蒙古自治区",
             "辽宁省", "吉林省", "黑龙江省", "上海市", "江苏省",
             "浙江省", "安徽省", "福建省", "江西省", "山东省",
             "河南省", "湖北省", "湖南省", "广东省",
             "广西壮族自治区", "海南省", "重庆市", "四川省", "贵州省",
             "云南省", "*自治区", "陕西省", "甘肃省", "青海省",
             "宁夏回族自治区", "**自治区");
pop = c(3340,5203,14764,3548,4289,8025,6003,3946,8351,47900,40128,19838,17262,10931,
        39567,23679,16296,14386,42688,5464,337,6782,13819,5123,4194,108,5862,2105,593,
        1174,2894);
provcol = rgb(red = 1 - pop/max(pop)/2, green = 1-pop/max(pop)/2, blue = 0);

plot(china_map, col = getColor(china_map, provname, provcol, "white"), xlab = "", ylab = "");

根据各省数值大小,在中国地图上标出颜色深浅


library(maptools) 
x=readShapePoly("bou2_4m/bou2_4p.shp") 
getColor=function(mapdata,provname,provcol,othercol) 
  { 
  f=function(x,y) ifelse(x %in% y,which(y==x),0); 
colIndex=sapply(iconv([email protected]$NAME,from="CP936", to="UTF-8"),f,provname); 
col=c(othercol,provcol)[colIndex+1]; 
return(col); 
} #编制函数,类似于上边那个函数
provname=c("黑龙江省", "江苏省", "浙江省", "江西省", "山东省", "湖北省", "四川省", "甘肃省") 
provcol=c("grey","grey","grey","grey","grey","grey","grey","grey") 
plot(x, col = getColor(x,provname,provcol,"white"), xlab = "", ylab = "") 

title("Map of China")

根据各省数值大小,在中国地图上标出颜色深浅

但是,可以看出这样绘制的地图的形状有些扁平。这是因为,在绘图的过程中,默认把经度和纬度作为普通数据,均匀平等对待,绘制在笛卡尔坐标系上造成的。其实,地球的球面图形如何映射到平面图上,在地理学上是有一系列不同的专业算法的。地图不应该画在普通的笛卡尔坐标系上,而是要画在地理学专业的坐标系上。在这一点上,R 的 ggplot2 包提供了专门的coord_map()函数。所以推荐 R 的 ggplot2 包来绘制地图。


setwd("E:/中国GIS地图/国家基础地理数据")
china_map=readShapePoly("bou2_4m/bou2_4p.shp")

library(ggplot2)
mymap = ggplot(data = fortify(china_map)) +
  geom_polygon(aes(x = long, y = lat, group = id), colour = "black",
               fill = NA) +
  theme_grey()

print(mymap + coord_map())

或者

library(maptools)
x=readShapePoly("bou2_4m/bou2_4p.shp")
library(ggplot2)
library(mapproj)
mymap=ggplot(data = fortify(x))+geom_polygon(aes(x=long,y=lat,group=id),colour="black",fill=NA)+theme_grey()
print(mymap+coord_map())【这两段代码一模一样】

根据各省数值大小,在中国地图上标出颜色深浅