当我们画热图(heatmap)的时候,如果基因的名字比较多的时候,在热图中展示的话,就会出现名字重叠的情况,针对这个情况,我们有两种比较好的解决办法,第一是在热图中仅显示关注的基因名,其余基因名不显示;第二种方法是画环状热图。今天以第一种热图为例,来教小伙伴们如何实现。
话不多数,直接上代码:
- 首选安装依赖的程序包,后面绘图要用到。
# 安装包
if (!requireNamespace("BiocManager", quietly = TRUE)){install.packages("BiocManager")}
if (!requireNamespace("ComplexHeatmap", quietly = TRUE)){BiocManager::install("ComplexHeatmap")}
if (!requireNamespace("pals", quietly = TRUE)){BiocManager::install("pals")}
if (!requireNamespace("openxlsx", quietly = TRUE)){BiocManager::install("openxlsx")}
if (!requireNamespace("dplyr", quietly = TRUE)){BiocManager::install("dplyr")}
2 .程序包安装好后,加载程序包
# 加载包
library(ComplexHeatmap)
library(openxlsx)
library(dplyr)
library(pals)
3.读取绘图用到的数据,我们的数据格式行为基因名,列为样本
# 读入数据,并归一化(按照行归一化)
# 因为scale()函数默认是对矩阵按列标准化,所以本次转置了2次
df <- read.xlsx("heatmapIN.xlsx",rowNames = T) %>%
t() %>%
scale() %>%
t()
4.选择热图中要显示的基因名,可以选择自己比较关注的基因。
# 指定要显示的基因,以及确定基因的索引(位置)
gene.select <- c("KRT14","IGFBP2","LBP","PGAM1",
"LCAT","ITIH2", "ITIH1","PZP",
"HBD","KRT6A","APOA1",
"APOE","C4BPB")
pos <- which(rownames(df) %in% gene.select)
5.行注释(即展示选择的基因在热图中进行展示)
# 行注释
label <- rowAnnotation(
Zscore = anno_mark(at = pos,
labels = gene.select,
labels_gp = gpar(fontsize = 10),
lines_gp = gpar())
)
6.列注释(我们用的数据列是样本,即对样本的注释信息)
# 列注释
col.df <- read.xlsx("anno_df.xlsx",rowNames = T)
col_anno <- columnAnnotation(
Status = col.df[,1] %>% as.factor(), # 必须保证注释的信息为因子水平,所以需要as.factor()
Class = col.df[,2] %>% as.factor(),
Group = col.df[,3] %>% as.factor()
)
7.绘图,保存结果
p <- Heatmap(
df,
name = "Zscore",
row_names_gp = gpar(fontsize = 8),
rect_gp = gpar(col = "gray"),
cluster_rows = F,
cluster_columns = F,
show_column_names = F,
show_row_names = F,
right_annotation = label,
top_annotation = col_anno
)
png("heatmap.png", res = 100, width = 10, height = 8, units = 'in')
p
dev.off()
最终画的热图效果如下: