2021-09-12 14:21

实用技术 | 如何用R绘制并填充相对切确的世界地图

近几年来,随着负笈海外稀奇是美国的政治学博士不息学成回国,R逐渐在高校从事政治学量化钻研的师生群体中流走首来,形成了与Stata并驾齐驱的局面。与必要付费购买才能行使的商业统计柔件Stata分歧,R能够终身免费行使。不光如此,行为开源、共享、共建的社群,R具备专门富强的功能,在各项运算上都不逊于Stata,在可视化方面则更胜一筹。详细来说,R中各栽各样的包(package)为吾们处理包括地理新闻(Geographic Information)数据在内的各栽数据的可视化挑供了便利。换言之,即便吾们在异国或者不会ArcGIS/QGIS等专科地理新闻处理柔件的情况下,只要吾们稍微学习一下R,拿到有关的文件,就能顺当地处理这些地理新闻数据。由于笔者近来不息在接触地理新闻可视化的有关知识,对这一周围逐渐首了有趣,心想在浏览实操的时候不如做一做笔记总结经验。因此,今天的推送与以去的文献编译、手段论衡、学人幼传及新刊快递等栏现在有所分歧,它是一篇为了方便作者向国内期刊投稿而介绍的实用技术幼文。在这篇幼文章里,吾们将同读者朋侪分享如何用R绘制并填充相对切确的世界地图。

现在网上已经有大量现成的教授行家如何用R绘制各栽类型地图的教程,幼到绘制一个街区地图,大到绘制全世界的地图教程无所不有。但本文强调的是“相对切确的世界地图”。望到这边,读者朋侪能够会益奇吾们为什么还要在“切确”二字前添上“相对”的字样,是多此一举照样故弄玄虚,其实都不然。这是由于即便用R绘制并输出比较切确的地图也必要结相符有关柔件进走进一步的修改。

多所周知,地图是一国国家主权和领土的象征,行使完善切确的地图也是国内科研做事者答尽的责任与责任,因此吾们在对待地图绘制时答当相等郑重。令人安慰的是,近年来,不少技术贴的作者在谈及如何绘制中国地图时,都特殊强调行使切确、完善的中国地图的主要性,其在帖中绘制的中国地图也基本切确。之因此说这些制图是“基本切确”是由于遵命现走地图出版的标准,用R直接绘制并输出的地图与经过自然资源部审阅正式出版的地图还有一些微弱的区别。如下图所示,尽管中国与塔吉克斯坦已经正式完善了划界做事,但由于现走出版的纸质或电子地图均未做改动,因此该交界处(帕米尔高原东部倾斜坡)仍答行使不决国界线外示:

图片

自然这不是稀奇主要的题目,在用R输出高DPI(每英寸点数)的中国地图图片后,能够请美工编辑或排版编辑行使Adobe Illustrator、Photoshop等专科制图柔件将其修改成虚线即可。

但是在不少介绍绘制世界地图的帖子中,吾们会发现其中行使的地图存在大量的舛讹。持允而论,展现这些舛讹并不及被归咎到撰写有关技术贴的作者,他们自己是出于善心与行家分享技术经验。但由于他们行使的R包或者shape文件清淡都是国外作者开发并且在国际上盛走的包,因此不免会展现与国内出版规定不相相符甚至舛讹的情形。举例来说:这些包或者shp文件中多以0°经线(本初子午线)为地图中央,不相符国内出版的关于世界地图的规定,倘若进走投影变换也能够导致展现舛讹(如在绘制地图上展现冗余线条和色块,这并非是投影变换偏差所致,而是原作者在制作shape文件中已经锁定了投影)。自然这些题目倒不是最主要的,最主要的舛讹是在国家边界划分上的舛讹。其中R中常用的包和世界地图文件中关于中国地图片面的最主要舛讹是违背国际社会普及承认的“一个中国”原则、将中国大陆和中国台湾地区别离行为地位相通的分歧“政治实体”对待。其次,这些地图包普及遵命作恶的“麦克马洪线”将中国藏南地区划入印度,有些还遵命作恶的“约翰逊线”将中国阿克赛钦划入印度以及匮乏南海诸岛等等。此外,在这些地图包中,关于印度和巴基斯坦之间的争议地区——克什米尔地区以及埃及和苏丹间的争议地区等地也未遵命切确的式样进走绘制。这些舛讹使得作者绘制出的地图在投稿时极有能够达不到自然资源部审核经过的标准,末了导致精彩的可视化片面被删除,甚为怅然。

