2014-01-07 52 views
6

我正在使用image命令繪製矩陣,該矩陣包含一些NA值。我使用image如何在圖像圖中爲NA分配特定顏色

image(figData, zlim = zRange, col = colors, useRaster=TRUE) 

zRangefigData的實際範圍小。我使用下面的一組,這與紅綠色彩感知不足兼容的頂部顏色表:

http://www.mathworks.com/matlabcentral/fx_files/31761/6/thumbnail_184481.jpg

我想在figData來選擇NA值的特定顏色是外面colors(例如,gray)。 NA值現在映射到最後一個元素colorswhite),因此我無法將它們與超出範圍的值區分開來。

理想情況下,我想要一個解決方案,無論我使用哪種調色板。

我想要類似於選項heatmap.2,我該怎麼辦?我願意修改image源代碼來完成此操作,但image似乎稱爲rasterImage函數,其源代碼無法找到。


接受Jealie的回答後,我在這裏包括代碼考慮到不同的下面和上面的範圍值:

image.nan <- function(z, zlim, col, na.color='gray', outside.below.color='black', outside.above.color='white',...) 
{ 
    zstep <- (zlim[2] - zlim[1])/length(col); # step in the color palette 
    newz.below.outside <- zlim[1] - zstep # new z for values below zlim 
    newz.above.outside <- zlim[2] + zstep # new z for values above zlim 
    newz.na <- zlim[2] + 2 * zstep # new z for NA 

    z[which(z<zlim[1])] <- newz.below.outside # we affect newz.below.outside 
    z[which(z>zlim[2])] <- newz.above.outside # we affect newz.above.outside 
    z[which(is.na(z>zlim[2]))] <- newz.na # same for newz.na 

    zlim[1] <- zlim[1] - zstep # extend lower limit to include below value 
    zlim[2] <- zlim[2] + 2 * zstep # extend top limit to include the two new values above and na 

    col <- c(outside.below.color, col, outside.above.color, na.color) # we construct the new color range by including: na.color and na.outside 

    image(z=z, zlim=zlim, col=col, ...) # we finally call image(...) 
} 

回答

2

小的修正:值之外沒有被映射到col最後一個元素,但他們卻沒有被繪製(並且沒有顏色看起來是白色的)。

否則,要回答您的問題,最簡單的方法是在image附近編寫一個包裝,其中包含兩個新參數:na.coloroutside.color。這是我的建議,該建議默認爲gray爲NA值和white爲值以外zlim

my.image <- function(figData, zlim, col, na.color='gray', outside.color='white', ...) 
{ 
    newz.na <- zlim[2]+(zlim[2]-zlim[1])/length(col) # new z for NA 
    newz.outside <- zlim[2]+2*(zlim[2]-zlim[1])/length(col) # new z for values outside zlim 

    figData$z[which(is.na(figData$z>zlim[2]))] <- newz.na # we affect newz.outside 
    figData$z[which(figData$z<zlim[1] | figData$z>zlim[2])] <- newz.outside # same for newz.na 


    zlim[2] <- zlim[2]+2*(zlim[2]-zlim[1])/length(col) # we finally extend the z limits to include the two new values 

    col <- c(col, na.color, outside.color) # we construct the new color range by including: na.color and outside.color 

    image(figData, zlim=zlim, col=col, ...) # we finally call image(...) 
} 
+0

非常感謝澄清,解決方案和代碼示例。現在我明白爲什麼一些我預計會變成黑色的地方,實際上白色的地方被我認爲是從白色到透明的過渡所包圍。爲了避免這種情況,我創建了一個新版本的代碼,包括限制之下和之上的區別。我在編輯的問題結尾處加入了它。 – nesuribe

2

由於彩色間隔等(*bottom*, *top*]定義,沿z是相等的值,以zlim [1]將與被着色outside.below.color(因爲outside.below.color的範圍是(*zlim[1] - zstep* , *zlim[1]* ])。

以下版本修正了這個錯誤:

image.nan.better <- function(z, zlim, col, na.color='gray', outside.below.color='black', outside.above.color='white',...) 
{ 
     zstep <- (zlim[2] - zlim[1])/length(col); # step in the color palette 
     newz.below.outside <- zlim[1] - 2 * zstep # new z for values below zlim 
     newz.above.outside <- zlim[2] + zstep # new z for values above zlim 
     newz.na <- zlim[2] + 2 * zstep # new z for NA 

     z[which(z<zlim[1])] <- newz.below.outside # we affect newz.below.outside 
     z[which(z>zlim[2])] <- newz.above.outside # we affect newz.above.outside 
     z[which(is.na(z>zlim[2]))] <- newz.na # same for newz.na 

     zlim[1] <- zlim[1] - 2 * zstep # extend lower limit to include below value 
     zlim[2] <- zlim[2] + 2 * zstep # extend top limit to include the two new values above and na 

     col <- c(outside.below.color, col[1], col, outside.above.color, na.color) #correct by including col[1] at bottom of range 

     image(z=z, zlim=zlim, col=col, ...) # we finally call image(...) 
} 

比較:

f = matrix(abs(rnorm(300)),nrow=50) 
f[which(f>1)]=1 

f[44,4] = 0 
f[41,4] = NA 
f[42,4] = NA 
f[43,4] = NA 
f[44,3] = -1 
f[44,5] = 2 

image(as.matrix(f),col=c('green3','green2','blue1','blue3'),zlim=c(0,1)) 

image.nan(as.matrix(f),col=c('green3','green2','blue1','blue3'),zlim=c(0,1),outside.below.color='red',outside.above.color='brown',na.color='yellow') 

image.nan.better(as.matrix(f),col=c('green3','green2','blue1','blue3'),zlim=c(0,1),outside.below.color='red',outside.above.color='brown',na.color='yellow') 
+0

謝謝! – aaiezza

+0

對函數原型進行小調整以使其更易於使用:image.nan.better < - 函數(mat,zlim = range(mat,na.rm = T),col = heat.colors(100),na.color = 'gray',outside.below.color ='black',outside.above.color ='white',...){ – Chris

相關問題