特別聲明:本部分(系列)內(nèi)容均來(lái)自顧祖光博士對(duì)ComplexHeatmap的介紹,僅為學(xué)習(xí)交流谨究,尊重原創(chuàng)恩袱。
閑話少說(shuō),先說(shuō)顧老師:
顧祖光老師胶哲,現(xiàn)在德國(guó)癌癥中心從事與NGS相關(guān)的生物信息學(xué)研究畔塔,其本科和研究生均在南京大學(xué)生命科學(xué)學(xué)院就讀:
- 2001-09 to 2005-07 | Undergraduate (School of Life Science, Nanjing University)
- 2005-09 to 2008-07 | Master (School of Life Science, Nanjing University)
- 2008-09 to 2012-07 | PhD (School of Life Science, Nanjing University)
為什么要介紹顧祖光博士,因?yàn)楹苡锌赡苣闼枰墓ぞ撸ㄓ绕涫强梢暬┭煊欤芏嗄愣寄軓乃莾赫业酱鸢赋憾郑纯搭欁婀饫蠋熡卸喔弋a(chǎn):
這還僅僅是他開(kāi)發(fā)的R包,其它還有一系列perl工具寄摆。本部分(系列)主要是學(xué)習(xí)顧老師被引用量最高的一個(gè)R包:ComplexHeatmap谅辣。顧老師的這個(gè)包繪制熱圖的核心結(jié)構(gòu)如下:
安裝
- 通過(guò) bioconductor 安裝:
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("ComplexHeatmap")
- 通過(guò) github 安裝最新版
library(devtools)
install_github("jokergoo/ComplexHeatmap")
基礎(chǔ)——單個(gè)熱圖繪制
library(ComplexHeatmap)
library(dplyr)
library(tidyverse)
library(circlize)
#生成矩陣
mat = matrix(rnorm(100, mean = 0, sd = 1), nrow = 10)
rownames(mat) = paste('row', seq_len(10), sep = '_')
colnames(mat) = paste('col', seq_len(10), sep = '_')
#繪制基礎(chǔ)熱圖
Heatmap(mat)
-
指定熱圖顏色(包括連續(xù)型變量、離散型變量婶恼、NA值配色以及熱圖邊界配色四部分內(nèi)容)
熱圖中的數(shù)據(jù)一般都是連續(xù)型變量桑阶,ComplexHeatmap推薦大家使用circlize包中的colorRamp2進(jìn)行顏色映射設(shè)定,函數(shù)參數(shù)包括斷點(diǎn)和斷點(diǎn)對(duì)應(yīng)的顏色勾邦,這個(gè)包也是顧博士的蚣录。
col = colorRamp2(breaks = c(-4, 0, 4), colors = c('green', 'white', 'red'))
Heatmap(mat, name = 'mat', col = col)
需要注意的是,這里的顏色映射是不受異常值的影響的眷篇,也就是說(shuō)上面的例子中包归,如果有一個(gè)異常值大于4,那么它的顏色會(huì)被自動(dòng)標(biāo)注成為紅色铅歼。
這個(gè)顏色還有另外的妙用公壤,我們常常想比較不同熱圖中的值的大小,但是又擔(dān)心不同熱圖的顏色與數(shù)值大小的映射標(biāo)準(zhǔn)不一椎椰,ComplexHeatmap為我們提供了解決方案:只要幾個(gè)熱圖共用一個(gè)相同的配色方案厦幅,那么它們之間就是可比的。
當(dāng)然你也可以通過(guò)直接輸入含有一系列顏色的向量來(lái)對(duì)熱圖進(jìn)行顏色指定慨飘,不過(guò)需要注意:你所指定的顏色ComplexHeatmap是默認(rèn)將其映射到整個(gè)數(shù)據(jù)矩陣的數(shù)據(jù)范圍內(nèi)确憨,這意味著異常值會(huì)影響到整個(gè)熱圖的顏色配置。舉例來(lái)說(shuō)瓤的,這兩種配色是一樣的:
col = rainbow(3)
col = colorRamp2(breaks = seq(min(mat), max(mat), length = 3), colors = rainbow(3))
如果熱圖中的數(shù)據(jù)是離散型變量休弃,比如是不同的字符,我們應(yīng)該如何繪制呢圈膏?
#離散型變量
#生成矩陣
mat = matrix(sample(letters[1:4], 100, replace = T), ncol = 10)
#指定顏色(structure()函數(shù))
col = structure(rainbow(4), names = letters[1:4])
#繪制熱圖
Heatmap(mat, name = 'mat', col = col)
在這里用到了一個(gè)
structure()
函數(shù)塔猾,,不會(huì)也沒(méi)關(guān)系稽坤,這個(gè)函數(shù)只是構(gòu)建了一個(gè)顏色到元素之間的映射丈甸,同樣的目標(biāo)還可以用下面的代碼實(shí)現(xiàn)糯俗,而且更容易理解,大家以后可以用起來(lái):
col = rainbow(4)
names(col) <- letters[1:4]
那么我們?nèi)绾翁幚?strong>NA值的配色睦擂?(在熱圖的繪制當(dāng)中是允許存在NA值的)
#NA值配色
#生成矩陣
index = sample(c(TRUE, FALSE), 100, replace = T, prob = c(1, 9))
mat[index] = NA
#繪制熱圖
Heatmap(mat, name = 'mat', col = c('blue', 'white', 'red'))
圖中的NA值得湘,統(tǒng)一使用了灰色進(jìn)行標(biāo)識(shí),如果我們想自定義這個(gè)顏色顿仇,可以通過(guò)添加na_col參數(shù)來(lái)實(shí)現(xiàn):
Heatmap(mat, name = 'mat', col = c('blue', 'white', 'red'), na_col = 'black')
最后一個(gè)問(wèn)題淘正,我們?nèi)绾蝸?lái)自定義熱圖的邊界呢?
這個(gè)問(wèn)題分為兩個(gè)層次臼闻,一個(gè)是熱圖中每個(gè)小方塊跪帝,一個(gè)是整個(gè)熱圖邊界。首先介紹如何控制熱圖中每個(gè)小方塊的顏色些阅,主要是使用
rect_gp
:
mat = matrix(sample(letters[1:4], 100, replace = T), ncol = 10)
col = rainbow(4)
names(col) <- letters[1:4]
Heatmap(matrix = mat, col = col, rect_gp = gpar(col = 'white', lwd = 2))
可以看到,小方塊的邊界已經(jīng)變成白色了斑唬。
如何控制整個(gè)熱圖的邊界呢市埋?主要是使用
border/border_gp
:
Heatmap(matrix = mat, col = col, border_gp = gpar(col = 'black', lty = 2))
整個(gè)熱圖的邊界已經(jīng)有了黑色(
col = 'black'
)的虛線(lty = 2
)。
-
自定義標(biāo)題(這部分主要包括如何給熱圖的行和列添加標(biāo)題)
這部分內(nèi)容概括為以下代碼框架:
Heatmap(matrix, #繪圖矩陣 [matrix]
col, #矩陣配色 [vector]
name, #矩陣圖例標(biāo)題 [character]
column_title, #矩陣列標(biāo)題 [character]
column_title_gp, #指定矩陣列標(biāo)題相關(guān)屬性
column_title_side, #指定矩陣列標(biāo)題位置(頂部和底部)[character; 'top' or 'bottom']
column_title_rot #指定列標(biāo)題旋轉(zhuǎn)角度恕刘,僅支持水平和豎直兩種呈現(xiàn)形式 [numeric]
)
其余參數(shù)沒(méi)什么好講的缤谎,主要介紹一下 column_title_gp 參數(shù)。這個(gè)參數(shù)主要是通過(guò)gpar函數(shù)指定標(biāo)題的性質(zhì)褐着。
column_title_gp = gpar(fontsize = 20, #指定字體大小
fontface = "bold", #指定字體風(fēng)格
fill = "red", #指定標(biāo)題背景填充色
col = "white", #指定字體顏色
border = "blue" #指定標(biāo)題背景框邊框色
)
例如:
mat = matrix(rnorm(100, mean = 0, sd = 1), nrow = 10)
Heatmap(matrix = mat,
col = col,
name = 'mat',
column_title = 'The heatmap for mat',
column_title_side = 'top',
column_title_rot = 0,
column_title_gp = gpar(fontsize = 20,
fontface = 'bold',
fill = 'red',
col = 'white',
border = 'blue'))
-
聚類(lèi)
默認(rèn)情況下坷澡,繪制熱圖時(shí)會(huì)對(duì)行和列進(jìn)行聚類(lèi),我們可以通過(guò)cluster_rows
和cluster_cols
關(guān)閉聚類(lèi)功能:
mat = matrix(rnorm(100, mean = 0, sd = 1), nrow = 10)
rownames(mat) = paste('row', seq_len(10), sep = '_')
colnames(mat) = paste('col', seq_len(10), sep = '_')
Heatmap(matrix = mat, cluster_rows = F, name = 'mat')
有的時(shí)候我們覺(jué)得聚類(lèi)時(shí)左右兩邊的樹(shù)狀結(jié)構(gòu)影響圖的觀感含蓉,這時(shí)候我們可以通過(guò)
show_row_dend
和show_col_dend
來(lái)進(jìn)行隱藏:
Heatmap(matrix = mat, show_row_dend = F, name = 'mat')
當(dāng)然有的時(shí)候频敛,樹(shù)是很重要的,你可能不能進(jìn)行隱藏馅扣,但是你可以把樹(shù)的size變姓遄:
Heatmap(mat, name = "mat",
column_dend_height = unit(5, "mm"),
row_dend_width = unit(5, "mm"))
如你所想,聚類(lèi)的樹(shù)狀結(jié)構(gòu)你可以放在任何位置差油,這是通過(guò)row_dend_side
和col_dend_side
實(shí)現(xiàn)的:
Heatmap(matrix = mat, row_dend_side = 'right', name = 'mat')