根据各省数值大小,在中国地图上标出颜色深浅
先需要下载中国地图的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)
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())【这两段代码一模一样】