用R包中heatmap畫熱圖


一:導入R包及需要畫熱圖的數據

library(pheatmap)

data<- read.table("F:/R練習/R測試數據/heatmapdata.txt",head = T,row.names=1,sep="\t")

二:畫圖

1)pheatmap(data)#默認參數

 2)pheatmap(data,clustering_distance_rows = "correlation")#聚類線長度優化

3)pheatmap(data,scale="column")#按列均一化,"row","column" or "none"默認是"none"

4)pheatmap(data,scale="row")#按行均一化,"row","column" or "none"默認是"none"

 5)pheatmap(data,display_numbers=T,number_format="%.2f",number_color="red",fontsize_number=8)#是否在每一格上顯示數據,及其數據格式,大小及其顏色

6)pheatmap(data,cellwidth = 50,cellheight= 14)#格子大小

7) pheatmap(data,main="sbheatmap")#標題

8)pheatmap(data,color = colorRampPalette(c("MediumBlue","white","red"))(256))#顏色

9)pheatmap(data,clustering_distance_rows = "correlation",scale="column",display_numbers=T,number_format="%.1f",number_color="black",
fontsize_number=8,cellwidth = 14,cellheight= 14,color = colorRampPalette(c("MediumBlue","white","red"))(256))

 

一、熱圖工具的參數與原理
(1)關於均一化的方法原理:
     熱圖的核心思想是:使用漸變的顏色來代表數值的變化,以便其更加直觀。使用RNA-seq的表達量數據繪制熱圖,最大的問題是不同基因的表達量差異過於巨大。例如:基因A的平均表達量是10,000(所有樣本的表達量都在5,000~15,000),而基因B的平均表達量是100(所有樣本的表達量都在50~500間波動)。那么問題來了,因為它們數值差異過大,根本不在一個數量級上,那么就很難在一張熱圖中使用合理的顏色標尺來反映兩個基因在不同樣本的表達量變化。
所以在熱圖中,我們通常會對基因的表達量做一個歸一化的處理。具體的做法,就是將每個基因的表達量減去這個基因在所有樣本中表達量的均值,然后除以其標准差。這個處理也叫標准正態化,或Z-score處理(感興趣的同學可以自己百度一下)。
這個處理非常巧妙,每一個基因在所有樣本中的表達量被等比例縮放。這樣處理后,每一個基因在所有樣本的表達量,都變成了均值為0,標准差為1的一組值。因為所有樣本的表達量都在1個數量級的水平了,所以使用一套顏色配色體系,就可以很好地展示所有基因在不同樣本的變化規律。
(2)均一化的參數選擇
熱圖的均一化目的是將貧富差距過大的基因,拉到同一個數量級。而通常在畫熱圖的時候,1個基因在不同樣本的表達量會在行的方向上分布。所以,我們的均一化處理將按行處理。所以這種情況下,我們的均一化參數選擇:row。當然,如果你的表達量表中,同一個基因的表達量在列的方向上分布,自然這個參數就要選擇 column了。
注意要點(非常重要):
    1)當數據中,某一行完全相同的時候,標准差=0,那么理論上是無法使用以上的Z-score公式進行均一化(公式中標准差是分母,不能為0)。所以,如果你的數據中包含某個基因(行方向)數值在所有樣本完全相同的情況,OS-tools會自動將這一行刪除。
    2)如果你的數據只有兩列,那么使用按行歸一化的話,圖形將很丑陋,如下圖:

      原因是當每行只有兩個數值的時候,任何兩個不同的數值標准正態均一化后,都會變成-1和1。所以,會產生上述的圖形(只有兩種顏色)。面對這種類型的數據,建議直接計算每行兩個數值的倍數的log2值,然后使用OS-tools畫單列的熱圖。  
     當然, 單列熱圖也可以使用R語言的pheatmap包繪制,並通過一個函數控制0點的位置,在另一個R語言繪圖的主題帖中也有介紹。
(3)聚類的原理

    我們用R語言pheatmap包,默認情況下將利用表達量信息計算兩兩樣本間的歐氏距離,然后利用歐式距離實現樣本的聚類。 如同上圖的聚類效果,簡單說來,在基因完成歸一化處理后,如果我們對行聚類(在上圖中也就是對基因聚類),那么基因的順序就會被重排。表達規律比較相似的基因將會被排在一起。表達模式差異越大的基因,則會遠離。類似的,如果對列聚類(在上圖中也就是對樣本聚類),那么樣本的順序將會被重排,表達模式比較相似的樣本自動會被歸為一類。
       如上圖,共有11個樣本的約40個基因被用於繪制熱圖。從聚類的效果來看,11個樣本可以歸為兩類,其實就是對應病人和正常人。40個基因也被歸為兩類,分別是病人組上調或下調表達的基因。
(4)聚類參數什么情況下使用
聚類的本質就是重排序,所以我們應該按照實際情況選擇是否聚類。
     a)需要聚類的情況:
     需要對樣本或基因按照表達模式分類,那么請選擇聚類。例如,上圖中需要對正常人和病人利用基因表達量進行分類,那么的確應該選擇聚類。
     另外,聚類的結果就是相似的東西被排布在一起,所以聚類后的圖形也更加有序和美觀。
     b)不需要聚類的情況:
     在某些情況下,我們只是需要使用熱圖來直觀呈現基因在樣本中的變化規律,而樣本的順序是我們提前定義好的,那么則要考慮將聚類功能關閉。
       例如,在以下的熱圖中,選擇了對行(基因)聚類,不對列(樣本)聚類。那是因為作者希望通過聚類,將表達模式相似基因歸為一類在圖中展示,所以基因聚類選擇yes。而樣本(列)是作者提前排好序的,是小鼠三個組織在6個發育階段的樣本。因為樣本是提前排好序的,當然作者不希望這個順序被打亂,所以列選擇不聚類。
       備注:圖中的分類標簽,必須使用R包 pheatmap繪制熱圖才能添加。
圖4 基因聚類但樣本不聚類的例子。
       還有兩個方向都不聚類的例子。例如在下圖中,X軸是1個實驗處理后0h、5h、10h的樣本,是作者提前排好序的。本意是想呈現相關基因在梯度時間水平的變化規律。當然,作者不想這個順序被重新排布了,所以列方向的聚類選擇:no。在y軸方向,這些基因也是作者提前按照其所屬的基因家族排過序的,當然也不想其順序被打亂,所以行聚類也是選擇no。
圖5 兩個方向都不聚類的例子
(5)其他參數

 

     工具中的其他參數還包括:
      顏色選擇:選擇繪制熱圖的色系。考慮到綠紅的色系,對紅綠色盲來說區分有些困難,某些雜志不接受綠紅色系。建議用戶使用藍紅燈其他漸變色系;
      字體大小:當熱圖樣本、基因數太多的時候,可以通過減少字體大小來保證正常顯示;
      格子高、寬:主要為了美觀而調整;
      格子上是否顯示數字:是否將表達量的數值寫在格子中,就看用戶自己選擇了。
      畫出格子邊界:如果相鄰的格子顏色相似,可以通過畫出邊界來提高區分度。在格子數較少的時候,建議畫出格子邊界會更加美觀。
 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM