Heatmap(熱圖)大家肯定不陌生,在很多醫學、自然科學發表的重量級論文中常見其蹤影。使用heatmap可以非常容易展示多組分之間關係或相關性,也是基因表達、前後差異對比大數據關係展示較好的工具,其實啊,實際中只要是矩陣數據也許都合適拿heatmap來展示其內在關係。其實,heatmap還有蘊含著不少分析的秘訣。那麼,高大上的heatmap是怎麼實現的呢?
目前,熱圖的繪製可以通過在線軟體、 PCORD、 python、R語言等方式實現,個人推薦還是R語言實現的比較便捷,而且能實現一些高級的分析功能。在浩如煙海的R平臺中,有heatmap3包、gplot包、heatmaply包、pheatmap等包,(還不包括可以間接實現熱圖的ggplot2、lattice等包)可以實heatmap的繪製。今天與大家分享的是以美觀、便捷與變化多樣著稱的pheatmap包。熱圖的繪製不僅是圖形,還涉及數據整理與分析、高級分析與運用、色彩等方面。請跟著我們的腳步,經過八步很快你也可以成為駕馭heatmap的能手,做出屬於你自己的熱圖。
事不宜遲,首先我們應該有一套數據。我們以機器學習常用的Breast Cancer Wisconsin (Diagnostic) Data Set數據為例說明pheatmap的使用,此數據集是利用各類細胞活體取樣診斷患者是否患有乳腺癌的數據集,具體的說明詳見網頁。
網址:
http://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29
pheatmap包的命令僅有一個pheatmap,但是包含幾十個參數,基本可以把heatmap修個遍。
首先,heatmap不太適合數據量很大的矩陣,比如超過幾百項,基本就看不清楚行或列的標識。因此,畫heatmap最重要一步反而是數據提煉預處理,我們會根據實驗的目的,把最想顯示的數據進行預處理。
pheatmap(w1[,-10])
pheatmap(scale(w1[,-10]))
#pheatmap可以接受方陣與矩陣的數量數據,不支持分類等數據(故此去掉第十列),因此比較靈活。注意第一張與第二張的差別,第二張進行了數據的標準化,縮小了數據的跨度,也可以使用內置的scale的命令進行行列標準化。
pheatmap默認的顏色是RColorBerry的"RdYlBu"配色包(配色,是R平臺很有講究的一個大坑),通過color命令,可以自己的調配更換自己的顏色,圖例的變化也會根據顏色的取值進行變化。顏色調節讓我們的熱圖看起來不一樣(下文分別使用了連續色與不連續顏色展示)。
pheatmap(scale(w1[,-10]),color=heat.colors(100))
pheatmap(w1[,-10], color = colorRampPalette(c("green3", "white", "bisque"))(50))
pheatmap(scale(w1[,-10]),color=brewer.pal(7,"PuBuGn"))
圖例也是很容易更改的,剛才在顏色調整的時候color = colorRampPalette(c("green3", "white", "bisque")),三種顏色可以對應低、中、高三段不同的數量。但更進一步圖例的設定可以通過break、legend命令實現圖例的變化。
pheatmap(scale(w1[,-10]),legend = FALSE)
pheatmap(w1[,-10], cluster_row = FALSE, legend_breaks = -1:4, legend_labels = c("0","1e-4", "1e-3", "1e-2", "1e-1", "1"))
pheatmap(scale(w1[,-10]),legend_breaks = c(0.5,1.5,2.5))
pheatmap可以控制是否顯示行、列名稱、聚類結果以及單元格大小。pheatmap(w1[,-10],cluster_rows = F,cluster_cols = F)
#關閉行、列聚類結果
pheatmap(w1[,-10],show_rownames = F,cluster_rows = F)
#不顯示行標籤與聚類結果
pheatmap(w1[,-10],show_colnames = F,cluster_cols = F,cellwidth =10,cellheight =10)
#單元格大小可控,可調節圖形的比例
數字或者符號顯示也是論文常用的標註方法,尤其第二種方式,請大家細細體會。
pheatmap(w1[,-10], display_numbers = TRUE, number_format = "%.1e")
pheatmap(w1[,-10], display_numbers =ifelse(w1[,-10] >1, "A", ""))
在上面heatmap的分析中已經初步展示了行、列的聚類關係。聚類是Heatmap展示數據內部關係的一個重要方法,可以揭示數據之間潛在的關係。聚類在機器學習領域屬於無監督學習的一類,其計算過程可分為數據處理、關係矩陣化與聚類方式三個部分。關係矩陣化是指把要聚類的數據轉化為一個關係矩陣,最簡單是採用歐氏距離法;在此基礎上通過singlelinkage(單連動)、complete linkage(全聯動)、average linkage(平均聯動),ward等層次聚類或者K均值(K-mean)、圍繞中心劃分等(PAM)聚類方法進一步計算聚類樹狀圖與分組。看起來很複雜,但在pheatmap裡會自動完成大部分工作。
pheatmap可以通過clustering_distance_rows/cols控制聚類的方法。clustering_distance_rows/cols可以繼承dist或其他公式計算關係矩陣,而clustering_method則用於控制聚類方式,兩個命令配合可以實現各種不同聚類圖的目的。
pheatmap(w1[,-10], colorRampPalette(brewer.pal(10, "RdYlBu"))(256),kmeans_k = 2)
# K-mean聚類,分多少個類與實驗目的有關,此項研究分兩類,但這個方法個人認為實現得不夠好
pheatmap(w1[,-10], scale = "row", clustering_distance_rows = "correlation")
#可以實現按行數據間皮爾遜相關性進行聚類
#當我們不滿足默認的聚類方法時,可以用cluster_hclust或callback函數重排聚類
pheatmap還提供行、列的分組標註功能,可供分類探索與進一步按分組標註樣品。先建立樣品標籤class1,class2
注意標註必須與原數據的行名與列名一致,本研究僅有class標註有意義,其他的class1、class2是模擬分組標籤。
pheatmap(w1[,-10], annotation_row = ann_row,annotation_col = ann_col)
經過注釋後可以形成多個分類的標註,此外利用ann_colors還可以自己分配分組的顏色,靈活性更大。
關於heatmap的實現,這裡面只用到了最重要的部分代碼,其實還有不少技巧可以深挖,有興趣可以查看pheatmap函數的幫助文件,最重要的是自己去嘗試,很快屬於你自己特色的heatmap就隨手可得。
到此,全文結束,有興趣的同學還可以就聚類、自定義顏色與深度分析進行進一步的交流與探索。
附相關視頻解析:
相關代碼下載:
下載網址:
https://pan.baidu.com/s/1QWMJpkqvISnGwtFUNUXsdw
向醫學方公眾號首頁發送「heatmap」即可得到下載密碼
「醫學方」現正式向粉絲們公開徵稿!內容須原創首發,與科研相關,一經採用,會奉上豐厚稿酬(300-2000元),詳情請戳。
「醫學方」始終致力於服務「醫學人」,將最前沿、最有價值的臨床、科研原創文章推送給各位臨床醫師、科研人員。
醫學方已推出「實驗室那些事兒」「SCI寫作技巧」「文獻精讀與解析」「醫學英語輕鬆學」「國自然基金申請」「臨床數據挖掘」、「基因數據挖掘」、「R語言教程」、「醫學統計學」、「微創動物實驗培訓」等多個專題課程,如需了解課程詳細推文,可關注「醫學方」公眾號,點擊「精品專題」進入
騰訊課堂:https://medfun.ke.qq.com
網易雲課堂:http://study.163.com/u/ykt1467466791112
客服電話:15821255568
客服微信:yixuefang1234
溫馨提示:醫學方還設有專門的討論群哦~各位明星導師都在群中,可以解答各位的遇到的問題,如有興趣,可以加客服微信後加入群聊...