前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用ComplexHeatmap绘制3D热图

使用ComplexHeatmap绘制3D热图

作者头像
王诗翔呀
发布2021-04-07 11:17:46
2K0
发布2021-04-07 11:17:46
举报
文章被收录于专栏:优雅R优雅R

起因

ComplexHeatmap包有一个densityHeatmap()函数用来对一组分布进行可视化。例如下面的例子:

代码语言:javascript
复制
library(ComplexHeatmap)
set.seed(123)
mat = matrix(rnorm(500), ncol = 10)
colnames(mat) = letters[1:10]
densityHeatmap(mat)

在R图形系统中,我们也可以使用histogram来可视化分布,因此从ComplexHeatmap版本2.7.9开始,我新加了一个函数frequencyHeatmap(),就像是一个histogram版本的density heatmap。其用法和densityHeatmap()非常类似:

代码语言:javascript
复制
frequencyHeatmap(mat)

在这里,区间中的频度使用热图进行可视化。

那么现在,频度热图被称作是密度热图的histogram版本,但这看起来一点都不像histogram。那么可能一个3D的热图在这里更加适合。这可以通过在frequencyHeatmap()中设置参数use_3d = TRUE来将2D热图转换为3D热图:

代码语言:javascript
复制
frequencyHeatmap(mat, use_3d = TRUE)

这看起来好多了!下面一节我将会介绍如何在ComplexHeatmap包中集成3D热图功能的。

3D热图的实现

首先,我们要能画3D的柱子,这可以通过新函数bar3D()实现。用法如下:

代码语言:javascript
复制
bar3D(x = 0.5, y = 0.5, w = 0.2, 
    h = 0.2, l = unit(1, "cm"), theta = 60)

其中各个参数的意义不言而喻,见下图:

bar3D()中,fill参数控制柱子的颜色。为了增强3D效果,柱子的三个面的颜色有略微轻微不同的明亮度。

代码语言:javascript
复制
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"))

参数theta控制投影的角度,见下例:

代码语言:javascript
复制
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))

好了,现在既然我们已经能够画3D的柱子了,为了实现3D的热图,我们可以通过cell_fun或者layer_fun提供的自定义函数来将每一个3D柱子放置在热图的格子上,其中柱子的高度和热图中相应的值对应。这里我写了一个新函数Heatmap3D()可以直接拿来使用。其用法和Heatmap()几乎完全相同。见下面的例子:

代码语言:javascript
复制
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")

当位于热图边缘的柱子太高时,可能会和热图中其他元件重叠,那么这时候需要进行手动的微调。在上面的例子中,标题和legend和3D柱子有重叠,这可以通过手动设置ht_optHEATMAP_LEGEND_PADDING和ht_optTITLE_PADDING来进行调整:

代码语言:javascript
复制
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")

看,现在看起来好多了。

下面一个例子是对一个麻疹疫苗数据集的可视化,第一张图是2D热图,第二张图是3D热图。源代码可以通过点击“阅读全文”获得。

最后,InteractiveComplexHeatmap包可以将任何通过ComplexHeatmap生成的热图转变为一个Shiny app,那么Heatmap3D()生成的热图也同样可以。只需要在热图生成后运行htShiny()即可:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 优雅R 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3D热图的实现
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档