热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用ComplexHeatmap包绘制个性化热图

文章目录使用ComplexHeatmap包绘制个性化热图检测安装加载包创建测试数据集一行命令绘图调参美化猜你喜欢写在后面使用ComplexHeatmap包绘制个性化热图作者&#x


文章目录

  • 使用ComplexHeatmap包绘制个性化热图
    • 检测安装加载包
    • 创建测试数据集
    • 一行命令绘图
    • 调参美化
    • 猜你喜欢
    • 写在后面


使用ComplexHeatmap包绘制个性化热图

作者:刘梦瑶 诺禾致源 微生物信息

审稿:刘永鑫 中国科学院遗传与发育生物学研究所

ComplexHeatmap包由顾祖光博士创建,是一个非常全面的绘制热图的R包,可以利用它来绘制许多文献中的美图,例如下图展示的16S文献分析中的热图。这里主要介绍一下如何用这个R包来绘制类似的个性化热图。

image


检测安装加载包

# 检测安装CRAN包
package_list = c("circlize","grid","BiocManager")
for(p in package_list){
if (!requireNamespace(p, quietly = TRUE))install.packages(p)
}
# 检测安装bioconductor包
package_list = c("ComplexHeatmap")
for(p in package_list){
if (!requireNamespace(p, quietly = TRUE))BiocManager::install(p)
}# 加载依赖包
library(circlize)
library(grid)
library(ComplexHeatmap)

创建测试数据集

