简介
今天给大家介绍的内容是用 R 语言绘制包含十段线[1]的地图,并且可以根据数据实现对各省份的填色。
现在很多发表的文章中的地图图形都存在问题。很多都是不规范的,并没有包含十段线。本文将利用 R 语言对标准的中国地图进行绘制。
本文参考了两篇推文:1[2]、2[3],并对它们进行了归总,提供了更简洁的可执行代码。
本文的所有代码以及数据可以在公众号后台回复 [
中国地图绘制
] 免费获得。如果需要往期部分推文代码,可去小编的 Github 获得(文末直达)。
导入 R 包
加载所需 R 包:
packages <- c("geojsonsf","sf","ggplot2","RColorBrewer") install.packages(packages) library(geojsonsf) library(sf) library(ggplot2) library(RColorBrewer)
获取地图数据
通过调用 API[4] 来获取数据,这里需要获取全国和国境线的 json 数据,以及省份的经纬度。
全国和国境线的 json 数据,省份经纬度数据,以及本文源代码可以在公众号后台回复[
中国地图绘制
],免费获得。
API_pre = "http://xzqh.mca.gov.cn/data/" ## 读取全国数据 China = st_read(dsn = paste0(API_pre, "quanguo.json"), stringsAsFactors=FALSE) ## 使用 4326 地理坐标系 st_crs(China) = 4326 # 读取国界线数据 China_line = st_read(dsn = paste0(API_pre, "quanguo_Line.geojson"), stringsAsFactors=FALSE) st_crs(China_line) = 4326 ## 选择区划代码为国界线的区域 gjx <- China_line[China_line$QUHUADAIMA == "guojiexian",] # 读取省份经纬度 province <- read.csv("data/province.csv")
绘制空白中国地图
fig1 <- ggplot()+ # 绘制主图 geom_sf(data = CHINA,fill='NA') + # 绘制国界线及十段线 geom_sf(data = gjx)+ ##添加省份名称 geom_text(data = province,aes(x=dili_Jd,y=dili_Wd,label=省市),position = "identity",size=3,check_overlap = TRUE) + labs(title="中国地图")+ theme(plot.title = element_text(color="black", size=16, face="bold",vjust = 0.1,hjust = 0.5), legend.title=element_blank(), legend.position = c(0.2,0.2), panel.grid=element_blank(), panel.background=element_blank(), axis.text=element_blank(), axis.ticks=element_blank(), axis.title=element_blank() )+ ##添加指北针,“style”参数可以更改样式 annotation_north_arrow(location='tl', which_north='false', style=north_arrow_orienteering())
加入南海辅图
# 读入数据 nine_lines = read_sf('data/九段线GS(2019)1719号.geojson') # 绘制九段线小图 fig2 = ggplot() + geom_sf(data = CHINA,fill='NA', size=0.5) + geom_sf(data = nine_lines,color='black',size=0.5)+ ##去掉主图的部分区域 coord_sf(ylim = c(-4028017,-1877844),xlim = c(117131.4,2115095),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,color="grey10",linetype=1,size=0.5), plot.margin=unit(c(0,0,0,0),"mm"))
组合图形
fig = ggdraw() + draw_plot(fig1) + draw_plot(fig2, x = 0.8, y = 0, width = 0.13, height = 0.39) fig
地图填色
所需的数据格式如下:
colour <- read.csv("data/colour.csv") head(colour) shengfen colour QUHUADAIMA 1 新疆 0~200 650000 2 西藏 0~200 540000 3 青海 600~1000 630000 4 甘肃 0~200 620000 5 宁夏 200~400 640000 6 内蒙古 400~600 150000
将颜色数据按照省份名称对应添加到全国数据中,这里用到了dyplr
包中left_join()
函数:
colour$QUHUADAIMA <- as.character(colour$QUHUADAIMA) CHINA <- dplyr::left_join(China,colour,by= "QUHUADAIMA")
在绘制全局地图的命令中添加scale_fill_manual()
函数给地图填色,配色方案可以参考:
fig1 <- ggplot() + geom_sf( data = CHINA, aes(fill = factor(colour))) + ## 填色 scale_fill_manual( "class", values = c("#9CEED3", "#79CBC2", "#5EA9AC", "#4B8793", "#3C6777"), breaks = c("0~200", "200~400", "400~600", "600~1000", "1000+"), labels = c("0~200", "200~400", "400~600", "600~1000", "1000+") ) + geom_sf(data = gjx) + geom_text( data = province, aes(x = dili_Jd, y = dili_Wd, label = 省市), position = "identity", size = 3, check_overlap = TRUE ) + labs(title = "中国地图") + theme( plot.title = element_text( color = "black", size = 16, face = "bold", vjust = 0.1, hjust = 0.5 ), legend.title = element_blank(), legend.position = c(0.2, 0.2), panel.grid = element_blank(), panel.background = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), axis.title = element_blank() ) + annotation_north_arrow( location = 'tl', which_north = 'false', style = north_arrow_orienteering() ) # 读入九段线数据 nine_lines = read_sf('地图文件geojson/九段线GS(2019)1719号.geojson') # 绘制九段线小图 nine_map = ggplot() + geom_sf(data = CHINA,fill='NA', size=0.5) + geom_sf(data = nine_lines,color='black',size=0.5)+ coord_sf(ylim = c(-4028017,-1877844),xlim = c(117131.4,2115095),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,color="grey10",linetype=1,size=0.5), plot.margin=unit(c(0,0,0,0),"mm")) # 使用cowplot包将大图小图拼在一起 fig = ggdraw() + draw_plot(fig1) + draw_plot(nine_map, x = 0.8, y = 0, width = 0.13, height = 0.39) fig
给特定省份填色
给大家一种最简单的方法,直接修改数据,目标省份赋予特定数据,不需要填色的省份 colour 值都标为 0,后续将这个颜色变量转为因子型。
colour$new_colour <- rep(0,nrow(colour)) ##给目标省份赋予不同的数值 colour$new_colour[which(colour$shengfen=="重庆")] <- 1 colour$new_colour[which(colour$shengfen=="山西")] <- 2 colour$new_colour[which(colour$shengfen=="新疆")] <- 3 colour$new_colour[which(colour$shengfen=="内蒙古")] <- 4 CHINA <- dplyr::left_join(China,colour,by= "QUHUADAIMA") head(colour) shengfen colour QUHUADAIMA new_colour 1 新疆 0~200 650000 3 2 西藏 0~200 540000 0 3 青海 600~1000 630000 0 4 甘肃 0~200 620000 0 5 宁夏 200~400 640000 0 6 内蒙古 400~600 150000 4
修改之前的填色代码:
aes(fill = factor(new_colour))) + scale_fill_manual( "class", values = c("#FFFFFF", "#79CBC2", "#5EA9AC", "#4B8793", "#3C6777"), breaks = c("0", "1", "2", "3", "4"), labels = c("0", "1", "2", "3", "4") )
参考资料
[1]
十段线: https://baike.baidu.com/item/%E5%8D%81%E6%AE%B5%E7%BA%BF/14688257
[2]
1: https://bbs.pinggu.org/thread-9927782-1-1.html
[3]
2: https://blog.csdn.net/joywww/article/details/116521133
[4]