2017-08-04 8 views
0

私は[-2,2]の範囲の値の1941 x 119マトリックスを持ち、ゼロ付近で高度にクラスター化されています。ヒートマップのための非線形色勾配R

histogram clustered around 0

私はすでにhclustで発見されたクラスタを明らかにヒートマップを作成します。色の濃いランプを使用して、値が緑色から赤色に変わり、中央が暗く(またはより明るく)なるようにします。問題は、データがゼロ付近でクラスタリングされているため、redgreen(n)やRColorBrewerのような直線的な色のランプが微妙な分散を捕らえず、プロットを洗い流すことができないということです。

私はそうのような私のデータにブレークポイントを指定するには、{gplots}で「colorpanel」を使用して、カラーランプとシグモイド関数を構築しようとした:

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

あなたの一般的な解決策は正しいですが、あなたのブレークを生成する方法では良い結果が得られません。あなたのデータの分位数に基づいた配色はどうですか?

あなたはさらに分位数を台無し例えば、わずか10%、20%などよりも多くのブレークを指定するか、あなたのデータの他の変換をしようとする可能性
# 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) 

平方根、ログなど