R-如何在NC时间堆叠数据集中根据坐标提取数据并展示其趋势

目录

  • 0.问题导入
  • 1.示例数据
  • 2.导入NC数据与兴趣点坐标
  • 3.根据兴趣点左边范围裁剪shp文件
  • 4.将兴趣点转化为SpatialPoints
  • 5.根据兴趣点坐标信息提取对应位置sc-PDSI指标时间序列
  • 6.sc-PDSI序列矩阵NA值检查
  • 7.计算兴趣点对应序列的趋势值
  • 8.空间可视化
  • 9.空间可视化优化
  • 10.本文所用到的软件包
  • 11.本文总结
  • 12.致谢

0. 问题导入

当我们拿到一个高维的NC数据的时候,可能有时候不需要对所有栅格值进行计算,只是单纯地想根据兴趣点提取对应位置的指标时间序列,那么我们应该怎样处理呢?本篇文章给出解决方案。


同之前一样,本文所用软件包附于文末


1. 示例数据

本篇所采用的NC示例数据与上一篇" R-ggplot2-说说绘图中颜色的这点事-应该是比较全的总结篇 "的示例数据一致,同样采用的是“全球sc-PDSI(干旱指数)1901-2018年的月尺度数据”。数据信息如下:

  • 时间分辨率:月
  • 空间分辨率:0.5°×0.5°
  • 数据维度:360(行数)×720(列数)×1416(月份个数,也称数据深度),储存方式如图1。

下载链接如下:
点我下载NC文件

图1 NC文件数据储存格式-吃货解说版

本篇采用示例坐标数据为中国区域内随机生成的坐标,下载方式如下:
点我下载兴趣点数据

本篇采用的世界大洲级地图(shp文件)下载方式如下:
点我下载world.shp 文件

2. 导入NC数据与兴趣点坐标

input_nc = 'L:\\JianShu\\2019-12-07\\data\\scpdsi_1901_2018.nc'
nc_stack = stack(input_nc)

input_loc = 'L:\\JianShu\\2019-12-08\\data\\loc.csv'
loc = read.csv(input_loc,header = T)
loc = loc[,-1]

3. 根据兴趣点左边范围裁剪shp文件

ex_crop = extent(min(loc[,1])-2,max(loc[,1])+2,min(loc[,2])-2,max(loc[,2])+2)
world = shapefile('L:\\JianShu\\2019-12-08\\data\\shp\\world_continent2.shp')
world_crop = crop(world,ex_crop)

4. 将兴趣点转化为SpatialPoints

sp = SpatialPoints(loc)

5. 根据兴趣点坐标信息提取对应位置sc-PDSI指标时间序列

df = extract(nc_stack,sp)
df = t(df)
print(ncol(df)) #列数对应为点的个数

6. sc-PDSI序列矩阵NA值检查

col_na = which(is.na(apply(df,2,mean)))
if(length(col_na) == 0){
    df_na_re = df
    loc_na_re = loc
}else{
    df_na_re = df[,-col_na]
    loc_na_re  = loc[,-col_na]
}

7. 计算兴趣点对应序列的趋势值

趋势值的计算我们采用的是改进后的Mann-Kendall 趋势分析方式, 详细介绍可参照R-Modified Mann-Kendall 趋势分析(改进后MK趋势分析)这篇博文, 里边文末有附本文所用的mmkTrend函数, 记住一定将其保存为R文件,然后在Rstudio中source一下,才能用哈~就像这样:

 source('L:/JianShu/2019-12-08/mmkTrend.R')
mmk_cal<-function(x){
  temp_mk = mmkTrend(x)$Zc
  return(temp_mk)
}
mmk_box = apply(df_na_re,2,mmk_cal)

8. 空间可视化

df = data.frame(
long = loc_na_re[,1],
lat = loc_na_re[,2],
MMK = as.numeric(mmk_box)
)
df_m = melt(df,c('long','lat'))

df_m$cuts = cut(df_m$value,
breaks = seq(round((min(df_m$value)-1)),round((max(df_m$value)+1)),1))

df_m$size = df_m$cuts

world_crop_df = fortify(world_crop)

