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

时间:2015-01-21 10:25:33

标签: r plot gradient raster

我想用渐变色绘制我的光栅(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 个答案:

答案 0 :(得分:2)

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

以下是一个例子:

  1. 加载所需的库并创建虚拟栅格:

    library(raster)
    library(RColorBrewer)
    library(rasterVis)
    
    r <- raster(matrix(runif(100, -5, 10), 10))
    
  2. 创建颜色矢量。在这里,我使用RColorBrewer调色板'YlOrRd'(我将其反转为红色&gt;橙色&gt;黄色,因为颜色与最负面到最正面的顺序的栅格值相关联),以及'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))
    
  3. 使用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

  4. 奖金锻炼!

    要自动执行矢量子设置,您可以使用以下功能:

    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