干湿月的发生频率rasterbrick R

时间:2017-08-09 02:57:09

标签: r time-series frequency raster

我有一个栅格砖,a由1950 - 2014年的月度时间序列组成(见下文)。我试图在a上完成的任务是在每个网格点计算:

negative/positive number of dry/wet months per total months of dry/wet events*100

,其中

dry的值范围为−1.49 to −1.00,湿值范围为1.49 to 1.00

结果输出为单rasterLayer,干=负百分比,湿=正百分比,这样我就可以将光栅用蓝色映射为湿,红色为干。

可以找到示例数据HERE

dd=spei03_df
dd[1:2]<-dd[2:1]#swap lat and lon
a=rasterFromXYZ(dd)
dates=seq(as.Date("1950-01-01"), as.Date("2014-12-31"), by="month")
a=setZ(a,dates)

1 个答案:

答案 0 :(得分:0)

这是一个适合您的解决方案。它不会产生正负百分比,而是产生一个值的百分比。百分比的工作方式,你仍然可以找出你想要的东西。

注意:我创建了一个具有相同值范围的示例数据,而不是使用您的数据集。这些值将或多或少地随机抽样(我包括偏向于更温暖*以获得一种颜色的趋势),所以不要期待一个漂亮的模式。

library(raster)

## create sample data

#values
dry <- seq(-1,-1.49,by=-0.01)
wet <- dry * -1

#raster brick

r <- lapply(seq_len(length(1950:2014)*12),function(x){

  r <- raster()
  r[] <- sample(c(wet,dry),ncell(r),T,c(rep(0.3,50),rep(0.7,50)))
  r
})

r <- do.call(brick,r)

names(r) <- seq(as.Date("1950-01-01"), as.Date("2014-12-31"), by="month")

#output

> r
class       : RasterBrick 
dimensions  : 180, 360, 64800, 780  (nrow, ncol, ncell, nlayers)
resolution  : 1, 1  (x, y)
extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 
data source : /tmp/Rtmp3BTUH1/raster/r_tmp_2017-08-09_120141_2859_73743.grd 
names       : X1950.01.01, X1950.02.01, X1950.03.01, X1950.04.01, X1950.05.01, X1950.06.01, X1950.07.01, X1950.08.01, X1950.09.01, X1950.10.01, X1950.11.01, X1950.12.01, X1951.01.01, X1951.02.01, X1951.03.01, ... 
min values  :       -1.49,       -1.49,       -1.49,       -1.49,       -1.49,       -1.49,       -1.49,       -1.49,       -1.49,       -1.49,       -1.49,       -1.49,       -1.49,       -1.49,       -1.49, ... 
max values  :        1.49,        1.49,        1.49,        1.49,        1.49,        1.49,        1.49,        1.49,        1.49,        1.49,        1.49,        1.49,        1.49,        1.49,        1.49, ... 
  -1.49,   -1.49,    -1.49,    -1.49,    -1.49,    -1.49,    -1.49,    -1.49, ... 
max values  :    1.49,    1.49,    1.49,    1.49,    1.49,    1.49,    1.49,    1.49,    1.49,     1.49,     1.49,     1.49,     1.49,     1.49,     1.49, ... 

现在计算频率:

rfreq <- calc(r,fun = function(x){(sum(x > 0) / nlayers(r))*100})

像这样,每个像素的值都在0到100之间,表示从所有月份干燥到所有月份湿润的范围,均衡值为50.因此您可以轻松地将其映射为红色和蓝色。如果您仍想要百分比,则只需添加带有相应标签的图例:

library(rasterVis)

my.at <- c(0,30,50,70,100)

myColorkey <- list(at=my.at,
                   space = 'bottom',
                   labels=list(
                     labels=c('extreme dry','dry','normal','wet','extreme wet'), ## labels
                     at=c(15,40,50,60,85) ## where to print labels
                   ))

levelplot(rfreq, at=my.at,
          colorkey=myColorkey,scales=list(draw=FALSE),margin=FALSE,
          par.settings=RdBuTheme(),
          main = 'Precipitation 1950 - 2014',
          xlab=NULL, ylab=NULL)

enter image description here

HTH

*

  

气候变化是真实的