R 语言绘制十段线地图,给特定省份填色

简介: R 语言绘制十段线地图,给特定省份填色

简介

今天给大家介绍的内容是用 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]

API: http://xzqh.mca.gov.cn/data/

目录
相关文章
|
7月前
|
数据可视化 定位技术
R语言空间可视化:绘制英国脱欧投票地图
R语言空间可视化:绘制英国脱欧投票地图
|
7月前
|
数据可视化 定位技术
r语言空间可视化绘制道路交通安全事故地图
r语言空间可视化绘制道路交通安全事故地图
|
7月前
|
数据可视化 定位技术 网络架构
R语言在地图上绘制月亮图、饼状图数据可视化果蝇基因种群
R语言在地图上绘制月亮图、饼状图数据可视化果蝇基因种群
|
7月前
|
JavaScript 前端开发 定位技术
用R语言制作交互式图表和地图
用R语言制作交互式图表和地图
|
7月前
|
数据可视化 定位技术
R语言ggmap空间可视化机动车交通事故地图
R语言ggmap空间可视化机动车交通事故地图
|
7月前
|
数据可视化 Serverless 定位技术
R语言ggmap空间可视化机动车碰撞–街道地图热力图
R语言ggmap空间可视化机动车碰撞–街道地图热力图
|
3月前
|
数据采集 机器学习/深度学习 数据可视化
R语言从数据到决策:R语言在商业分析中的实践
【9月更文挑战第1天】R语言在商业分析中的应用广泛而深入,从数据收集、预处理、分析到预测模型构建和决策支持,R语言都提供了强大的工具和功能。通过学习和掌握R语言在商业分析中的实践应用,我们可以更好地利用数据驱动企业决策,提升企业的竞争力和盈利能力。未来,随着大数据和人工智能技术的不断发展,R语言在商业分析领域的应用将更加广泛和深入,为企业带来更多的机遇和挑战。
|
2月前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
57 3
|
7月前
|
数据可视化 数据挖掘 API
【R语言实战】聚类分析及可视化
【R语言实战】聚类分析及可视化