为了进一步表明,吾们以R中常用的地图包maps为例,用红色圆圈标识出一些常见的舛讹划界,它们别离是:在图A中,红圈1处外示地图遵命作恶的“麦克马洪线”将中国藏南地区划入印度;在图B中,红圈2处指地图未以不决国界线标识中国与塔吉克斯坦之间的边界;红圈3处外示地图未标识出印度和巴基斯坦之间的争议地区——克什米尔地区;而在图C中,红圈4外示地图未标识出埃及与苏丹之间的争议地区——哈拉伊卜三角区。

图片

这些舛讹只是其中的一些代外性舛讹,此外还有别的舛讹。由于此类地图在绘制输出后必要修改的地方许多,程序相等繁琐,专门不正当向国内的期刊杂志投稿。为了方便行家在今后的日常科研学习过程中行使,吾们花了益几天时间搜遍了各大网站,甚至还付费购买了CSDN的一个月会员,终于找到了一个相对正当的shape文件。与前述的栽栽shape文件相比,吾们找到的这一shape文件相对而言必要修改的地方要少许多(欠缺的南海诸岛和九段线,必要单独添上,这能够行使ggplot制图层层叠添的原理进走补全),而且基本符配相符者向国内期刊投稿时行使东经150°经线为中央的制图请求,但美中不及的是匮乏南极洲。

既然找到了shape文件,那么吾们该怎么来处理它呢?原形上,shape文件在内心上就是蓄积地理空间新闻的多边形,吾们能够在R中安置并添载能够读取多边形的sf包,如许吾们能够很容易望到shape文件中蓄积的数据结议和式样。本文行使的世界地图shape文件的组织并不复杂,它由name, childNum以及geometry三类变量别离蓄积对答的新闻。其中name和geometry两个字段稀奇主要,由于倘若吾们想要活着界地图上实现有关数据的可视化,行使的数据中的国家名称字段肯定要和本地图中的name相匹配,这必要行家在行使时仔细校对,而geometry字段中则蓄积了多边形的新闻,逆映在地图中就是各个国家的形状。

接下来吾们以世界银走发布的世界治理指数(Worldwide Governance Index)为例,在校对各个国家名的基础上,绘制世界地图并遵命Regulatory Quality(各国制定与实走促进私营部分发展能力)的指标进走颜色填充。在此,吾们略去了竖立做事路径的步骤,读者朋侪能够根据往往的做事民俗自走竖立,添载并读取数据的代码如下所示:

library(tidyverse)library(sf)library(readxl)# 读取以东经150度经线为中央的世界地图shape文件WorldMap <- st_read("worldmap")# 读取南海诸岛shape文件SCSislands <- st_read("SCSislands")# 读取九段线shape文件NineDashLine <- st_read("NineDashLine")# 读取世界银走发布的各国制定与实走促进私营部分发展能力的评估数据库WGIdata <- read_excel("ex.xlsx", col_types = c("text", "numeric"))# 将上述数据与世界地图数据遵命相通的“name”字段相符并worlddata <- left_join(WorldMap, WGIdata, by = "name")

望到这边,有些读者能够会疑心,既然吾们已经添载了集ggplot2和readr等包为一体的tidyverse包,那么为什么吾们不将世走的数据存储成体积更幼、读取更快的csv格式文件呢?原形上,正如下图所示,由于该版本地图shape数据中name字段中一些国家的名字采用的是非英文,在对照国家名时倘若用csv格式保存世走数据能够会导致稀奇字符失踪,从而导致R中数据框中的国家名匹配不上,进而在绘制出来的地图上能够表现不少处深灰色的状态,这意味着缺失有关数据。

