简介
今天给大家介绍的内容是用 R 语言绘制包含十段线[1]的地图,并且可以根据数据实现对各省份的填色。
现在很多发表的文章中的地图图形都存在问题。很多都是不规范的,并没有包含十段线。本文将利用 R 语言对标准的中国地图进行绘制。
本文参考了两篇推文:1[2]、2[3],并对它们进行了归总,提供了更简洁的可执行代码。
本文的所有代码以及数据可以在公众号后台回复 [
中国地图绘制
] 免费获得。如果需要往期部分推文代码,可去小编的 Github 获得(文末直达)。
加载所需 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/