2017-08-04 93 views
0

我有一個1941 x 119矩陣的值[-2,2],高度聚集在零附近。用於熱圖的非線性顏色梯度R

histogram clustered around 0

我想創建顯示我已經與hclust發現簇熱圖。我想要使​​用漸變顏色漸變,以便數值範圍從綠色變爲紅色,同時在中心變暗(或變淺)。問題在於數據聚集在零附近,像redgreen(n)這樣的線性顏色斜坡和RColorBrewer無法捕捉到細微的變化併產生褪色的圖。

我試圖建立一個色階使用「顏色面板」中的{gplots}和S形函數在我的數據來指定破發點,像這樣:

library(gplots) 

lower <- -1 
upper <- 1 
growth_rate <- 0.05 
# Returns break pts b/w [-1,1] 
sig <- function(x) { 
    return(lower + ((upper-lower)/(1+exp(-growth_rate*x)))) 
} 

breaks <- sig(seq(-30, 30, by=1.0)) 
breaks <- append(-2, append(breaks, 2)) # Append min and max break pts 
ramp <- colorpanel(n=length(breaks)-1, low="green", mid="black", high="red") 

然後,我跑到我的熱圖:

# 'data' is a 1941 x 119 matrix 
heatmap.2(data, main="Heatmap Sigmoid",col=ramp, trace='none', breaks=breaks) 

muddy heatmap

任何人都知道的方式來建立一個色階,可以顯示所有得到扔進「黑」箱中(色調),這些值?

+0

編輯:固定圖像上傳 – PanFrancisco

回答

0

您的一般解決方案是正確的,但是您生成中斷的方法不會產生良好結果。基於數據分位數的顏色方案如何?

# Some fake data: 
data = matrix(sample(
    c(
    rgamma(1941*119, shape = 0.3, rate = 5), 
    -rgamma(1941*119, shape = 0.3, rate = 5) 
), 
    5000), nrow = 250) 
# similar to your histogram 
hist(data) 

# make breaks using data quantiles 
breaks = quantile(data, probs = seq(0,1,0.1) 
ramp <- colorpanel(n=length(breaks)-1, low="green", mid="black", high="red") 
heatmap.2(data, main="Heatmap Sigmoid",col=ramp, trace='none', breaks=breaks) 

你能惹位數進一步指定不僅僅是10%,20%等多個休息或嘗試其它數據轉換,例如平方根,日誌等