张金龙的博客分享 http://blog.sciencenet.cn/u/zjlcas 物种适应性、分布与进化

博文

R绘制中国地图:你去过哪些省份?

已有 11789 次阅读 2018-6-4 17:47 |个人分类:生活点滴|系统分类:生活其它

最近,微信中去过哪些省份的小程序十分火爆,用户通过选择去过哪些省份和地级市, 提交之后后台就自动生成地图。其实该地图要绘制起来并不困难。 这里给出绘制去过哪些省份的R代码。供参考


代码和R脚本 map of china.zip


setwd("C:\\Users\\jlzhang\\20180604")
#### 导入所需要的程序包library(maptools)
## Loading required package: sp
## Checking rgeos availability: TRUE
library(ggplot2)
library(rgdal)
## rgdal: version: 1.3-1, (SVN revision 747)
##  Geospatial Data Abstraction Library extensions to R successfully loaded
##  Loaded GDAL runtime: GDAL 2.2.3, released 2017/11/20
##  Path to GDAL shared files: C:/Users/jlzhang/Documents/R/win-library/3.5/rgdal/gdal
##  GDAL binary built with GEOS: TRUE 
##  Loaded PROJ.4 runtime: Rel. 4.9.3, 15 August 2016, [PJ_VERSION: 493]
##  Path to PROJ.4 shared files: C:/Users/jlzhang/Documents/R/win-library/3.5/rgdal/proj
##  Linking to sp version: 1.2-7
rm(list = ls())  ## 删除所有对象

## 去过的地方
provinces_visited <- c("Beijing", "Hebei", "Heilongjiang", 
               "Liaoning", "Jilin", "Jiangxi", "Hunan",
               "Zhejiang", "Hubei", "Chongqing", "Sichuan",
               "Henan", "Guangxi", "Guangdong", "Fujian",
               "Hainan", "Yunnan", "Guizhou")
provinces_visited_df <- data.frame(province_pinyin = provinces_visited, 
                                   visited_status = rep("Visited", length(provinces_visited)))

## 读取地图
country      <- readOGR("bou1_4l.shp")
## OGR data source with driver: ESRI Shapefile 
## Source: "C:\Users\jlzhang\20180604\bou1_4l.shp", layer: "bou1_4l"
## with 1382 features
## It has 8 fields
## Integer64 fields read as strings:  FNODE_ TNODE_ LPOLY_ RPOLY_ BOU1_4M_ BOU1_4M_ID
province     <- readOGR("province_polygon.shp")    ## 各省多边形
## OGR data source with driver: ESRI Shapefile 
## Source: "C:\Users\jlzhang\20180604\province_polygon.shp", layer: "province_polygon"
## with 34 features
## It has 10 fields
province$ID  <- as.character(province$ID) 

## 转换为ggplot2绘图用的data.frame
country_df  <- fortify(country)
province_df <- fortify(province)
## Regions defined for each Polygons
## 提取省级数据中的信息
province_dat <- province@data

## 改正省级数据中关于香港和澳门的错误
index_HK <- which(province_dat$ID == "Xianggang")
province_dat$X[index_HK] <- 114.156121
province_dat$Y[index_HK] <-  22.37725
province_dat$ID[index_HK] <- "Hong Kong"

index_MC <- which(province_dat$ID == "Aomen")
province_dat$X[index_MC] <- 113.545681
province_dat$Y[index_MC] <-  20.197303
province_dat$ID[index_MC] <- "Macau"

## id与province_df数据表中的省出现的顺序相同, 这里id都从0开始, 所以需要减去1,以便匹配
province_dat$id <- as.character(1:nrow(province_dat) - 1)

## 增加省拼音
province_dat2 <- merge(province_dat, provinces_visited_df, by.x = "ID", 
                       by.y = "province_pinyin", all.x = TRUE)


## 由于visited status 默认是 factor 类型, 这里需要先转换为字符串, 再处理
province_dat2$visited_status <- as.character(province_dat2$visited_status)

## 所有没有匹配上的省份都是没有去过的, 状态为 not yet
province_dat2$visited_status[is.na(province_dat2$visited_status)] <- "Not Yet"
province_df_merged <- merge(province_df, province_dat2, by = "id")
                       
## 绘图
## 用geom_path绘制读取的polyline,因为国界线是polyline
## 多圆锥投影 
## http://desktop.arcgis.com/zh-cn/arcmap/10.3/guide-books/map-projections/polyconic.htm

ggplot() + geom_path(data = country_df, 
             aes(x = long, y = lat, group=group), colour="darkblue") +  
coord_map("polyconic") +                                                
geom_polygon(data = province_df_merged, 
             aes(x = long, y = lat, group=group, 
                 fill = visited_status), colour="grey") + 
geom_text(mapping = aes(x = X, y = Y, label = ID), 
          data = province_dat, colour = 'Black')+
ggtitle("Provinces I have been to:") + 
xlab("Longitude") + 
ylab("Latitude") + 
theme(legend.position = "bottom") + 
scale_fill_discrete(name = "Province")


参考
## https://zhuanlan.zhihu.com/p/25231546 
## http://eriqande.github.io/rep-res-web/lectures/making-maps-with-R.html 
## http://www.statsoft.org/wp-content/uploads/2016/09/Lecture6_HKMapVis.html




https://blog.sciencenet.cn/blog-255662-1117385.html

上一篇:用R绘制采样点地图——带指北针、比例尺、图例
下一篇:当原创幻灯片也遇到剽窃
收藏 IP: 113.28.150.*| 热度|

1 李学友

该博文允许注册用户评论 请点击登录 评论 (1 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-3-29 07:39

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部