有条件地将 XY 点添加到 levelplot 生成的栅格地图

Add XY points conditionally to raster map generated by levelplot

我这里有一个棘手的 ifelse 任务。下面是我的代码,显示了两个时期的数据(futurecurrent)。数据在 xy 坐标旁边有 mean, 5th and 95th 个置信区间。我想比较两个 df(futurecurrent)的 mean, 5th and 95th 置信区间(CI)。

条件:

1) 如果 futureCIscurrentCIs 不重叠,并且 future 的 CI 高于当前值,则 pch=2 .

2) 如果 futureCIs 不与 currentCIs 重叠,并且 future 的 CI 低于当前值,则 pch=3 .

3) 如果未来的 CI 与当前的重叠,则 pch=4

library(raster)
library(rasterVis)

    s <- stack(replicate(2, raster(matrix(runif(100), 3))))
    current <- data.frame(coordinates(sampleRandom(s, 3, sp=TRUE)),
                     C5th=c(17.643981,16.83572,9.979904),
                     CMean=c(26.66364,19.74286,15.10000),C95th=c(35.68329,22.64999,20.22010))


    future <- data.frame(coordinates(sampleRandom(s, 3, sp=TRUE)),
                          C5th=c(17.643981,16.83572,9.979904)*2,
                          CMean=c(26.66364,19.74286,15.10000)*2,C95th=c(35.68329,22.64999,20.22010)*2)

以上三个conditions的结果将添加到我的地图中。 类似(只是一次尝试):

levelplot(s, margin=FALSE, at=seq(0, 1, 0.05)) + 
  layer(sp.points(xy, pch=ifelse(condition, 2, 3,4), cex=2, col=1), columns=1) +
  layer(sp.points(xy, pch=ifelse(condition, 2, 3,4), cex=2, col=1), columns=2)

例如下图中,如果NFC的最小值(future)完全位于AFC的最大值(current)之上,则条件1.如果NFC的最大值位于完全低于 AFC 的最小值,则条件 1.The 下图满足条件 3.

请帮忙。 AT.

定义一个完整的SpatialPointsDataFrame对象会更简单 根据定义的附加分类变量 你需要的条件。

library(raster)
library(rasterVis)

s <- stack(replicate(2, raster(matrix(runif(1000), 3))))
## Coordinates
cc <- sampleRandom(s, 3, sp = TRUE)
## Data
current <- data.frame(C5th=c(17.643981,16.83572,9.979904),
                      CMean=c(26.66364,19.74286,15.10000),
                      C95th=c(35.68329,22.64999,20.22010))

future <- data.frame(C5th=c(17.643981,16.83572,9.979904)*2,
                     CMean=c(26.66364,19.74286,15.10000)*2,
                     C95th=c(35.68329,22.64999,20.22010)*2)

cf <- data.frame(current, future)
## Define a categorical variable checking the conditions you need
cf$class <- with(cf,
                 ifelse(C5th > C95th.1, 'A',
                        ifelse(C95th < C5th.1, 'B',
                               ifelse(C5th < C95th.1 && C5th > C5th.1, 'C', 'D')
                               )
                        )
                 )
cf$class <- factor(cf$class)

## Build a SPDF object with the coordinates and data
pp <- SpatialPointsDataFrame(cc, cf)

这个对象可以用spplot显示。有了它你可以选择符号、大小等

levelplot(s) + spplot(pp["class"],
                      pch = 21:23,
                      col.regions = 'gray')