干湿月 rasterbrick R 出现频率
Frequency of occurrence of dry and wet months rasterbrick R
我有一个 rasterbrick,a
由 1950-2014 年的月度时间序列组成(见下文)。我试图在 a 上完成的任务是计算每个网格点:
negative/positive number of dry/wet months per total months of dry/wet events*100
,
哪里
干值在 −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)
这里有一个适合您的解决方案。它不会生成正百分比和负百分比,而是生成您的值之一的百分比。百分比的工作方式,您仍然可以规划出您想要的内容。
注意:我没有使用您的数据集,而是创建了一个具有相同值范围的示例数据。这些值将或多或少地随机采样(我加入了偏暖*以获得一种颜色的趋势),所以不要期望有漂亮的图案。
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
*
气候变化是真实存在的
我有一个 rasterbrick,a
由 1950-2014 年的月度时间序列组成(见下文)。我试图在 a 上完成的任务是计算每个网格点:
negative/positive number of dry/wet months per total months of dry/wet events*100
,
哪里
干值在 −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)
这里有一个适合您的解决方案。它不会生成正百分比和负百分比,而是生成您的值之一的百分比。百分比的工作方式,您仍然可以规划出您想要的内容。
注意:我没有使用您的数据集,而是创建了一个具有相同值范围的示例数据。这些值将或多或少地随机采样(我加入了偏暖*以获得一种颜色的趋势),所以不要期望有漂亮的图案。
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
*
气候变化是真实存在的