查看原文
其他

干货分享 | R-ggplot2-如何在时空尺度展示各省份的兴趣数据

申泽西 全国地研联 2021-09-19

0. 问题导入

在我们日常处理地理数据过程中,我们不只单单需要对栅格文件进行空间绘图。同样地,我们也需要根据省份的位置信息对各省的兴趣数据进行空间展示?那么,具体应该怎么实现呢?

本篇以“安徽、江苏、浙江及上海四省市2000-2018年人口MMK趋势值的空间尺度展示”为例,具体给出解决方案~

1. 示例数据

点击下方链接完成示例数据下载,并需要根据setwd()设置默认路径至20200103文件夹下。

setwd('/Users/jerseyshen/Documents/JianShu_Project/20200103')

点击下方链接下载示例各省shp及人口csv数据(https://pan.baidu.com/s/1DaWPcaepNHLCFEHlw2xdqg)

2. 导入示例数据


2.1 合并并导入四省示例人口数据(csv)
pop_list = as.list(list.files('data/',full.names = T))
pop_read = lapply(pop_list, fread)

predel_data <-function(x){
x = x[,-c(1:2)]
x = apply(x, 1, rev)
colnames(x) = c('total','urban','rural')
rownames(x) = paste0('year',2000:2018)
return(x)
}
pop_reframe = lapply(pop_read,predel_data)

pl_bar_df = data.frame(
Date = 2000:2018,
Anhui = pop_reframe[[1]][,1],
JiangShu = pop_reframe[[2]][,1],
Shanghai = pop_reframe[[3]][,1],
Zhejiang = pop_reframe[[4]][,1]
)
pl_bar_m = melt(pl_bar_df,'Date')


2.2 合并并导入四省示例shp文件
library(sf)
shp_file = as.list(list.files('shp/',pattern = '.shp$',
full.names = T))
shp_list = lapply(shp_file, shapefile)

shp_bind = do.call(bind,shp_list)

3. 计算各省人口时间MMK趋势值

 具体关于如何计算MMK趋势值的方法请参考:

R-Modified Mann-Kendall 趋势分析(改进后MK趋势分析)
mk_df = pl_bar_df[,-1]
mk_df = as.matrix(mk_df)
source('~/Documents/JianShu_Project/20191209/mmkTrend.R')

mk_cal <- function(x){
temp_mk = mmkTrend(x)$Zc
return(temp_mk)
}
mk_v = apply(mk_df, 2,mk_cal)

4. 将四省shp文件合并为一个shp文件

shapefile(shp_bind,'roi2.shp')
shp_m = shapefile('roi2.shp')

5. 将合并后的shp文件转为绘图用的data.frame

shp_df = fortify(shp_m)

6. 给各省shp添加MMK趋势值属性

g1 = which(shp_df$id == 0)
g2 = which(shp_df$id == 1)
g3 = which(shp_df$id == 2)
g4 = which(shp_df$id == 3)

shp_df$MK = mk_v[1]
shp_df$MK[g2] = mk_v[2]
shp_df$MK[g3] = mk_v[3]
shp_df$MK[g4] = mk_v[4]

7. 绘制各省2000-2018年人口演进趋势值空间分布图(图1)

mycolor = colorRampPalette(brewer.pal(11,'RdYlBu'))(4)

p1= ggplot()+
geom_polygon(data = shp_df,aes(x = long,y = lat,group = group,fill = MK),
color = 'white')+
scale_fill_gradientn(colours = mycolor)+
coord_fixed(1.3)+
theme_nothing()+
theme(legend.position = 'bottom',
legend.key.width = unit(1.3,'cm'),
legend.text = element_text(face='bold',colour='black',size=12,hjust=.5),
legend.title = element_text(face='bold',colour='black',size=12,hjust=.5))
png('plot1.png',
height = 10,
width = 10,
units = 'cm',
res = 800)
print(p1)
dev.off()

图1 各省2000-2018年人口演进趋势值空间分布图



在完成图1绘制,本篇的第一个小目标就完成了。但是呢,是不是还缺点什么?

是的,单纯基于MMK趋势值,我们智能看到浙江,江苏,上海与安徽四省市在2000年-2018年间压缩后的一个趋势,期间每年具体的人口数我们无法获取信息。

因此,本篇第二个目标就是增加绘制各省2000-2018年人口的时间演进图,并与空间图进行拼接。

8. 绘制各省2000-2018年人口堆叠时间演进子图(图2)

pl_bar_m$variable = factor(pl_bar_m$variable,
levels = c('Shanghai',
'Zhejiang',
'Anhui','JiangShu'))
p2 = ggplot()+
geom_bar(data = pl_bar_m,
aes(x = Date, y = value, fill = variable),
stat = 'identity',
position = 'dodge',
width = 0.5)+
theme_bw()+

theme(
legend.position = 'top',
axis.text = element_text(face='bold',colour='black',size=12,hjust=.5),
axis.title = element_text(face='bold',colour='black',size=12,hjust=.5),
legend.text = element_text(face='bold',colour='black',size=12,hjust=.5),
legend.title = element_blank(),
legend.direction = c('horizontal')
)+
guides(fill = guide_legend(nrow = 1))+
xlab('Date')+
ylab('Population')+
facet_wrap(~variable,nrow = 4,scales = 'free_y')
png('plot2.png',
height = 10,
width = 10,
units = 'cm',
res = 800)
print(p2)
dev.off()

图2 各省2000-2018年人口堆叠时间演进子图

9. 空间图与统计子图拼接(图3)

说说为啥不用facet, 因为两幅图均存在fill 属性,时间统计的fill 是离散的,对应各个省份;空间图fill属性是连续的,对应各省份的MMK趋势值。如果通过facet_wrap 进行拼接,则会出现报错。因此,本篇采用plot_grid 函数将两图进行拼接。

p3 = plot_grid(p2,p1,
rel_heights = c(3,6),
rel_widths = c(3,6),
align = 'h',
axis = 'b',
ncol = 2)

png('plot3.png',
height = 22,
width = 22,
units = 'cm',
res = 800)
print(p3)
dev.off()

图3 空间图与统计子图拼接

10. 总结

本篇共解决了以下两个问题:
1. 如何不同于栅格数据,在R中绘制省级单位尺度特定属性的空间分布图?
2. 如何在统计图与空间图均存在fill 属性时,在R中将统计图与空间图进行拼接?

11. 本篇所使用的R-packages(没有的需要通过install.packages('')进行安装)

library(data.table)
library(ggplot2)
library(maptools)
library(raster)
library(dplyr)
library(reshape2)
library(cowplot)
library(RColorBrewer)
library(ggmap)

12. 作者联系方式

如果在使用本代码的过程有遇到问题的,可以留言评论,也可以私信作者,二维码如下

文章来源于简书,作者为TroyShen,经作者授权转载,版权归原作者所有。

﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌

排版整理:梅换

责任编辑:王佳雯
审编: 王波涛
终审:顾伟男 田巍 梁龙武
猜你喜欢

1 干货分享 | 人本尺度城市形态:一个更精细化的地理尺度

干货分享 | 面板数据单位根检验软件操作和解读

3 会议报道 | 第三届人文与经济地理青年论坛主会场全景回顾

情书征集 | “2020”爱你就要用地理情书说出来


扫描二维码,关注我们

                                                                                                                               喜欢就点个在看嘛~

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存