有一些用户希望在一个热图中使用多个颜色主题,可能是为了突出组间的差异。如果组与组(例如不同的列)也在热图上分隔出来(比如使用column split),那么每个组可以创建为单独的热图,然后将这些列表拼接起来。

在下面的例子中,我们假设热图在列上有两组,组A和组B。其中组A使用颜色:绿色-黑色-红色,组B使用紫色-白色-橘色。

set.seed(123)
mat = cbind(rbind(matrix(rnorm(20*20, mean = 1, sd = 0.5), nr = 20),matrix(rnorm(20*20, mean = 0, sd = 0.5), nr = 20),matrix(rnorm(20*20, mean = 0, sd = 0.5), nr = 20)),rbind(matrix(rnorm(20*20, mean = 0, sd = 0.5), nr = 20),matrix(rnorm(20*20, mean = 1, sd = 0.5), nr = 20),matrix(rnorm(20*20, mean = 0, sd = 0.5), nr = 20)),rbind(matrix(rnorm(20*20, mean = 0.5, sd = 0.5), nr = 20),matrix(rnorm(20*20, mean = 0.5, sd = 0.5), nr = 20),matrix(rnorm(20*20, mean = 1, sd = 0.5), nr = 20))) + matrix(rnorm(60*60, sd = 0.5), nr = 60)
group = rep(c("A", "B"), times = c(40, 20))
group = sample(group, length(group))library(circlize)
library(ComplexHeatmap)col1 = colorRamp2(c(-2, 0, 2), c("green", "black", "red"))
col2 = colorRamp2(c(-2, 0, 2), c("purple", "white", "orange"))ht1 = Heatmap(mat[, group == "A"], col = col1, name = "Group_A")
ht2 = Heatmap(mat[, group == "B"], col = col2, name = "Group_B")
ht1 + ht2

这个方法的问题在于对于行的聚类只是来自于第一个热图,也就是对应于组A的子矩阵。这个问题可以通过如下方法解决:在构建热图之前,使用完整的矩阵进行对列的聚类,然后将聚类结果保存在一个变量中,最后在draw()函数中,将此聚类变量赋予cluser_rows变量。

row_hlust = hclust(dist(mat))
draw(ht1 + ht2, cluster_rows = row_hlust)

好,现在,或许有人会说,不,我不想将原始的矩阵分开,我就是想将其作为一个完整的矩阵。那么此时,热图必须要包含两种不同的颜色主题,那么,一般的绘制热图的方法将不能使用,我们得手动根据当前不同的颜色主题绘制热图的格子。我们将使用cell_funlayer_fun参数来手动绘制热图。

首次,我们要关闭默认的热图格子绘制,这可以在Heatmap()函数中设置rect_gp = gpar(type = "none"),同时,热图的legend也不用绘制,这可以设置show_heatmap_legend = FALSE。我们会手动生成对应于两个颜色主题的legend。

下面的代码展示了如何通过cell_fun来手动绘制热图格子。其中,当当前格子属于组A时,我们用col1颜色主题,而当当前格子属于组B时,我们用col2颜色主题。

ht = Heatmap(mat, rect_gp = gpar(type = "none"), show_heatmap_legend = FALSE,cell_fun = function(j, i, x, y, w, h, fill) {if(group[j] == "A") {grid.rect(x, y, w, h, gp = gpar(fill = col1(mat[j, i]), col = NA))} else {grid.rect(x, y, w, h, gp = gpar(fill = col2(mat[j, i]), col = NA))}})

然后我们根据col1col2创建两个legend:

draw(ht, heatmap_legend_list = list(Legend(title = "Group_A", col_fun = col1),Legend(title = "Group_B", col_fun = col2)
))

cell_fun是一个格子一个格子画的。如果热图很大时,使用cell_fun可能会变得很慢,那么我们可以使用其向量化(vectorized)的版本:layer_fun,见如下代码。关于layer_fun的具体解释请见ComplexHeatmap book。

ht = Heatmap(mat, rect_gp = gpar(type = "none"), show_heatmap_legend = FALSE,layer_fun = function(j, i, x, y, w, h, fill) {l = group[j] == "A"grid.rect(x[l], y[l], w[l], h[l], gp = gpar(fill = col1(pindex(mat, i[l], j[l])), col = NA))l = group[j] == "B"grid.rect(x[l], y[l], w[l], h[l], gp = gpar(fill = col2(pindex(mat, i[l], j[l])), col = NA))})
draw(ht, heatmap_legend_list = list(Legend(title = "Group_A", col_fun = col1),Legend(title = "Group_B", col_fun = col2)
))

这生成和上图一模一样的图。

我们可以使用相同的方法对一个对称的矩阵添加两个不同的颜色主题(上三角矩阵和下三角矩阵):

corm = cor(mat)
col1 = colorRamp2(c(-1, 0, 1), c("green", "black", "red"))
col2 = colorRamp2(c(-1, 0, 1), c("purple", "white", "orange"))# here reordering the symmetric matrix is necessary
od = hclust(dist(corm))$order
corm = corm[od, od]ht = Heatmap(corm, rect_gp = gpar(type = "none"), show_heatmap_legend = FALSE,cluster_rows = FALSE, cluster_columns = FALSE,layer_fun = function(j, i, x, y, w, h, fill) {l = i > jgrid.rect(x[l], y[l], w[l], h[l], gp = gpar(fill = col1(pindex(corm, i[l], j[l])), col = NA))l = i < jgrid.rect(x[l], y[l], w[l], h[l], gp = gpar(fill = col2(pindex(corm, i[l], j[l])), col = NA))})
draw(ht, heatmap_legend_list = list(Legend(title = "Group_A", col_fun = col1),Legend(title = "Group_B", col_fun = col2)
))

