gpt4 book ai didi

r - 绘制栅格,使色带偏差在零附近

转载 作者:行者123 更新时间:2023-12-04 05:02:45 24 4
gpt4 key购买 nike

我正在尝试绘制具有正值和负值的 map 。

就像在此示例图中,所有正值都应为红色,负值应为蓝色,零应为白色,这与带有离散颜色的示例图enter image description here

以下是我正在使用的代码:

library (rasterVis)
ras1 <- raster(nrow=10,ncol=10)
set.seed(1)
ras1[] <- rchisq(df=10,n=10*10)
ras2=ras1*(-1)/2
s <- stack(ras1,ras2)
levelplot(s,par.settings=RdBuTheme())

非常感谢您提供了可以在其他映射练习中应用的通用解决方案。

最佳答案

我写了a gist来做到这一点。它接受由trellis生成的rasterVis::levelplot对象和一个色带,并绘制颜色分散在零附近的对象。

使用s,您可以像这样使用它:

devtools::source_gist('306e4b7e69c87b1826db')
p <- levelplot(s)
diverge0(p, ramp='RdBu')
ramp应该是 RColorBrewer调色板的名称,要插值的颜色矢量或 colorRampPalette

enter image description here

来源:
diverge0 <- function(p, ramp) {
# p: a trellis object resulting from rasterVis::levelplot
# ramp: the name of an RColorBrewer palette (as character), a character
# vector of colour names to interpolate, or a colorRampPalette.
require(RColorBrewer)
require(rasterVis)
if(length(ramp)==1 && is.character(ramp) && ramp %in%
row.names(brewer.pal.info)) {
ramp <- suppressWarnings(colorRampPalette(brewer.pal(11, ramp)))
} else if(length(ramp) > 1 && is.character(ramp) && all(ramp %in% colors())) {
ramp <- colorRampPalette(ramp)
} else if(!is.function(ramp))
stop('ramp should be either the name of a RColorBrewer palette, ',
'a vector of colours to be interpolated, or a colorRampPalette.')
rng <- range(p$legend[[1]]$args$key$at)
s <- seq(-max(abs(rng)), max(abs(rng)), len=1001)
i <- findInterval(rng[which.min(abs(rng))], s)
zlim <- switch(which.min(abs(rng)), `1`=i:(1000+1), `2`=1:(i+1))
p$legend[[1]]$args$key$at <- s[zlim]
p$par.settings$regions$col <- ramp(1000)[zlim[-length(zlim)]]
p
}

请注意,正如@LucasFortini的 post中所建议的那样,如果您希望让colorkey在零以上和以下延伸相同的距离(例如 levelplot(s,par.settings=RdBuTheme(), at=seq(-max(abs(cellStats(s, range))), max(abs(cellStats(s, range))), len=100))),则过程会简单得多。

关于r - 绘制栅格,使色带偏差在零附近,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33750235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com