2015-01-21 115 views
0

我想用渐变颜色绘制我的栅格图层(b1_mosaic_diff):负值应该从黄色变为红色,正数从浅蓝色变为深蓝色。绘制不带ggplot2的堆栈渐变颜色

我有没有工作了不幸的是,代码示例(而不是渐变的红色,我把heat.colors一样topo.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,因为它更容易我坚持正常的情节,是否有成为了可能做到这一点? 提前感谢!

+5

重复的例子,请:http://stackoverflow.com/a/5963610/1412059 – Roland 2015-01-21 10:27:27

回答

2

这是一个有点繁琐,但我通常产生每两个互补colourRampPalette小号n(如1000)颜色(例如由红色/黄色和蓝色之一制成S)。之后,如果颜色键的长度不为零,那么我将与颜色键的较短部分相对应的颜色矢量按照其长度作为键的较长端的比例进行子集(这更容易用下面的例子解释)。最后,我连接两个颜色矢量并将其传递给rasterVis::levelplotcol.regions参数。

下面是一个例子:

  1. 负载所需的库,并创建一个虚拟栅格:

    library(raster) 
    library(RColorBrewer) 
    library(rasterVis) 
    
    r <- raster(matrix(runif(100, -5, 10), 10)) 
    
  2. 创建的颜色矢量。在这里,我使用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)) 
    
  3. 剧情光栅与levelplot,这是一种位比raster对象经常plot方法更加灵活。为方便起见,我们首先创建一个下限和上限(z限制)的向量。

    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

+0

非常感谢你的努力!这有很大的帮助,很容易解释! – user2978751 2015-01-22 14:26:01