p = ggplot()+
  geom_polygon(data = world_crop_df,aes(x = long,y = lat, group = group),
               fill = 'transparent',color = 'black',size = 0.5)+
  geom_hline(aes(yintercept = 50),linetype = 'dashed',alpha = 0.5,lwd = 0.5,color = 'black')+
  geom_hline(aes(yintercept = 40),linetype = 'dashed',alpha = 0.5,lwd = 0.5,color = 'black')+
  geom_hline(aes(yintercept = 30),linetype = 'dashed',alpha = 0.5,lwd = 0.5,color = 'black')+
  geom_hline(aes(yintercept = 20),linetype = 'dashed',alpha = 0.5,lwd = 0.5,color = 'black')+
  geom_vline(aes(xintercept = 80),linetype = 'dashed',alpha = 0.5,lwd = 0.5,color = 'black')+
  geom_vline(aes(xintercept = 100),linetype = 'dashed',alpha = 0.5,lwd = 0.5,color = 'black')+
  geom_vline(aes(xintercept = 120),linetype = 'dashed',alpha = 0.5,lwd = 0.5,color = 'black')+
  
  geom_point(data = df_m,aes(x = long,y = lat, color = cuts,size= size))+
  theme(panel.background = element_rect(fill = 'transparent',color = 'black'),
        axis.text = element_text(face='bold',colour='black',size=fontsize,hjust=.5),
        axis.title = element_text(face='bold',colour='black',size=fontsize,hjust=.5),
        legend.position=c('bottom'),
        legend.direction = c('horizontal'))+
  scale_color_brewer(palette = 'Spectral')+
  scale_size_manual(values = 1:10)+
  coord_fixed(1.3)+
  
  guides(fill=guide_legend(nrow=2))+
  xlab('Longitude')+
  ylab('Latitude')


图2 兴趣点1901-2018年sc-PDSI MMK趋势空间分布图

但是,大家有没有觉得很别扭


嗯嗯, 是的!!!又是一个逼死强迫症患者的技术BUG,点大小的分级与颜色的分级没有重合!!!是不是很难受!

来, 下边我们一起来解决这个BUG!

9. 空间可视化优化

首先, 问题诊断. 出现以上问题的原因呢是在这一句:

 geom_point(
data = df_m,
aes(x = long,y = lat, 
color = cuts,
size= size))+

很多时候,我们为了绘图理解的方便,会将color和size的分组在绘图的data.frame中分开,尽管他们是一样的。

head(df_m)
    long   lat variable      value    cuts    size
1 122.52 52.97      MMK  1.8868017   (1,2]   (1,2]
2 124.48 47.80      MMK  0.9688879   (0,1]   (0,1]
3 125.25 45.70      MMK -0.4857201  (-1,0]  (-1,0]
4  84.67 44.43      MMK  1.1515050   (1,2]   (1,2]
5  75.25 39.72      MMK  2.2346846   (2,3]   (2,3]
6 101.07 41.95      MMK -2.3940473 (-3,-2] (-3,-2]

但这正是导致问题的症结所在, 为了将两组图例合并在一起,我们应该将出问题的这一句绘图函数更换成下式:

 geom_point(
data = df_m,
aes(x = long,y = lat, 
color = cuts,
size= cuts))+

然后,绘图结果就如图3所示, 将size与color的图例合并为一个,这样看起来就舒服多了~~~


图3 优化后的图件

10. 本文所用到的软件包(没有的记得用install.packages('package name')进行安装)

library(raster)
library(reshape2)
library(sp)
library(RColorBrewer)
library(ggplot2)

11. 总结

回顾一下, 本篇文章主要解决如下几个问题:

  1. 如何从NC时间堆叠数据集中根据坐标提取数据?
  2. 如何计算各个兴趣点的MMK趋势值?
  3. 如何根据各点MMK趋势值的大小绘制空间图并体现其差异性?
  4. 当点的大小与颜色的图例分开时,如何将其合并在一起?

12. 致谢

大家如果觉得有用,还麻烦大家关注点赞,也可以扩散到朋友圈,帮助到绘图中同样陷入颜色选择困难症的TA

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

我的联系方式
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342