可以按照的Bioconductor官网上ComplexHeatmap包的说明来创建一个测试数据(http://bioconductor.org/packages/release/bioc/vignettes/ComplexHeatmap/inst/doc/s2.single_heatmap.html )

# 设置随机数种子,保证数据分析随机过程可重复
set.seed(123)
# 生成模拟数据:12行成10列矩阵
mat = cbind(rbind(matrix(rnorm(16, -1), 4), matrix(rnorm(32, 1), 8)),rbind(matrix(rnorm(24, 1), 4),matrix(rnorm(48, -1), 8)))
# 随机重排
mat = mat[sample(nrow(mat), nrow(mat)),sample(ncol(mat), ncol(mat))]
# 添加行、列名
rownames(mat) = paste0("R", 1:12)
colnames(mat) = paste0("C", 1:10)

一行命令绘图

使用默认参数,一行命令即可出图

#默认对行和列都进行聚类
Heatmap(mat)

image


调参美化

下面我们通过参数设置来进行个性化热图定制。

使用HeatmapAnnotation函数可以构建注释对象,我们可以进行自定义,也可以直接使用它的内置函数。

注释按位置来分类可分为行注释和列注释,以列注释为例,其内置函数按照图形的类型可以分为6种,anno_points(),anno_barplot(),anno_boxplot(),anno_histogram(),anno_density(),anno_text()。

行注释的内置函数和列注释类似,前面加上row即可,如row_anno_points()。
详细示例可参照网址:http://bioconductor.org/packages/release/bioc/vignettes/ComplexHeatmap/inst/doc/s4.heatmap_annotation.html 。

本文重点讨论anno_points()的用法。

# 生成包含10个0.5数值的向量
value = rep(0.5,10)
# 设置值、形状、大小、颜色等
ha = HeatmapAnnotation("type" = anno_points(value, pch=c(19,19,15,15,24,24,23,23,3,3), size = unit(7, "mm"),gp = gpar(col = c("#bf94e4","#bf94e4","#bf94e4","#bf94e4","#1dacd6","#1dacd6","#1dacd6","#1dacd6","red","red")),border=FALSE,ylim=c(0,1)),show_annotation_name = FALSE)

"type"为这一行注释的名称,show_annotation_name = FALSE,即不显示名称。pch可指定绘制点时使用的符号,共25种,如上三角,下三角,圆形,方形等,具体可见《R In Action》。size可指定符号的大小,gp可指定符号的颜色。

# 批量按行中心标准化,减均值除方差,Z-score
mat_scaled = apply(mat, 1, scale)
# 继续原数据表列名
rownames(mat_scaled) = colnames(mat)
# 转置才与原方向一致
mat_scaled = t(mat_scaled)
# 通过circlize包中的colorRamp2()函数,来自定义颜色
col_fun = circlize::colorRamp2(c(-3, 0, 3), c("black", "white", "yellow"))
# 新矩阵
shape<-mat_scaled
# 循环元素筛选&#xff0c;变为&#43;或空&#xff0c;显著标记常用
x<-nrow(mat_scaled)
y<-ncol(mat_scaled)
for(i in 1:x ){for (j in 1:y ){if(shape[i,j]>&#61;1){shape[i,j]<-"&#43;";} else{shape[i,j]<-"";}}}

如需对数据进行标准化&#xff0c;需使用apply函数来处理数据。我们可以通过circlize包中的colorRamp2()函数&#xff0c;来自定义颜色。对mat_scaled的数值进行筛选&#xff0c;生成一个符号是加号或空值的新数据框。这一部分可以根据作图要求来自定义。

P1&#61;Heatmap(mat_scaled,
name &#61; "hello",
top_annotation &#61; ha,
col &#61; col_fun,
rect_gp &#61; gpar(col &#61; "black",lty &#61; 2, lwd &#61; 1),
cell_fun &#61; function(j, i, x, y, width, height, fill) {grid.text(shape[i,j], x &#61; x, y &#61; y,gp &#61; gpar(fontsize &#61; 10,col&#61;"red"))},
cluster_rows &#61; FALSE,
cluster_columns &#61; FALSE,
row_names_side &#61; "left",
column_names_side&#61;"bottom",
row_names_gp &#61; gpar(col &#61; c("#8B7500","#8B7500","#8B7500","#8B7500","#8B7500","#8B7500","#0000FF","#0000FF","#0000FF","#0000FF","#0000FF","#0000FF")))

name可定义图例的名称。top_annotation 可引用上面定义好的列注释, 并将列注释放在heatmap上方&#xff1b;bottom_annotation 则将列注释放在heatmap下方。rect_gp定义小方格的边框颜色&#xff0c;线条类型及宽度。cell_fun可以对heatmap的每个小方格进行自定义&#xff0c;这里用其来显示”&#43;”号&#xff0c;也可以显示数字等。cluster_rows和cluster_columns可定义是否聚类。row_names_side可定义行名的显示位置&#xff0c;默认值right。column_names_side可定义列名的显示位置&#xff0c;默认值bottom。row_names_gp可定义列名的颜色。

# 行名第一列
texta &#61; c("A","B","C","D","EEEEE","F","G","H","I","J","K","L")
# 行注释&#xff0c;宽度为最大文本
ha_texta &#61;rowAnnotation(text &#61; row_anno_text(texta), width &#61; max_text_width(texta))
# 行名第二列
textb &#61; c("M","N","O","P","Q","R","S","T","U","V","W","X")
ha_textb &#61;rowAnnotation(text &#61; row_anno_text(textb), width &#61; max_text_width(textb))
# 添加行名注释
ht_list &#61; P1 &#43; ha_texta &#43; ha_textb
# 添加图例对应文字、形状和颜色
lgd &#61; legendGrob(c("A","B","C","D","E"), pch &#61; c(19,15,24,23,3),gp&#61; gpar(col &#61;c("#bf94e4","#bf94e4","#1dacd6","#1dacd6","red")))
# 绘图&#xff0c;添加热图图例左&#xff0c;注释图例
draw(ht_list,heatmap_legend_side &#61; "left",annotation_legend_list &#61; list(lgd))

rowAnnotation中max_text_width可计算得到列名中最长的文本宽度&#xff0c;legendGrob可自定义图例的名称&#xff0c;形状&#xff0c;颜色。

image


猜你喜欢


  • 10000&#43;: 菌群分析
    宝宝与猫狗 提DNA发Nature 实验分析谁对结果影响大 Cell微生物专刊 肠道指挥大脑
  • 系列教程&#xff1a;微生物组入门 Biostar 微生物组 宏基因组
  • 专业技能&#xff1a;生信宝典 学术图表 高分文章 不可或缺的人
  • 一文读懂&#xff1a;宏基因组 寄生虫益处 进化树
  • 必备技能&#xff1a;提问 搜索 Endnote
  • 文献阅读 热心肠 SemanticScholar Geenmedical
  • 扩增子分析&#xff1a;图表解读 分析流程 统计绘图
  • 16S功能预测 PICRUSt FAPROTAX Bugbase Tax4Fun
  • 在线工具&#xff1a;16S预测培养基 生信绘图
  • 科研经验&#xff1a;云笔记 云协作 公众号
  • 编程模板: Shell R Perl
  • 生物科普: 肠道细菌 人体上的生命 生命大跃进 细胞暗战 人体奥秘

写在后面

为鼓励读者交流、快速解决科研困难&#xff0c;我们建立了“宏基因组”专业讨论群&#xff0c;目前己有国内外5000&#43; 一线科研人员加入。参与讨论&#xff0c;获得专业解答&#xff0c;欢迎分享此文至朋友圈&#xff0c;并扫码加主编好友带你入群&#xff0c;务必备注“姓名-单位-研究方向-职称/年级”。技术问题寻求帮助&#xff0c;首先阅读《如何优雅的提问》学习解决问题思路&#xff0c;仍末解决群内讨论&#xff0c;问题不私聊&#xff0c;帮助同行。
image

学习扩增子、宏基因组科研思路和分析实战&#xff0c;关注“宏基因组”
image

image

点击阅读原文&#xff0c;跳转最新文章目录阅读
https://mp.weixin.qq.com/s/5jQspEvH5_4Xmart22gjMA


推荐阅读
author-avatar
EDDSJZ紅葉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有