前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R 语言绘制十段线地图,给特定省份填色

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

作者头像
庄闪闪
发布2022-10-31 10:10:40
2.1K1
发布2022-10-31 10:10:40
举报

简介

今天给大家介绍的内容是用 R 语言绘制包含十段线[1]的地图,并且可以根据数据实现对各省份的填色。

现在很多发表的文章中的地图图形都存在问题。很多都是不规范的,并没有包含十段线。本文将利用 R 语言对标准的中国地图进行绘制。

本文参考了两篇推文:1[2]2[3],并对它们进行了归总,提供了更简洁的可执行代码。

本文的所有代码以及数据可以在公众号后台回复 [中国地图绘制] 免费获得。如果需要往期部分推文代码,可去小编的 Github 获得(文末直达)。

导入 R 包

加载所需 R 包:

代码语言:javascript
复制
packages <- c("geojsonsf","sf","ggplot2","RColorBrewer")
install.packages(packages)
library(geojsonsf)
library(sf)
library(ggplot2)
library(RColorBrewer)

获取地图数据

通过调用 API[4] 来获取数据,这里需要获取全国和国境线的 json 数据,以及省份的经纬度。

全国和国境线的 json 数据,省份经纬度数据,以及本文源代码可以在公众号后台回复[中国地图绘制],免费获得。

代码语言:javascript
复制
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")

绘制空白中国地图

代码语言:javascript
复制
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())

加入南海辅图

代码语言:javascript
复制
# 读入数据
 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"))

组合图形

代码语言:javascript
复制
fig = ggdraw() +
   draw_plot(fig1) +
   draw_plot(fig2, x = 0.8, y = 0, width = 0.13, height = 0.39)
fig

地图填色

所需的数据格式如下:

代码语言:javascript
复制
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()函数:

代码语言:javascript
复制
colour$QUHUADAIMA <- as.character(colour$QUHUADAIMA)
CHINA <- dplyr::left_join(China,colour,by= "QUHUADAIMA")

在绘制全局地图的命令中添加scale_fill_manual()函数给地图填色,配色方案可以参考:

代码语言:javascript
复制
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,后续将这个颜色变量转为因子型。

代码语言:javascript
复制
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

修改之前的填色代码:

代码语言:javascript
复制
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/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 庄闪闪的R语言手册 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导入 R 包
  • 获取地图数据
  • 绘制空白中国地图
  • 加入南海辅图
  • 组合图形
  • 地图填色
  • 给特定省份填色
    • 参考资料
    相关产品与服务
    图数据库 KonisGraph
    图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档