美文网首页RR语言与统计分析数据-R语言-图表-决策-Linux-Python
R-ggplot2-如何在时空尺度展示各省份的兴趣数据?

R-ggplot2-如何在时空尺度展示各省份的兴趣数据?

作者: TroyShen | 来源:发表于2020-01-03 19:30 被阅读0次

目录

  • 0.问题导入
  • 1.示例数据
  • 2.导入示例数据
  • 3.计算各省人口时间MMK趋势值
  • 4.将四省shp文件合并为一个shp文件
  • 5.将合并后的shp文件转为绘图用的data.frame
  • 6.给各省shp添加MMK趋势值属性
  • 7.绘制各省2000-2018年人口演进趋势值空间分布图(图1)
  • 8.绘制各省2000-2018年人口堆叠时间演进子图(图2)
  • 9.空间图与统计子图拼接(图3)
  • 10.总结
  • 11.本篇所使用的R-packages(没有的需要通过install.packages('')进行安装)
  • 12.致谢

0. 问题导入

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

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

1. 示例数据

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

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

点击我下载示例各省shp及人口csv数据

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. 致谢

首先,感谢大家的持续关注,小编会继续努力,持续更新下去的!

大家如果觉得有帮助啊,还麻烦大家关注点赞,也可以扩散到朋友圈,多多引导朋友加入咱们这个简书技术平台, 代码共享推动科研进程, 多谢大家啦~

大家如果在使用本代码的过程有遇到问题的,可以留言评论,也可以私信我哈~~


小编联系方式

相关文章

  • R-ggplot2-如何在时空尺度展示各省份的兴趣数据?

    目录 0.问题导入 1.示例数据 2.导入示例数据 3.计算各省人口时间MMK趋势值 4.将四省shp文件合并为一...

  • 2022-11-04

    有效策略与时空尺度 注意有效策略适用的时空尺度。 所谓“有效策略适用的时空尺度”,是指如果我们认为一个策略有效时,...

  • Echarts-详细配置-功能升级-地图 (七)

    一. Echarts 地图的展示 和 绘制 的基本使用 需求:如果我只想在某个省份 或者 某个市区 需要展示数据 ...

  • 关于os_signpost使用

    os_signpost结合TimeProfile在性能优化的数据展示中能够更加直观、方便,这里主要展示如何在项目中...

  • 变换尺度:不读书法读《好好学习》

    启发点 所有顶级的战略思考方法,本质上都是“时空尺度”的切换。让我们从眼前熟悉的尺度里跳出,看到更大时空下的动态规...

  • Echarts实现中国地图、省份地图及对应数据展示

    Echarts实现中国地图、省份地图及对应数据展示 一、概述 首先ECharts 是一个使用 JavaScript...

  • TKDE|Foresee Urban Sparse Traffi

    稀疏交通事故预测:以时空多尺度视角 本文以交通事故预测为应用背景,提出了一个基于多源时空数据的多步、多粒度稀疏事件...

  • 关于数据挖掘

    我们现在身处一个信息极其发达和每天都会产生大量的数据.如何在如海洋般的数据里去挖掘对我们感兴趣的和关心的知识呢?于...

  • R-如何在R中用shapefile掩膜兴趣点

    0. 数据及软件包准备 随机生成的兴趣点 全球大洲尺度shapefile 非洲shapefile 1. 目标 利用...

  • 离散与连续

    在量子君发表的《如何用量子离散性来理解时空弯曲?》这篇文章中,所谓“时空在微观尺度上是离散的,而在宏观尺度上看起来...

网友评论

    本文标题:R-ggplot2-如何在时空尺度展示各省份的兴趣数据?

    本文链接:https://www.haomeiwen.com/subject/zbzzoctx.html