2017-01-21 104 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)) 

而這將是上面創建的數據的熱圖;