ComplexHeatmap:在熱圖上把基因標記出來

今天給大家介紹一個很強大的包敦腔,這個包我也是只是學了冰山一角潜秋,更多的功能還是需要多查一些資料。
想必大家看文章經(jīng)臣埠矗看見這種比較漂亮的圖片吧


QQ圖片20220429191012.jpg

哦豁奈辰,這怎么畫呀,還有斜線......嗯乱豆,高級高級奖恰,所以來吧

首先加載包

#加載包,清空
library(Seurat)
library(tidyverse)
library(ggplot2)
library(infercnv)
library(ComplexHeatmap)
library(ggpubr)
rm(list=ls())
#加載數(shù)據(jù)
scRNA_harmony <- readRDS("scRNAsub.rds")

我們看再細看這個熱圖 發(fā)現(xiàn)列是細胞 行是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   #可根據(jù)需要調(diào)整
  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函數(shù)湿颅,它對細胞的列進行注釋,
#而rowAnnotation函數(shù)可以對行進行注釋粥诫。這兩個函數(shù)能夠增加各種類型的注釋油航,
#包括條形圖,點圖怀浆,折線圖谊囚,箱線圖,密度圖等等执赡,這些函數(shù)的特征是anno_xxx镰踏,
#例如anno_block就用來繪制區(qū)塊圖。
top_anno <- HeatmapAnnotation(
  cluster = anno_block(gp = gpar(fill = col), # 設(shè)置填充色
                       labels = levels(celltype_info), 
                       labels_gp = gpar(cex = 0.5, col = "white"))) # 設(shè)置字體

#其中anno_block中的gp參數(shù)用于設(shè)置各類圖形參數(shù)沙合,labels設(shè)置標簽奠伪,
#labels_gp設(shè)置和標簽相關(guān)的圖形參數(shù)。可以用?gp來了解有哪些圖形參數(shù)绊率。
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 ) # 不需要列標題

#突出重要基因+改顏色
#由于基因很多直接展示出來谨敛,根本看不清,我們可以強調(diào)幾個標記基因滤否。
#用到兩個函數(shù)是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炊甲。
#在這之間的值以線性內(nèi)插的方式獲取到相應(yīng)的值,如果值超出了 [-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)

#調(diào)增圖例位置
#目前的熱圖還有一個問題欲芹,也就是表示表達量范圍的圖例太占位置了卿啡,有兩種解決方法

#方法一   
#參數(shù)設(shè)置show_heatmap_legend=FALSE直接刪掉
#利用heatmap_legend_param參數(shù)更改樣式
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圖形系統(tǒng),因此可以先繪制熱圖耀石,然后再用grid::draw繪制圖例牵囤,
#從而實現(xiàn)將條形圖的位置移動到圖中的任意位置爸黄。

#先獲取繪制熱圖的對象
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
)
#根據(jù)p@matrix_color_mapping獲取圖例的顏色的設(shè)置滞伟,然后用Legend構(gòu)建圖例
p@matrix_color_mapping
col_fun  <- circlize::colorRamp2(c(0, 1, 2 ,3, 4),
                                 c("#0000FFFF", "#C3A5F7FF", "#D8C6F3FF", "#FFB8A4FF", "#FF1D0BFF"))
#用legend構(gòu)建圖例
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"), 

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市炕贵,隨后出現(xiàn)的幾起案子梆奈,更是在濱河造成了極大的恐慌,老刑警劉巖称开,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亩钟,死亡現(xiàn)場離奇詭異,居然都是意外死亡鳖轰,警方通過查閱死者的電腦和手機清酥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕴侣,“玉大人焰轻,你說我怎么就攤上這事±ト福” “怎么了辱志?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狞膘。 經(jīng)常有香客問我揩懒,道長,這世上最難降的妖魔是什么挽封? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任已球,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘智亮。我一直安慰自己退疫,他們只是感情好,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布鸽素。 她就那樣靜靜地躺著褒繁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馍忽。 梳的紋絲不亂的頭發(fā)上棒坏,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音遭笋,去河邊找鬼坝冕。 笑死,一個胖子當著我的面吹牛瓦呼,可吹牛的內(nèi)容都是我干的喂窟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼央串,長吁一口氣:“原來是場噩夢啊……” “哼磨澡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起质和,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤稳摄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后饲宿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厦酬,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年瘫想,在試婚紗的時候發(fā)現(xiàn)自己被綠了仗阅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡国夜,死狀恐怖减噪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情支竹,我是刑警寧澤旋廷,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站礼搁,受9級特大地震影響饶碘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜馒吴,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一扎运、第九天 我趴在偏房一處隱蔽的房頂上張望瑟曲。 院中可真熱鬧,春花似錦豪治、人聲如沸洞拨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烦衣。三九已至,卻和暖如春掩浙,著一層夾襖步出監(jiān)牢的瞬間花吟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工厨姚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留衅澈,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓谬墙,卻偏偏與公主長得像今布,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拭抬,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容