图片

    绘制地图片面的代码如下所示:ggplot() + geom_sf(data = worlddata, aes(fill = estimate), colour = "#525252",size=0.3)+ #绘制世界地图并遵命estimate字段中的数据上色 geom_sf(data = SCSislands, colour = "#525252")+ #绘制南海诸岛 geom_sf(data = NineDashLine, color = "#525252", size=0.3)+ #绘制九段线 coord_sf() + #竖立投影手段,本处为默认投影 scale_fill_gradient(low="#deebf7", high="#4292c6")+ #竖立蓝色的颜色渐变 guides(fill = guide_legend(title="评估指数"))+ #修改图例标签,如在Mac中能够必要竖立字体 ggtitle("2018年世界各国制定与实走促进私营部分发展能力的评估")+ #给图片命名,同样在Mac中能够必要竖立字体 theme(panel.grid = element_blank(), panel.background = element_rect(fill = "Aliceblue"), #将背景填充为Aliceblue色模仿大海 axis.text = element_blank(), axis.ticks = element_blank(), axis.title = element_blank(), plot.title = element_text(size = 10, hjust = 0.5), plot.margin = unit(c(-0.5, -0.5, -0.5, -0.5), "inches"), #竖立图像输出的边缘距离 legend.position = "bottom") #竖立图例位于图像正下方 ggsave("2018年世界各国制定与实走促进私营部分发展能力的评估.jpg",dpi=1000,width=13,height=12)

图片

由于这边的shape文件采用的是清淡圆柱投影,望首来会比较扁。但是吾们对比自然资源部挑供的带审图号的例图能够发现此时输出的图像除了异国南极洲外,在总体上已经达到了和例图比较挨近的水平。但是请仔细,千万不要以为此时已经大功告成了,这边直接输出的地图只是在总体上挨近,还远远异国达到经过审核的标准。

图片

为什么呢?这就呼答了吾们逆复强调的“相对切确”一词。请仔细浏览自然资源部例图中关于国家边界的划线,稀奇必要仔细朝鲜半岛、克什米尔地区、中东以及非洲大陆国家边界的划线(清淡都是不决周围)。这些详细的做事就必要在Adobe Illustrator等专科柔件中完善了。

同样,吾们还能够对投影视角进走变换,下图表现的是亚洲视角:

ggplot() + geom_sf(data = worlddata,aes(fill = estimate),colour = "#525252",size=0.3)+ geom_sf(data = SCSislands,colour = "#525252")+ geom_sf(data = NineDashLine,color = "#525252",size=0.3)+ scale_fill_gradient(low="#deebf7",high="#4292c6")+ coord_sf(crs= "+proj=ortho +lat_0=20 +lon_0=90")+ guides(fill=guide_legend(title='评估指数'))+ ggtitle("2018年世界各国制定与实走促进私营部分发展能力的评估(亚洲视角)")+ theme(panel.grid = element_blank(), panel.background = element_rect(fill = "Aliceblue"), axis.text = element_blank(), axis.ticks = element_blank(), axis.title = element_blank(), plot.title = element_text(size = 15, hjust = 0.5), legend.position = "right")ggsave("2018年世界各国制定与实走促进私营部分发展能力的评估(亚洲视角).jpg",dpi=1000,width=15,height=12)

图片

而这走代码表现的则是北极视角:

ggplot() + geom_sf(data = worlddata,aes(fill = estimate),colour = "#525252",size=0.3)+ geom_sf(data = SCSislands,colour = "#525252")+ geom_sf(data = NineDashLine,color = "#525252",size=0.3)+ coord_sf(crs = "+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs ")+ # 变换投影视角为北极视角 scale_fill_gradient(low="#deebf7",high="#4292c6")+ guides(fill=guide_legend(title='评估指数'))+ ggtitle("2018年世界各国制定与实走促进私营部分发展能力的评估(北极视角)")+ theme(panel.grid = element_blank(), panel.background = element_rect(fill = "Aliceblue"), axis.text = element_blank(), axis.ticks = element_blank(), axis.title = element_blank(), plot.title = element_text(size = 15, hjust = 0.5, vjust=0.5), legend.position = "right")ggsave("2018年世界各国制定与实走促进私营部分发展能力的评估(北极视角).jpg",dpi=1000,width=15,height=12)

图片