R可視化之ComplexHeatmap【一】:顏色塔嬉、標(biāo)題玩徊、聚類(lèi)

特別聲明:本部分(系列)內(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):

R

這還僅僅是他開(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_rowscluster_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_dendshow_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_sidecol_dend_side實(shí)現(xiàn)的:

Heatmap(matrix = mat, row_dend_side = 'right', name = 'mat')

本期到此為止拗军,下期內(nèi)容:行(列)順序、行(列)名蓄喇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末发侵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子妆偏,更是在濱河造成了極大的恐慌刃鳄,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钱骂,死亡現(xiàn)場(chǎng)離奇詭異铲汪,居然都是意外死亡熊尉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)掌腰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狰住,“玉大人,你說(shuō)我怎么就攤上這事齿梁〈咧玻” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵勺择,是天一觀的道長(zhǎng)创南。 經(jīng)常有香客問(wèn)我,道長(zhǎng)省核,這世上最難降的妖魔是什么稿辙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮气忠,結(jié)果婚禮上邻储,老公的妹妹穿的比我還像新娘。我一直安慰自己旧噪,他們只是感情好吨娜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著淘钟,像睡著了一般宦赠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上米母,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天勾扭,我揣著相機(jī)與錄音,去河邊找鬼铁瞒。 笑死尺借,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的精拟。 我是一名探鬼主播燎斩,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜂绎!你這毒婦竟也來(lái)了栅表?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤师枣,失蹤者是張志新(化名)和其女友劉穎怪瓶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體践美,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洗贰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年找岖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敛滋。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡许布,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绎晃,到底是詐尸還是另有隱情蜜唾,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布庶艾,位于F島的核電站袁余,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咱揍。R本人自食惡果不足惜颖榜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煤裙。 院中可真熱鬧掩完,春花似錦、人聲如沸积暖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)夺刑。三九已至,卻和暖如春分别,著一層夾襖步出監(jiān)牢的瞬間遍愿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工耘斩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沼填,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓括授,卻偏偏與公主長(zhǎng)得像坞笙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荚虚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容