全网最完整的中国地图

写在前面

目前,R语言中大量的中国地图存在错误,主要包括以下几个部分:

  • 台湾

  • 南海诸岛

  • 西藏南部这些问题还有一些其他的问题我们是不能出现一个错误的,一个都不能有,所以这里我将最为完整的中国地图送过大家,这些地图资源部分来自R语言可视化之美的资料,部分来自微生信生物群友提供。

    所谓千家饭千家吃,我这里也就帮助大家整理一下代码,完成成图的绘制。

实战

library(maptools)
library(sf)
library(ggplot2)
library(maps)
library(mapdata)
library(sf)
library(raster)
library(dplyr)
library(spData)

正确的中国地图

第一种类型 长地图

这里提供的地图资源来自网络,由微生信生物群友提供。如有免费打包供大家使用,如有侵权,联系删除。

china_map <- readShapePoly('./bou2_4m//bou2_4p.shp')
head(fortify(china_map))
chinmap = fortify(china_map)
# chinmap = dplyr::filter(chinmap, group == 0.1)
head(chinmap)
p = ggplot()+geom_polygon(data = chinmap,aes(x=long,y=lat,group=group,fill = group),colour='grey')+
scale_fill_discrete(guide = FALSE)

添加九段线nine <- sf::st_read('../中国边境等//全国行政区划练习用数据/国界九段线.shp')
nine
p
p1 = p +geom_sf(data = nine,aes( geometry = `geometry`),color = "grey30")
p1

添加南海诸岛northear <- sf::st_read('../中国边境等//全国行政区划练习用数据/南海诸岛.shp')

p2 = p1 +geom_sf(data = northear,aes( geometry = `geometry`),color = "grey30")
p2

第二种类型 宽地图 南海小图

如何将南海诸岛作为图例添加到右下角

将南海诸岛作为图例放到地图成图右下角,是一个很好的选择,不至于图形太长。

library(rgdal)
library(geosphere)
library(showtext)
dataProjected <- readOGR("./bou2_4m//bou2_4p.shp")
dataProjected@data$id <- rownames(dataProjected@data)
watershedPoints <- fortify(dataProjected)
df_China2 <- full_join(watershedPoints, dataProjected@data, by = "id")
df_China2$class<-rep("Mainland",nrow(df_China2))

df_NanHaiLine <- read.csv("./bou2_4m/中国南海九段线.csv")
colnames(df_NanHaiLine)<-c("long","lat","ID")
Width<-9
Height<-9
long_Start<-124
lat_Start<-16
df_Nanhai<-df_China2[df_China2$long>106.55 & df_China2$long<123.58,]
df_Nanhai<-df_Nanhai[df_Nanhai$lat>4.61 & df_Nanhai$lat<25.45,]
min_long<-min(min(df_Nanhai$long, na.rm = TRUE),min(df_NanHaiLine$long))
min_lat<-min(min(df_Nanhai$lat, na.rm = TRUE),min(df_NanHaiLine$lat))
max_long<-max(min(df_Nanhai$long, na.rm = TRUE),max(df_NanHaiLine$long))
max_lat<-max(max(df_Nanhai$lat, na.rm = TRUE),max(df_NanHaiLine$lat))
df_Nanhai$long<-(df_Nanhai$long-min_long)/(max_long-min_long)*Width+long_Start
df_Nanhai$lat<-(df_Nanhai$lat-min_lat)/(max_lat-min_lat)*Height+lat_Start
df_Nanhai$class<-rep("NanHai",nrow(df_Nanhai))
df_China2<-rbind(df_China2,df_Nanhai)

df_NanHaiLine$long<-(df_NanHaiLine$long-min_long)/(max_long-min_long)*Width+long_Start
df_NanHaiLine$lat<-(df_NanHaiLine$lat-min_lat)/(max_lat-min_lat)*Height+lat_Start

head(df_China2)

ggplot()+
geom_polygon(data=df_China2, aes(x=long, y=lat, group=interaction(class,group),fill = NAME),colour="grey30",size=0.1)+
#九段线绘制
geom_line(data=df_NanHaiLine, aes(x=long, y=lat, group=ID), colour="black", size=1)+
geom_segment(aes(x = c(124,124,133,124),y =c(10,10,10,25),xend = c(124,133,133,133),yend = c(25,10,25,25) )) +
scale_fill_discrete(guide = FALSE)+
theme_bw()

其实南海部分通过拼图即可解决

将坐标轴坐标调整到南海整个范围,然后通过拼图即可轻松解决。上面的方法采用张杰老师R数据可视化之美中的比较麻烦的方法改编而成。也是之前写的推送了,现在可以直接拼图。这个工作留给大家,如果确实存在问题,请留言,我做给大家。

reference

(0)

相关推荐