我有一个栅格砖,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)
答案 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)
HTH
*
气候变化是真实的