R语言如何绘制带文字信息的热图

前言

本篇是R语言ComplexHeatmap包绘制带文字信息的热图教程。

pheatmap包绘制热图的教程可参考https://www.r2omics.cn/docs/gallery/omicsChart/heatmap/

什么是带文字信息的热图?

其实就是普通的热图,添加上文字信息,这个文字信息通常是富集通路信息。如图所示,基因分为了上调和下调。右侧的文字其实是上下调基因分别做KEGG富集后的条目。

绘图所需的数据

热图数据

数据来源一般是搜库结果定量表。包含2个维度的数据,一般情况下,每一行是一个基因,每一列是一个样本。

demo数据可以在这里下载https://www.r2omics.cn/res/demodata/heatmapAnno/data.txt

样本分组数据

对样本做分组。行名的名称和个数和顺序要和之前的heatmap数据保持一致

demo数据可以在这里下载https://www.r2omics.cn/res/demodata/heatmapAnno/dfSample.txt

基因分组文件

对基因做分组。行名的名称和个数和顺序要和之前的heatmap数据保持一致

demo数据可以在这里下载https://www.r2omics.cn/res/demodata/heatmapAnno/dfGene.txt

文字信息

这里是富集通路信息。第一列是通路名称,第二列是所属的分组。

demo数据可以在这里下载https://www.r2omics.cn/res/demodata/heatmapAnno/dfEnrich.txt

R语言如何绘制带文字信息的热图

# 代码来源:https://www.r2omics.cn/
# 加载必要的R包
library(ComplexHeatmap)
library(dplyr)

# 读取热图数据文件(数据文件路径需要根据实际情况进行调整)
df = read.delim("https://www.r2omics.cn/res/demodata/heatmapAnno/data.txt", sep = "\t", row.names = 1)

# 读取分组富集数据文件
# 分组文件里面的顺序应该和数据文件保持一致
dfSample = read.delim("https://www.r2omics.cn/res/demodata/heatmapAnno/dfSample.txt", row.names = 1, sep = "\t")  # 样本分组信息
dfGene = read.delim("https://www.r2omics.cn/res/demodata/heatmapAnno/dfGene.txt", row.names = 1, sep = "\t")      # 基因分组信息
dfEnrich = read.delim("https://www.r2omics.cn/res/demodata/heatmapAnno/dfEnrich.txt", sep = "\t")                 # 富集条目数据

# 把数据按行进行Z-score归一化
df.scale = df %>%
  t() %>%      # 转置矩阵,使得每一列为一个样本
  scale() %>%  # 对每一列进行Z-score标准化
  t() %>%      # 再次转置回原来的矩阵结构
  data.frame(check.names = FALSE)  # 转换为数据框

# 整理富集条目数据,根据分组生成每个组的相关富集条目
dfsentences = dfEnrich %>%
  group_by(Group) %>%  # 按照组别分组
  summarise(Terms = list(Term)) %>%  # 获取每个组的富集条目
  pull(Terms, name = "Group")  # 提取富集条目数据,按组名命名

# 绘制热图
p = Heatmap(df.scale,
        name = " ",               # 热图的颜色图例名称
        show_row_names = FALSE,   # 不显示行名
        show_column_names = TRUE, # 显示列名
        row_split = dfGene$Group, # 按基因组分割行
        column_split = dfSample$Group,  # 按样本组分割列
        cluster_row_slices = FALSE,     # 不对行分割进行聚类
        cluster_column_slices = FALSE,  # 不对列分割进行聚类
        column_title_gp = gpar(alpha = 0),  # 设置列标题的透明度为0,即不显示列标题
        row_title_gp = gpar(alpha = 0),     # 设置行标题的透明度为0,即不显示行标题
        top_annotation = HeatmapAnnotation(foo = anno_block(gp = gpar(fill = c("#bee146", "#f880bf")),
                                                            labels = unique(dfSample$Group),  # 样本组标签
                                                            labels_gp = gpar(col = "white", fontsize = 10))), # 样本组标签样式
        left_annotation = rowAnnotation(foo = anno_block(gp = gpar(fill = c("#64c3fb", "#fc8c62")),
                                                         labels = unique(dfGene$Group),       # 基因组标签
                                                         labels_gp = gpar(col = "white", fontsize = 10))),    # 基因组标签样式
        right_annotation = rowAnnotation(
          textbox = anno_textbox(
            dfGene$Group, dfsentences,  # 基因组与对应的富集条目
            word_wrap = TRUE,           # 自动换行
            add_new_line = TRUE,        # 添加换行符
            background_gp = gpar(fill = "white", col = "#AAAAAA"),  # 设置文本框背景样式
            gp = gpar(col = "black", fontsize = 8))                 # 设置文本颜色和字体大小
        )
)
draw(p)

# 保存图片
# png("heatmap.png", width = 7, height = 6,res=300, units = "in")  # 保存热图为PNG格式
# draw(p)  # 绘制热图,并将图例放在右侧
# dev.off()  # 关闭图形设备