使用R绘制中国分省热度图

摘要: 花四个小时解决一辈子画地图的问题。

起止

  • 去年8月同办公室李主任及当时尚未失恋的吴师弟,连蒙带骗,蹭听清华大数据讲习班课程,那时知道 R 绘制地图的功能,但直到今天才因论文写作需要,沉下心来琢磨。
  • 但:
    • 孟天广老师提供的代码完全看不懂,这也不是一两天;
    • Brian Dennis 关于 R 的初学者教材只翻过 20 页;
    • 侯博士提供了详细的使用 Stata 绘制地图的代码和视频教程,但道听途说中 R 已成为未来计量、绘图方向,已经会的计量方法迁移到 R 上实无必要,新功能如果仍要接续 Stata 的老种,无法接受。先尝试 R,无法继续再考虑 Stata 。
  • 看来,毫无基础的初学者,只能换一种方法,靠我素养,边想边学,东拼西凑,够用就好。以下内容参考自四篇文章,文后有链接地址,我亲自加入添加图例并自动导出高分辨率 PNG 功能,大量作图时十分感人。其中困扰我的地方已经添加注释,复制粘贴之前,可以先谢我。

方案

gpclibPermit() #要允许这个才能用
library(maptools); #使用这个工具
x=readShapePoly('bou2_4p.shp') # 读入中国地形
# plot(x); # 测试时使用,现在无用
# 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(mapdata@data$NAME,f,provname);
  fg=c(othercol,provcol)[colIndex+1];
  return(fg);
}
provname=c("北京市","天津市","河北省","山西省","内蒙古自治区",
       "辽宁省","吉林省","黑龙江省","上海市","江苏省",
       "浙江省","安徽省","福建省","江西省","山东省",
       "河南省","湖北省","湖南省","广东省",
       "广西壮族自治区","海南省","重庆市","四川省","贵州省",
       "云南省","西藏自治区","陕西省","甘肃省","青海省",
       "宁夏回族自治区","新疆维吾尔自治区","台湾省",
       "香港特别行政区");
# 输入数据的位置
popt=c( ); # 填入各省数据,逗号隔开
pop1=c( );
pop2=c( );
pop3=c( );

# 绘制Total图
    pop=popt;
#这种定义色彩的方式不便于多图之间比较
    #provcol=rgb(red=1-pop/max(pop)/2,green=1-pop/max(pop)/2,blue=1-pop/max(pop)/2);  
    # 所以使用这个方式,或者max(max(popt),max(pop1),max(pop2),max(pop3),)这种方式
    provcol=rgb(red=1-pop/2,green=1-pop/2,blue=1-pop/2); 
    # 定义要输出的PNG文件的尺寸和名称
    png(filename = "map-Total.png",width = 3000, height = 1589) 
    # 绘制地图
    plot(x,col=getColor(x,provname,provcol,"white"),xlab="",ylab=""); 
    op <- par(cex = 3.5) #字体调整为几倍的大小
    legend("right",inset=0.2, title="效率值", 
       c("2","1.6","1.2","0.8","0.4","0"), 
       fill=c(rgb(0,0,0,maxColorValue = 255),rgb(50,50,50,maxColorValue = 255),rgb(100,100,100,maxColorValue = 255),rgb(150,150,150,maxColorValue = 255),rgb(200,200,200,maxColorValue = 255),rgb(255,255,255,maxColorValue = 255)), 
       horiz=FALSE) # 绘制图上的图例,其中rgb颜色使用mcv设定最大rgb数值以定义白色
dev.off() # 关闭文件写入
# 绘制Node1图
    pop=pop1;
    #provcol=rgb(red=1-pop/max(pop)/2,green=1-pop/max(pop)/2,blue=1-pop/max(pop)/2);
    provcol=rgb(red=1-pop/2,green=1-pop/2,blue=1-pop/2);
    png(filename = "map-Node1.png",width = 3000, height = 1589)
    plot(x,col=getColor(x,provname,provcol,"white"),xlab="",ylab="");
    op <- par(cex = 3.5) #字体调整为几倍的大小
    legend("right",inset=0.2, title="效率值", 
       c("2","1.6","1.2","0.8","0.4","0"), 
       fill=c(rgb(0,0,0,maxColorValue = 255),rgb(50,50,50,maxColorValue = 255),rgb(100,100,100,maxColorValue = 255),rgb(150,150,150,maxColorValue = 255),rgb(200,200,200,maxColorValue = 255),rgb(255,255,255,maxColorValue = 255)), 
       horiz=FALSE)
dev.off()
# 绘制Node2图
pop=pop2;
#provcol=rgb(red=1-pop/max(pop)/2,green=1-pop/max(pop)/2,blue=1-pop/max(pop)/2); 
provcol=rgb(red=1-pop/2,green=1-pop/2,blue=1-pop/2);
png(filename = "map-Node2.png",width = 3000, height = 1589)
plot(x,col=getColor(x,provname,provcol,"white"),xlab="",ylab="");
op <- par(cex = 3.5) #字体调整为几倍的大小
legend("right",inset=0.2, title="效率值", 
       c("2","1.6","1.2","0.8","0.4","0"), 
       fill=c(rgb(0,0,0,maxColorValue = 255),rgb(50,50,50,maxColorValue = 255),rgb(100,100,100,maxColorValue = 255),rgb(150,150,150,maxColorValue = 255),rgb(200,200,200,maxColorValue = 255),rgb(255,255,255,maxColorValue = 255)), 
       horiz=FALSE)
dev.off()
# 绘制Node3图
pop=pop3;
#provcol=rgb(red=1-pop/max(pop)/2,green=1-pop/max(pop)/2,blue=1-pop/max(pop)/2);
provcol=rgb(red=1-pop/2,green=1-pop/2,blue=1-pop/2);
png(filename = "map-Node3.png",width = 3000, height = 1589)
plot(x,col=getColor(x,provname,provcol,"white"),xlab="",ylab="");
op <- par(cex = 3.5) #字体调整为几倍的大小
legend("right",inset=0.2, title="效率值", 
       c("2","1.6","1.2","0.8","0.4","0"), 
       fill=c(rgb(0,0,0,maxColorValue = 255),rgb(50,50,50,maxColorValue = 255),rgb(100,100,100,maxColorValue = 255),rgb(150,150,150,maxColorValue = 255),rgb(200,200,200,maxColorValue = 255),rgb(255,255,255,maxColorValue = 255)), 
       horiz=FALSE)
dev.off()

这样式的

image

参考

  1. http://blog.qiubio.com:8080/archives/2477
  2. https://cos.name/2013/01/drawing-map-in-r-era/
  3. https://cos.name/2009/07/drawing-china-map-using-r/
  4. http://bbs.pinggu.org/thread-3786862-1-1.html
  5. http://blog.qiubio.com:8080/archives/2395