2017-08-04 138 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%等多个休息或尝试其它数据转换,例如平方根,日志等