2015-01-21 74 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