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

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

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

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

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

在bar3D()中,fill參數(shù)控制柱子的顏色。為了增強3D效果,柱子的三個面的顏色有略微輕微不同的明亮度。
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控制投影的角度,見下例:
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)能夠畫3D的柱子了,為了實現(xiàn)3D的熱圖,我們可以通過cell_fun或者layer_fun提供的自定義函數(shù)來將每一個3D柱子放置在熱圖的格子上,其中柱子的高度和熱圖中相應的值對應。這里我寫了一個新函數(shù)Heatmap3D()可以直接拿來使用。其用法和Heatmap()幾乎完全相同。見下面的例子:
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")

當位于熱圖邊緣的柱子太高時,可能會和熱圖中其他元件重疊,那么這時候需要進行手動的微調(diào)。在上面的例子中,標題和legend和3D柱子有重疊,這可以通過手動設置ht_opt$HEATMAP_LEGEND_PADDING和ht_opt$TITLE_PADDING來進行調(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)在看起來好多了。
下面一個例子是對一個麻疹疫苗數(shù)據(jù)集的可視化,第一張圖是2D熱圖,第二張圖是3D熱圖。源代碼可以通過點擊“閱讀全文”獲得。


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

往期精品(點擊圖片直達文字對應教程)
后臺回復“生信寶典福利第一波”或點擊閱讀原文獲取教程合集




























