2017-01-21 1372 views
2

我对R很新,最近我一直在玩pheatmap库来生成热图。我的问题是,我想以特定的方式为我的热图着色。我将在下面说明:特定值的Pheatmap颜色

  1. 值< 1应该是一个颜色渐变(例如深蓝色淡蓝色)
  2. 恰好等于1的值应为深灰色
  3. 值> 1应该是一个颜色渐变(如暗红色浅红色)

我已经与breaks参数发挥各地和color参数与不同的调色板,但我似乎无法钉一个很好的解决方案。我来最接近的是这样的:

pheatmap(mtx, 
    color = c('#4444FF','#F4FF4F','#FF4444'), 
    breaks = c(0,1,2,3), 
    legend_breaks = c(0,1,2)) 

但这并不允许范围内的可视化,即0.1应该是一个不同的色调超过0.9,即使他们都应该是蓝色的。任何人都可以提供建议或建议?我确实看过This ticket并考虑将1改为NA,但对我来说有点太复杂。更何况,我不得不关闭pheatmap的聚类,这不是我想要做的。谢谢!

+0

请仔细阅读[我为什么要接受一个答案?](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – Masoud

+0

万一有人遇到稍微有点不同的需求的这个问题,请参考下面的问题:[对于低于和高于阈值的值,使用自定义颜色比例尺的Heatmap](https://stackoverflow.com/questions/44398360/heatmap-with-customized-color-scale -bar换值-以下及以上的阈值)。 – Masoud

回答

0

不能设置颜色为特定的颜色,但你可以去一个很小的范围内像[0.999,1.001]

应该将休息,以你的问题中提到的特定范围和相应的指定颜色;

library(pheatmap) 
bk1 <- c(seq(-2,0.9,by=0.1),0.999) 
bk1 <- c(1.001,seq(1.1,3,by=0.1)) 
bk <- c(bk1,bk2) #combine the break limits for purpose of graphing 

my_palette <- c(colorRampPalette(colors = c("darkblue", "lightblue"))(n = length(bk1)-1), 
       "gray38", "gray38", 
       c(colorRampPalette(colors = c("darkred", "tomato1"))(n = length(bk2)-1))) 

pheatmap(df, color = my_palette, breaks = bk, scale = "none", 
      cluster_rows = F, cluster_cols = F, margin = c(5,5)) 

对于表示使用rnorm.within函数的示例的目的,我提出了以下数据集:

#V1 is random between -2 and 3 
    #V2 is equal to 1 
    #V3 is random between 0 and 3 

    df <- cbind(rnorm.within(1000, -2, 3),rep(1,1000), rnorm.within(1000,0,3)) 

而这将是上面创建的数据的热图;