在之前「使用 R 语言绘制历年中国各省市区县地图(小地图版本 + 长版)」课程的基础上,我们今天再来学习下如何绘制双变量填充地图,也同样包含两种版本:
![]()
今天我们将会进一步讲解如何使用 R 语言制作三变量填充地图,同样也包含两种版本:
![]()
实际上 R 语言中有绘制三元图的包,不过我觉得今天讲解的这个方法会更容易出图,还是非常值得使用。一些使用 R 语言绘制三变量填充地图的教程都是分别绘制三元图和地图,然后再拼在一起,不如今天讲解的这种方法高效。后面我们再讲解拼图方法。
小地图版本
由于三变量填充地图的图例制作较为费事,所以我只提供了 10 阶的。另外制作过程也较为复杂,我就不再讲解了。
在制作地图之前我们需要简单了解下这种三元图如何阅读:
![]()
为了给对应的格子生成特定的颜色,我设计了一个“三变量填充地图颜色生成器”:https://observablehq.com/d/ac2462c27dac3e35
![]()
该生成器生成的颜色顺序就是按照图中的 1~55:
![]()
三元图看起来很绕,但是抛去具体的值,直接看颜色还是很直观的,例如上图中的蓝色就表示这组数据的 B 含量“满满”,A 和 C 都较少。
所以这个图例的使用方法很简单,下面我们结合具体数据来看下。
各城市人口年龄结构
首先读取之前课程中给大家分享的中国地图数据(经过编辑后的):
library(tidyverse) |
然后读取和处理个城市人口年龄结构数据(2020 年第七次人口普查结果):
haven::read_dta("七普各市人口数据_各年龄组人口比重、有老年人口的户数、户口登记地在外乡镇街道人口.dta") %>% |
读取把图例的 shp 文件:
read_sf("triscale10/triscale10.shp") -> triscale10 |
图例的标签位置数据:
readxl::read_xlsx("triscale10/triscale10_label.xlsx") %>% |
添加颜色。这些颜色就是使用上面提到的颜色生成器生成的:
triscale10 %>% |
对三个变量进行分组
# 注意 BAC 的对应 |
匹配颜色:
mydata2 %>% |
匹配地理信息:
citymap %>% |
绘制地图
然后就可以绘图了:
这里的 cnfont 是在 Profile 里面配置的字体,可以学习系列课程「R 语言数据科学」的第一次课配置。
ggplot(citymap2) + |
![]()
可以看到地图上蓝色的城市表示这些城市的劳动力人口比重较高(15~64岁),偏黄色的则表示少年人口比重较老年人口比重高,偏红色则相反。
长版
附件中也提供了长版地图的绘制数据和代码,绘制方法类似,这里就不再赘述了:
![]()
点击这里跳转到 RStata 短书平台获取附件:使用 R 语言绘制三变量填充中国地图
评论