使用ComplexHeatmap繪制3D熱圖
ComplexHeatmap包有一個(gè)densityHeatmap()函數(shù)用來(lái)對(duì)一組分布進(jìn)行可視化。例如下面的例子:
library(ComplexHeatmap)
set.seed(123)
mat = matrix(rnorm(500), ncol = 10)
colnames(mat) = letters[1:10]
densityHeatmap(mat)

在R圖形系統(tǒng)中,我們也可以使用histogram來(lái)可視化分布,因此從ComplexHeatmap版本2.7.9開(kāi)始,我新加了一個(gè)函數(shù)frequencyHeatmap(),就像是一個(gè)histogram版本的density heatmap。其用法和densityHeatmap()非常類(lèi)似:
frequencyHeatmap(mat)

在這里,區(qū)間中的頻度使用熱圖進(jìn)行可視化。
那么現(xiàn)在,頻度熱圖被稱(chēng)作是密度熱圖的histogram版本,但這看起來(lái)一點(diǎn)都不像histogram。那么可能一個(gè)3D的熱圖在這里更加適合。這可以通過(guò)在frequencyHeatmap()中設(shè)置參數(shù)use_3d = TRUE來(lái)將2D熱圖轉(zhuǎn)換為3D熱圖:
frequencyHeatmap(mat, use_3d = TRUE)

這看起來(lái)好多了!下面一節(jié)我將會(huì)介紹如何在ComplexHeatmap包中集成3D熱圖功能的。
3D熱圖的實(shí)現(xiàn)
首先,我們要能畫(huà)3D的柱子,這可以通過(guò)新函數(shù)bar3D()實(shí)現(xiàn)。用法如下:
bar3D(x = 0.5, y = 0.5, w = 0.2,
h = 0.2, l = unit(1, "cm"), theta = 60)

其中各個(gè)參數(shù)的意義不言而喻,見(jiàn)下圖:

在bar3D()中,fill參數(shù)控制柱子的顏色。為了增強(qiáng)3D效果,柱子的三個(gè)面的顏色有略微輕微不同的明亮度。
bar3D(x = seq(0.2, 0.8, length = 4), y = 0.5,
w = unit(5, "mm"), h = unit(5, "mm"),
l = unit(1, "cm"), fill = c("red", "green", "blue", "purple"))

參數(shù)theta控制投影的角度,見(jiàn)下例:
bar3D(x = seq(0.2, 0.8, length = 4), y = 0.5,
w = unit(5, "mm"), h = unit(5, "mm"),
l = unit(1, "cm"), theta = c(20, 40, 60, 80))

好了,現(xiàn)在既然我們已經(jīng)能夠畫(huà)3D的柱子了,為了實(shí)現(xiàn)3D的熱圖,我們可以通過(guò)cell_fun或者layer_fun提供的自定義函數(shù)來(lái)將每一個(gè)3D柱子放置在熱圖的格子上,其中柱子的高度和熱圖中相應(yīng)的值對(duì)應(yīng)。這里我寫(xiě)了一個(gè)新函數(shù)Heatmap3D()可以直接拿來(lái)使用。其用法和Heatmap()幾乎完全相同。見(jiàn)下面的例子:
set.seed(7)
mat = matrix(runif(100), 10)
rownames(mat) = LETTERS[1:10]
colnames(mat) = letters[1:10]
Heatmap3D(mat, name = "mat", column_title = "This is a 3D heatmap")

當(dāng)位于熱圖邊緣的柱子太高時(shí),可能會(huì)和熱圖中其他元件重疊,那么這時(shí)候需要進(jìn)行手動(dòng)的微調(diào)。在上面的例子中,標(biāo)題和legend和3D柱子有重疊,這可以通過(guò)手動(dòng)設(shè)置ht_opt$HEATMAP_LEGEND_PADDING和ht_opt$TITLE_PADDING來(lái)進(jìn)行調(diào)整:
ht_opt$HEATMAP_LEGEND_PADDING = unit(5, "mm")
ht_opt$TITLE_PADDING = unit(c(9, 2), "mm") # bottom and top padding
Heatmap3D(mat, name = "mat", column_title = "This is a 3D heatmap")

看,現(xiàn)在看起來(lái)好多了。
下面一個(gè)例子是對(duì)一個(gè)麻疹疫苗數(shù)據(jù)集的可視化,第一張圖是2D熱圖,第二張圖是3D熱圖。源代碼可以通過(guò)點(diǎn)擊“閱讀全文”獲得。


最后,InteractiveComplexHeatmap包可以將任何通過(guò)ComplexHeatmap生成的熱圖轉(zhuǎn)變?yōu)橐粋€(gè)Shiny app,那么Heatmap3D()生成的熱圖也同樣可以。只需要在熱圖生成后運(yùn)行htShiny()即可:

往期精品(點(diǎn)擊圖片直達(dá)文字對(duì)應(yīng)教程)
后臺(tái)回復(fù)“生信寶典福利第一波”或點(diǎn)擊閱讀原文獲取教程合集




























