我们曾经在《如何用R措辞绘制并添补相瞄准确的天下舆图》一文里提过上述问题。为了进一步解释这一问题,下面我们读取了国际上比较盛行的舆图json/shp文件,列出了个中一些涉及中国舆图边界绘制时随意马虎涌现的范例缺点以供大家参考(在此须要澄清的是,我们读取的天下舆图和中国舆图的json/shp文件在绘制过程中涌现了“咬合分离”的征象——共享边不一致、线条交错,这是由于每个区域单独描边所致,它们本身并不是存在所谓“主权争议”的地区)。
详细来说,图1所示的赤色区域是中国的藏南地区(行政上分别从属西藏自治区山南市错那县、隆子县以及林芝市墨脱县、察隅县),它常常被按照造孽的“麦克马洪线”而缺点地划入印度当局设立的所谓“阿鲁纳恰尔邦”中。
图2中自上向下的几块赤色区域依次为中国的阿克赛钦地区、巴里加斯地区、巨哇、曲惹地区、什布奇山口、桑、葱莎、波林三多地区以及乌热、然冲、拉不底地区),个中位于中国新疆和西藏交界的阿克赛钦地区常常被缺点地绘入印度当局设立的所谓“拉达克中心直辖区”(原印度流传宣传的查谟和克什米尔地区东部)中。
此外还有的舆图json/shp文件本身未遵照“一个中国”原则(经读取文件或随机给舆图上色可见)、未包含南海诸岛等等。因此,如果在绘制舆图时没有把稳到这些细节,那么在海内提交揭橥或出版前可能会碰着审读不通过进而被删除乃至退稿的问题,在国际上揭橥则可能会对国家主权和领土完全造成侵害,此外还可能日后给作者本人带来不便。
相反,只要有相瞄准确的舆图json/shp文件,我们就可以利用其绘制相瞄准确的中国舆图。因此,本期实用技能贴的目标紧张是两个,第一是用R读取并绘制相瞄准确的中国舆图,它是条件和根本;第二是按照某种指标给相瞄准确的中国舆图添补颜色,进行可视化。详细步骤如下:
首先我们打开R,在事情路径中载入tidyverse和sf两个包,然后再读取相瞄准确的中国舆图json文件:
library(tidyverse)library(sf)
值得解释的是,本文利用的舆图底图虽然来自高德舆图的开放平台(链接http://datav.aliyun.com/tools/atlas/#&lat=30.334491405102664&lng=106.72420352760892&zoom=3.5),但是其边界并无明显问题,而且自带南海诸岛、钓鱼岛及其附属岛屿,无需额外添加南海诸岛和九段线图层。同时该平台供应的是json格式的舆图,如果读者对json格式的文件不熟习,也可以通过MyGeodata Converter网站将其在线转换成shp格式的文件再利用(链接:https://mygeodata.cloud/converter/json-to-shp)。
接下来是绘制中国舆图全图并保存为图3:
China <- st_read("China.json")
图3
在舆图天生后,我们会创造它和海内媒体常日利用的舆图形状有些差异,看起来比较扁,这实在是由于投影不同而造成的。对此我们可以将默认的投影办法改为兰伯特正方位等积投影(Lambert azimuthal equal-area projection)并保存为图4即可:
ggplot() + geom_sf(data=China,colour="#525252",fill="white")+ theme(panel.grid=element_blank(), panel.background=element_blank(), axis.text=element_blank(), axis.ticks=element_blank(), axis.title=element_blank())ggsave("图3.jpg",dpi=500,width=15,height=12)
图4
我们还可以通过加载ggspatial包来补充舆图中的指北针和比例尺:
ggplot() + geom_sf(data = China, colour = "#525252",fill="white")+ coord_sf(crs = "+proj=laea +lat_0=40 +lon_0=104")+ theme(panel.grid = element_blank(), panel.background = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), axis.title = element_blank())ggsave("图4.jpg",dpi=500,width=15,height=12)
图5
至此,本文的第一个目标——用R读取并绘制相瞄准确的中国舆图全图已经完成了。那么如何按照某种给定的指标给中国舆图上色进而实现可视化的效果呢?
接下来我们以2020年前3季度各省、自治区、直辖市GDP为例进行绘制,我们首先载入GDP数据:
#加载ggspatial包library(ggspatial) ggplot() + geom_sf(data = China, colour = "#525252",fill="white")+ coord_sf(crs = "+proj=laea +lat_0=40 +lon_0=104")+ annotation_scale(location = "bl") + annotation_north_arrow(location = "tl", which_north = "false", style = north_arrow_fancy_orienteering)+ theme(panel.grid = element_blank(), panel.background = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), axis.title = element_blank())ggsave("图5.jpg",dpi=500,width=15,height=12)
我们可以看到原来中国舆图json文件中有个包含各省、自治区和直辖市名称的name字段(如图6所示):
图6
我们将其与GDP表中的name字段进行合并:
ChinaGDP<-left_join(China,GDP,by="name")
然后再行绘制并添加相应的标题和图例即可:
ggplot()+ geom_sf(data = ChinaGDP, aes(fill=GDP),colour = "#525252")+ scale_fill_gradient(low = "white", high = "steelblue",breaks = seq(5000, 80000, by = 10000))+ annotation_scale(location = "bl") + coord_sf(crs="+proj=laea+lat_0=40+lon_0=104")+ annotation_north_arrow(location = "tl", which_north = "false",style = north_arrow_fancy_orienteering)+ ggtitle("2020年前3季度全国各省、自治区和直辖市GDP(港澳台资料暂缺)")+ guides(fill=guide_legend(title='GDP(单位:亿元)'))+ theme(panel.grid = element_blank(), panel.background = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), axis.title = element_blank(),plot.title=element_text(size=12,hjust= 0.5,vjust=1))ggsave("图6.jpg",dpi=500,width=15,height=12)
图7
到此,我们的第二个目标也完成了。当然,上面输出的各种中国舆图虽然比较完全,但是由于中国南北纬跨度极大,因此天生的图片也相应比较大。为了投稿时的版面考虑,我们可以利用cowplot包将南海诸岛作为附图插入大图当中(如图8所示),以下是代码:
#载入cowplot包library(cowplot)#绘制中国舆图大图ChinaMap <- ggplot() +geom_sf(data=China,colour="#525252", fill = "white")+ coord_sf(ylim = c(-2387082,1654989), crs = "+proj=laea +lat_0=40 +lon_0=104")+ annotation_scale(location = "bl") + annotation_north_arrow(location = "tl", which_north = "false", style = north_arrow_fancy_orienteering)+ theme(panel.grid = element_blank(), panel.background = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(),axis.title=element_blank())#绘制南海诸岛附图SouthChinaSea<-ggplot()+geom_sf(data=China,colour="#525252", fill="white")+coord_sf(xlim=c(117131.4,2115095), ylim=c(-4028017,-1877844),crs = "+ proj = laea+ lat_0 = 40+lon_0 = 104")+theme(aspect.ratio=1.25,axis.text=element_blank(),axis.ticks=element_blank(),axis.title=element_blank(),panel.grid=element_blank(),panel.background=element_blank(),panel.border=element_rect(fill = NA, colour = "#525252"),plot.margin = unit(c(0,0,0,0),"mm"))# 将南海诸岛附图插入中国舆图大图ggdraw()+draw_plot(ChinaMap)+draw_plot(SouthChinaSea,x=0.88,y=0.00,width=0.1,height=0.3)# 保存为图8ggsave("图8.jpg", dpi = 500, width = 15, height = 12)
图8
但是到这一步牢记不要以为大功告成了,正如我们在文章标题中指出的那样,目前由R绘制出来的中国舆图只是相瞄准确的舆图,由于在一些细节地方仍旧须要修正。参照已经公开出版的舆图我们可以创造,只管中国与塔吉克斯坦已完成划界事情,但是其交界处(新疆维吾尔自治区阿克陶县和塔什库尔干塔吉克自治县)仍旧应以未定国边界表示,如图9所示:
图9
因此,这就须要在用R天生高分辨率(DPI)的图片之后再用诸如Adobe Illustrator、Photoshop之类的专业图片处理软件做进一步修正了。此外,对付以上代码中的各项指标设定,读者也可以根据须要自行设定。
值得强调的是,只管本文利用的舆图底图文件相瞄准确,但是根据现行《测绘法》和《舆图管理条例》的有关规定,凡涉及中国舆图和天下舆图的出版物在出版前必须送审,经审读通过配发审图号后才可出版。因此大家如果要在海内的学术出版物中揭橥、出版涉及有关中国或天下舆图的论文和专著,大概率会被送审,通过之后才能出版。但如果是中国籍学者要在国际会议或者国际期刊上揭橥,虽然不会受到海内有关舆图审核程序的约束,但也请把稳一定要利用相瞄准确的中国舆图。
末了,本文利用的素材均已打包上传到网盘中(代码中保存图片的文件名称和本文不完备同等),感兴趣的读者可以点击文末“扩展链接"输入“d7pn”下载复验。
未来我们还将陆续推出其他有关舆图绘制的实用技能贴,欢迎各位读者朋友连续关注、支持我们。
参考文献:[1] 姜晓东:《R 绘制中国舆图,并展示盛行病学数据》,https://cosx.org/2014/08/r-maps-for-china/
[2] 陆兵:《编辑舆图插图应把稳的重点问题》
[3] 宁海涛:《R-ggplot2 标准中国舆图制作》,https://mp.weixin.qq.com/s/abKW8WwFUS39tXXRI1hNww
[4] Pauke:《Quick Note: sf + ggplot2 最简步骤实现中国舆图数据展示》, https://blog.csdn.net/u014531714/article/details/85623130
[5] 《中华公民共和国国务院公报》1962年第12号,http://www.gov.cn/gongbao/shuju/1962/gwyb196212.pdf
撰文:杨端程