点击链接

http://www.ehbio.com/Cloud_Platform/front/#/

在线绘制上面所有图形

往期精品(点击图片直达文字对应教程)

机器学习

后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集

在一个热图中使用多个颜色主题相关推荐

  1. i css svg,如何设置 CSS 背景图中的 SVG 的颜色

    Coloring SVGs in CSS Background Images 如何设置 CSS 背景图中的 SVG 的颜色 I love using SVG in CSS background ima ...

  2. 如何修改CAD图中的一些块颜色?

    在AutoCAD绘图过程中,我们会遇到各种各样的绘图问题,今天我们想和大家分享这个问题,如何修改CAD图中的一些块颜色?如果发现一个需要更改的块,那么更改可能会很费时.这一次可以加载CAD工具箱来辅助 ...

  3. 怎么让热图显示基因名_在热图中标注出特定基因名称

    原标题:在热图中标注出特定基因名称 对于基因的差异表达谱,常用热图作为展示.但有时差异基因可能非常的多,热图中不可能将所有基因的名称标注出来.那么此时不妨选择一些比较重要的基因(比方说p值最显著的那些 ...

  4. MATLAB | 如何从热图中提取数据

    这期做了个可能有用的小工具,一般论文中热图很少给出数据,于是就想写个小工具通过热图上的颜色估计出数据值来,目前写了个初版的工具分享给大家! 工具函数 由于只是初版,要手动改的地方还是不少的,要设置好要 ...

  5. python棒棒糖代码_(python matplotlib)如何更改棒棒糖图中每个棒棒糖的颜色(斧杆)...

    我使用ax.stem在python中绘制棒棒糖图.然而,我发现很难给每个棒棒糖指定不同的颜色 as shown here 如您所见,我有两个类别"GWP"和"FDP&qu ...

  6. python怎么变白-python – 在热图中使反向对角线变白

    我想尝试做一些如下图所示的图像, 只需设置反向对角线,就会留下白色.我无法将它们设置为白色.图表采用整数值,我不知道白色对应的整数值. 谢谢! 编辑: 这是代码; import math from m ...

  7. 超详细的R语言热图之complexheatmap系列(1)

    获取更多R语言和生信知识,请关注公众号:医学和生信笔记. 公众号后台回复R语言,即可获得海量学习资料! 目录 第一章 简介 1.1 设计理念 1.2 各章节速览 第二章 单个热图 2.1 颜色 2.2 ...

  8. 使用ComplexHeatmap绘制复杂热图|Note2:单个热图(万字超详细教程)

    2. 单个热图 2.1 颜色 2.2 标题 2.3 聚类 2.3.1 距离方法 2.3.2 聚类方法 2.3.3 渲染树状图 2.3.4 重排树状图 2.4 设置行列顺序 2.5 维度名称 2.6 热 ...

  9. python 热图颜色_Python可视化matplotlibseborn14-热图heatmap

    热力图(heatmap)可通过颜色深浅变化,优雅的展示数据的差异. 详细介绍python seaborn绘制热图 本文速览Matplotlib热图heatmapseaborn热图1seaborn热图2 ...

最新文章

  1. 总在说SpringBoot内置了tomcat启动,那它的原理你说的清楚吗?
  2. MySQL 5.7.2 发布,增强性能和可扩展性
  3. 机器翻译引擎的基本原理 ——LSTM
  4. Python 小白从零开始 PyQt5 项目实战(7)折叠侧边栏的实现
  5. ddos攻击工具_linux下DDoS攻击模拟实战
  6. linux备份数据库软件有哪些内容,Linux网络备份MySQL数据库的应用方法
  7. CrossOver for Mac 怎么用?
  8. vue基础之组件(创建,data,切换,父子以及同级之间的传值,插槽solt)
  9. jvisualvm插件安装
  10. OpenCV50:使用SVM完成OCR手写体识别
  11. 02 SpringBoot入门程序剖析之各种稀奇古怪的starter
  12. 修改360抢票的刷新频率+突破8车次限制,太简单了
  13. 并行程序设计导论 概念总结
  14. 关于yd ui 移动端自适应的方案
  15. 1 Microservice 简介
  16. 软件测试工程师的工资有多高?
  17. 基于服务器搭建部署的疫情动态地图
  18. linux多进程和多线程分析之一
  19. js ios调用ios方法_通过iOS 13的模式演示调用生命周期方法
  20. Android 12.0关机界面全屏显示(UI全屏显示)

热门文章

  1. 作者:崔代锐(1985-),男,百度外卖研发中心技术总监。
  2. 数聚新动能 数创大未来——2016中国国际大数据大会
  3. 作者:罗威,男,中国国防科技信息中心副研究员。
  4. 【C++】递归打印杨辉三角
  5. jqGrid 中的editrules来自定义colModel验证规则
  6. 江山控股附属斥资3.02亿收购云阳新能源发电100%股权并偿债
  7. 支付宝为何放弃社交梦?
  8. 杭州获评全国最智慧城市
  9. Unicode : RLO
  10. Android Studio1.4.x JNI开发基础 - 简单实例