1. 程式人生 > >用R包中heatmap畫熱圖

用R包中heatmap畫熱圖

格式 class IV 語言 log 聚類 主題 實現 過大

一:導入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間波動)。那麽問題來了,因為它們數值差異過大,根本不在一個數量級上,那麽就很難在一張熱圖中使用合理的顏色標尺來反映兩個基因在不同樣本的表達量變化。 例如在下圖中,橫坐標代表樣本,縱坐標代表基因。由於第一個基因的表達量非常高(相對其他基因),如果表達量不做任何處理,圖中只顯示這個基因表達量極高(紅色),其他基因的表達量較低(黃色)。但到底第一個基因在不同樣本間的表達量是如何變化了,就無法顯示了。
圖1 不合理的熱圖 所以在熱圖中,我們通常會對基因的表達量做一個歸一化的處理。具體的做法,就是將每個基因的表達量減去這個基因在所有樣本中表達量的均值,然後除以其標準差。這個處理也叫標準正態化,或Z-score處理(感興趣的同學可以自己百度一下)。 這個處理非常巧妙,每一個基因在所有樣本中的表達量被等比例縮放。這樣處理後,每一個基因在所有樣本的表達量,都變成了均值為0,標準差為1的一組值。以上的樣本,被如此處理後,效果如下圖。因為所有樣本的表達量都在1個數量級的水平了,所以使用一套顏色配色體系,就可以很好地展示所有基因在不同樣本的變化規律。你可以註意一下圖右側的圖例標尺:數值的變動在-2~2之間。所以也有用戶問過,怎麽看起來不像表達量啊?的確不是表達量,是Z-core處理後的表達量,在0附近分布。 圖2 合理歸一化處理後的熱圖 (2)均一化的參數選擇 如同剛剛我們所說的,熱圖的均一化目的是將貧富差距過大的基因,拉到同一個數量級。而通常在畫熱圖的時候,1個基因在不同樣本的表達量會在行的方向上分布。所以,我們的均一化處理將按行處理。所以這種情況下,我們的均一化參數選擇:row。 當然,如果你的表達量表中,同一個基因的表達量在列的方向上分布,自然這個參數就要選擇 column了。 註意要點(非常重要): 1)當數據中,某一行完全相同的時候,標準差=0,那麽理論上是無法使用以上的Z-score公式進行均一化(公式中標準差是分母,不能為0)。所以,如果你的數據中包含某個基因(行方向)數值在所有樣本完全相同的情況,OS-tools會自動將這一行刪除。 2)如果你的數據只有兩列,那麽使用按行歸一化的話,圖形將很醜陋,如下圖:

圖3 略醜陋的雙列熱圖
原因是當每行只有兩個數值的時候,任何兩個不同的數值標準正態均一化後,都會變成-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)其他參數

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

用R包中heatmap畫熱圖