首页 文章

绘制没有ggplot2的堆栈的渐变颜色

提问于
浏览
0

我想用渐变颜色绘制我的光栅层( b1_mosaic_diff ):负值应该从黄色变为红色,正数从浅蓝色变为深蓝色 .

我有一个代码示例,不幸的是没有工作(而不是渐变红色我把 heat.colorstopo.colors 相同,用于渐变蓝色:

plot(b1_mosaic_diff, col=ifelse(na.omit(as.data.frame(b1_mosaic_diff))<0, heat.colors(n=5), topo.colors(n=5)), main="Difference between mean & median: '+' representing higher mean")

我不想使用ggplot,因为我更容易坚持正常情节 . 这样做有可能吗?提前致谢!

1 回答

  • 2

    这有点繁琐,但我通常会产生 n (例如1000)颜色与两个互补 colourRampPalette 中的每一个(例如一个由红色/黄色和一个蓝色组成) . 之后,如果颜色键的两侧都没有偶数长度,我将颜色向量的颜色向量对应于颜色键的较短部分,根据它的长度作为键的较长部分的比例(这更容易用下面的例子解释) . 最后,我连接两个颜色向量并将其传递给 rasterVis::levelplotcol.regions 参数 .

    这是一个例子:

    • 加载所需的库并创建虚拟栅格:
    library(raster)
    library(RColorBrewer)
    library(rasterVis)
    
    r <- raster(matrix(runif(100, -5, 10), 10))
    
    • 创建颜色矢量 . 在这里,我使用 RColorBrewer 调色板 'YlOrRd' (我将其反转为红色>橙色>黄色,因为颜色与最负值到最正值的栅格值相关联)和 'Blues' . 这些调色板每个仅提供9种颜色,因此我们将调色板传递给 colorRampPalette 以生成许多插入(插值)颜色 . 在这里,我为每个调色板生成1000种颜色 - 这足以创建一个平滑的颜色键 .

    我们希望颜色键跨越栅格数据集中的值范围,范围从-5到10.因此,我们需要对将用于颜色键的较短臂的颜色矢量进行子集化(负值) ,即红色) . 确切地说,我们想要删除红色向量的前500个值,因为密钥的 <0 部分是 >0 部分长度的一半 . 这给我们留下了500个橙黄色的矢量(我们丢下了最红的红色),以及1000个蓝色的矢量 .

    cols <- c(colorRampPalette(rev(brewer.pal(9, 'YlOrRd')))(1000)[501:1000], 
              colorRampPalette(brewer.pal(9, 'Blues'))(1000))
    
    • 使用 levelplot 绘制栅格,这比 raster 对象的常规绘图方法更灵活 . 为方便起见,我们首先创建一个下限和上限(z-limits)的向量 .
    zrng <- range(pretty(c(minValue(r), maxValue(r))))
    
    levelplot(r, margin=FALSE, at=seq(zrng[1], zrng[2], diff(zrng)/1000),
              col.regions=cols, scales=list(draw=FALSE))
    

    enter image description here

    • 奖金锻炼!

    要自动执行矢量子设置,可以使用以下函数:

    asym_colours <- function(r, pal1, pal2, n=2000) {
      zrng <- range(pretty(c(minValue(r), maxValue(r))))
      brks <- do.call(seq, as.list(c(max(abs(zrng)) * c(-1, 1), length.out=2*n)))
      c(pal1(n)[(sum(brks < zrng[1]) + 1):n], 
        pal2(n)[1:(sum(brks < zrng[2] & brks > 0) + 1)])  
    }
    

    例如:

    r <- raster(matrix(runif(100, -0.3, 0.1), 10))    
    cols <- asym_colours(r, colorRampPalette(rev(brewer.pal(9, 'YlOrRd'))),
                         colorRampPalette(brewer.pal(9, 'Blues')))
    zrng <- range(pretty(c(minValue(r), maxValue(r))))
    levelplot(r, margin=FALSE, at=seq(zrng[1], zrng[2], diff(zrng)/1000),
              col.regions=cols, scales=list(draw=FALSE))
    

    enter image description here

    或者,使用不同的斜坡:

    cols <- asym_colours(r, colorRampPalette(rev(brewer.pal(9, 'GnBu'))),
                         colorRampPalette(brewer.pal(9, 'PuRd')))
    zrng <- range(pretty(c(minValue(r), maxValue(r))))
    levelplot(r, margin=FALSE, at=seq(zrng[1], zrng[2], diff(zrng)/1000),
              col.regions=cols, scales=list(draw=FALSE))
    

    enter image description here

相关问题