ComplexHeatmap:在热图上把基因标记出来

今天给大家介绍一个很强大的包,这个包我也是只是学了冰山一角,更多的功能还是需要多查一些资料。
想必大家看文章经常看见这种比较漂亮的图片吧


QQ图片20220429191012.jpg

哦豁,这怎么画呀,还有斜线......嗯,高级高级,所以来吧

首先加载包

#加载包,清空
library(Seurat)
library(tidyverse)
library(ggplot2)
library(infercnv)
library(ComplexHeatmap)
library(ggpubr)
rm(list=ls())
#加载数据
scRNA_harmony <- readRDS("scRNAsub.rds")

我们看再细看这个热图 发现列是细胞 行是gene,并且细胞按照细胞类型排列,基因按照细胞的marker gene排列 所以我们最终要做到事情就是获取表达矩阵并进行排列处理,分成三步走

#第一步先获得每一个celltype的marker基因
if(T){
  Idents(scRNA_harmony) <- "celltype"  #先ident
  ##提取各个celltype的marker genes
  ClusterMarker <- FindAllMarkers(scRNA_harmony, assay = "RNA", slot = "data", only.pos = T,
                                  logfc.threshold = 0.25, min.pct = 0.1)
  ClusterMarker <- ClusterMarker[,c(7,1:6)]
  ##提取没有核糖体的Markers
  ClusterMarker_noRibo <- ClusterMarker[!grepl("^RP[SL]", 
                                               ClusterMarker$gene, ignore.case = F),]
  #取top
  top = 15   #可根据需要调整
  TopMarkers_noRibo = ClusterMarker_noRibo %>% group_by(cluster) %>% top_n(n = top, wt = avg_log2FC)
  #获取celltype的marker基因  TopMarkers_noRibo的gene那一列  
}

#第二步获取表达矩阵,并用log2来扩大差异
if(T){
  dat <- GetAssayData(scRNA_harmony,assay = "RNA",slot = "counts")
  dat <- as.data.frame(dat)
  dat <- log2(dat+1)
}    #因此得到log了的表达矩阵


#第三步,将表达矩阵进行排序
celltype_info <- sort(scRNA_harmony$celltype)  #获得按照细胞类型排序时细胞的名字
dat <- as.matrix(dat[TopMarkers_noRibo$gene, names(celltype_info)])  #进行行列排列

开始画图

#给列加上颜色和注释
library("BuenColors")
col <- jdb_color_maps[1:25]    #选取了25个颜色
names(col) <- levels(celltype_info)

#画图
Heatmap(dat,
        cluster_rows = FALSE,
        cluster_columns = FALSE,
        show_column_names = FALSE,
        show_row_names = FALSE,
        column_split = celltype_info)

#升级版
#只用文字描述可能不够好看,最好是带有颜色的分块图,
#其中里面的颜色和t-SNE或UMAP聚类颜色一致,才能更好的展示信息。
#为了增加聚类注释,我们需要用到HeatmapAnnotation函数,它对细胞的列进行注释,
#而rowAnnotation函数可以对行进行注释。这两个函数能够增加各种类型的注释,
#包括条形图,点图,折线图,箱线图,密度图等等,这些函数的特征是anno_xxx,
#例如anno_block就用来绘制区块图。
top_anno <- HeatmapAnnotation(
  cluster = anno_block(gp = gpar(fill = col), # 设置填充色
                       labels = levels(celltype_info), 
                       labels_gp = gpar(cex = 0.5, col = "white"))) # 设置字体

#其中anno_block中的gp参数用于设置各类图形参数,labels设置标签,
#labels_gp设置和标签相关的图形参数。可以用?gp来了解有哪些图形参数。
Heatmap(dat,
        cluster_rows = FALSE,
        cluster_columns = FALSE,
        show_column_names = FALSE,
        show_row_names = FALSE,
        column_split = celltype_info,
        top_annotation = top_anno, # 在热图上边增加注释
        column_title = NULL ) # 不需要列标题

#突出重要基因+改颜色
#由于基因很多直接展示出来,根本看不清,我们可以强调几个标记基因。
#用到两个函数是rowAnnotation和anno_mark
#将不同类群的marker基因记下(想展示的基因)
#我们需要给anno_mark提供基因所在行即可。
mark_gene <- c("FCER1G","AIF1","LY2","S100A2","GSTA","MFAP5","CD3E","CCL5","DARC","CXCR4","SFN","COL1A2","CD3D","VWF","CD83","CNN1")
gene_pos <- which(rownames(dat) %in% mark_gene)
row_anno <-  rowAnnotation(mark_gene = anno_mark(at = gene_pos, 
                                                 labels = mark_gene))

#修改颜色
library(circlize)
col_fun = colorRamp2(c(0, 2, 4), c("green", "white", "red"))
#我们限定值为 0 映射为 green,2 映射为 white,4 映射为 red。
#在这之间的值以线性内插的方式获取到相应的值,如果值超出了 [-2,2] 范围

Heatmap(dat,
        col = col_fun,
        cluster_rows = FALSE,
        cluster_columns = FALSE,
        show_column_names = FALSE,
        show_row_names = FALSE,
        column_split = celltype_info,
        top_annotation = top_anno,
        right_annotation = row_anno,
        column_title = NULL)

#调增图例位置
#目前的热图还有一个问题,也就是表示表达量范围的图例太占位置了,有两种解决方法

#方法一   
#参数设置show_heatmap_legend=FALSE直接删掉
#利用heatmap_legend_param参数更改样式
Heatmap(dat,
        cluster_rows = FALSE,
        cluster_columns = FALSE,
        show_column_names = FALSE,
        show_row_names = FALSE,
        column_split = celltype_info,
        top_annotation = top_anno,
        right_annotation = row_anno,
        column_title = NULL,
        heatmap_legend_param = list(
          title = "log2(count+1)",
          title_position = "leftcenter-rot"    #这里可以change图例的位置
        ))


#方法二
#因为ComplextHeatmap是基于Grid图形系统,因此可以先绘制热图,然后再用grid::draw绘制图例,
#从而实现将条形图的位置移动到图中的任意位置。

#先获取绘制热图的对象
p <- Heatmap(dat,
             cluster_rows = FALSE,
             cluster_columns = FALSE,
             show_column_names = FALSE,
             show_row_names = FALSE,
             column_split = celltype_info,
             top_annotation = top_anno,
             right_annotation = row_anno,
             column_title = NULL,
             show_heatmap_legend = FALSE
)
#根据p@matrix_color_mapping获取图例的颜色的设置,然后用Legend构建图例
p@matrix_color_mapping
col_fun  <- circlize::colorRamp2(c(0, 1, 2 ,3, 4),
                                 c("#0000FFFF", "#C3A5F7FF", "#D8C6F3FF", "#FFB8A4FF", "#FF1D0BFF"))
#用legend构建图例
lgd <-  Legend(col_fun = col_fun, 
               title = "log2(count+1)", 
               title_gp = gpar(col="white", cex = 0.75),
               title_position = "leftcenter-rot",
               #direction = "horizontal"
               at = c(0, 1, 4), 
               labels = c("low", "median", "high"),
               labels_gp = gpar(col="white")
)


#绘制图形
grid.newpage() #新建画布
draw(p) # 绘制热图
draw(lgd, x = unit(0.05, "npc"), 
     y = unit(0.05, "npc"), 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容