ComplexHeatmap繪制復雜熱圖

pheatmap交互

最近ComplexHeatmap更新可以將pheatmap對象進行參數(shù)轉(zhuǎn)換。新增的ComplexHeatmap::pheatmap()的功能與pheatmap::pheatmap()完全一致辖佣,其返回一個Formal class Heatmap對象,這意味著我們可以使用ComplexHeatmap中的其他函數(shù)對其進行操作并繪制更加復雜的熱圖。

# 模擬數(shù)據(jù)
test = matrix(rnorm(200), 20, 10)
test[1:10, seq(1, 10, 2)] = test[1:10, seq(1, 10, 2)] + 3
test[11:20, seq(2, 10, 2)] = test[11:20, seq(2, 10, 2)] + 2
test[15:20, seq(2, 10, 2)] = test[15:20, seq(2, 10, 2)] + 4
colnames(test) = paste("Test", 1:10, sep = "")
rownames(test) = paste("Gene", 1:20, sep = "")

# 整理注釋信息
annotation_col = data.frame(
  CellType = factor(rep(c("CT1", "CT2"), 5)), 
  Time = 1:5
)
rownames(annotation_col) = paste("Test", 1:10, sep = "")

annotation_row = data.frame(
  GeneClass = factor(rep(c("Path1", "Path2", "Path3"), c(10, 4, 6)))
)
rownames(annotation_row) = paste("Gene", 1:20, sep = "")

ann_colors = list(
  Time = c("white", "firebrick"),
  CellType = c(CT1 = "#1B9E77", CT2 = "#D95F02"),
  GeneClass = c(Path1 = "#7570B3", Path2 = "#E7298A", Path3 = "#66A61E")
)

# 繪圖
p1 = pheatmap(test, name = "mat1")
p2 = rowAnnotation(foo = anno_barplot(1:nrow(test)), border = F)
p3 = pheatmap(test, name = "mat2", 
              col = colorRampPalette(c("navy", "white", "firebrick3"))(50))
# or you can simply specify as
# p3 = pheatmap(test, name = "mat2", col = c("navy", "white", "firebrick3"))
p1 + p2 + p3
ComplexHeatmap::pheatmap

ComplexHeatmap::Heatmap主體熱圖參數(shù)

繪制熱圖首先需要準備已經(jīng)標準化的二維矩陣作為輸入蚁堤,可以出圖后我們就需要對主體部分進行修改幔戏,一些比較常用的參數(shù)包括單元格(顏色,邊界旬渠,大小等)俱萍,行/列聚類(是否聚類,是否展示聚類樹告丢,聚類樹的位置枪蘑,大小,顏色等),行/列注釋(行/列名岳颇,位置照捡,大小,顏色话侧,角度等)栗精,圖注信息等。

ComplexHeatmap主要使用了grid繪圖系統(tǒng)瞻鹏,使用gpar調(diào)整熱圖參數(shù):

  • col 控制顏色
  • fill 控制填充色
  • alpha 控制透明度
  • lty 線的類型
  • lwd 線寬
  • fontsize 字符的大小

unit參數(shù)則主要控制一些距離參數(shù)悲立,包括子圖間的空隙row/column_gap = unit(1, "mm"),熱圖的長寬heatmap_width/height = unit(1, "npc")新博,聚類樹的高度row/column_dend_width/height = unit(10, "mm")以及文字的最大長度row/column_names_max_width/height = unit(6, "cm")

控制聚類信息的參數(shù):

  • cluster_columns薪夕,cluster_rows 指定是否聚類
  • show_row_dendshow_column_dend 是否展示聚類結(jié)果(進行聚類)
  • row_names_side赫悄,column_names_side 聚類樹位置("left"原献,"right","top"涩蜘,"bottom")
  • clustering_method_rows嚼贡,clustering_method_columns 聚類方法
  • row_dend_widthcolumn_dend_height 聚類樹寬/高
  • row_km同诫,column_km 按聚類結(jié)果拆分熱圖

控制單元格的參數(shù):

  • col = circlize::colorRamp2(c(-2, 0, 2), c("navy", "white", "firebrick3")) 顏色粤策。
  • rect_gp = gpar(col= "white") 指定單元格邊界顏色
  • border 指定熱圖邊界顏色

控制行/列標簽的參數(shù):

  • row_labelscolumn_labels 行/列標簽
  • show_column_names误窖,show_row_names 是否顯示列/行名
  • row_names_side``coolumn_names_side 顯示行/列名的位置("left"叮盘,"right","top"霹俺,"bottom")
  • row_names_gp``column_names_gp 控制行/列名大腥岷稹(gpar(fontsize = 12))
  • row_names_rot``column_names_rot 控制行/列名的角度

控制整體圖形的參數(shù):

  • heatmap_width = unit(1, "npc")heatmap_height = unit(1, "npc") 圖形高/寬度
  • row_gap = unit(1, "mm")丙唧,column_gap = unit(1, "mm") 子圖空隙

控制圖注的參數(shù):

  • show_heatmap_legend 是否展示圖注
  • heatmap_legend_param圖注參數(shù)(list(at = c(-2, 0, 2), labels =c(-2, 0, 2))#需要制定at和labels的list)

控制注釋的參數(shù):

  • top_annotation = NULL
  • bottom_annotation = NULL
  • left_annotation = NULL
  • right_annotation = NULL

HeatmapAnnotation熱圖注釋

對于ComplexHeatmap來說愈魏,其主旨就是繪制復雜熱圖,所以對熱圖的注釋以及拼圖極其重視想际,對于*_annotation來說包括包括各種類型圖形和文字豐富結(jié)果培漏,并且還支持使用+(行)和%v%(列)對多個熱圖進行組裝。熱圖注釋是熱圖的重要組成部分胡本,它顯示與熱圖中的行或列關聯(lián)的其他信息牌柄。 ComplexHeatmap軟件包為設置注釋和定義新的注釋圖形提供了非常靈活的支持。注釋可以放在熱圖的四個側(cè)面侧甫,由top_annotation珊佣,bottom_annotation蹋宦,left_annotationright_annotation參數(shù)。

四個參數(shù)的值應在HeatmapAnnotation類中咒锻,并應由HeatmapAnnotation()函數(shù)構造冷冗,如果是行批注,則應由rowAnnotation()函數(shù)構造虫碉。(rowAnnotation()columnAnnotation()只是一個與HeatmapAnnotation(…贾惦,which=“row/column”)相同的輔助函數(shù))。HeatmapAnnotation的簡單用法如下敦捧。

  • simple annotation 最常用的注釋樣式须板,它是類似于熱圖或網(wǎng)格的圖形,其中顏色用于映射到注釋值
ha = HeatmapAnnotation(
    # 指定annotation的名稱
    foo = cbind(a = 1:10, b = 10:1), 
    bar = sample(letters[1:3], 10, replace = TRUE),
    col = list(foo = col_fun, bar = c("a" = "red", "b" = "green", "c" = "blue")),    # 指定顏色兢卵,傳入list
    gp = gpar(col='white')    # 指定邊界顏色
    simple_anno_size = unit(1, "cm")    # 指定單元格大小
)
  • anno_block塊注釋更像一個顏色塊习瑰,用于在拆分熱圖的行或列時標識組別。
Heatmap(matrix(rnorm(100), 10), 
    top_annotation = HeatmapAnnotation(foo = anno_block(gp = gpar(fill = 2:4),
        labels = c("group1", "group2", "group3"), 
        labels_gp = gpar(col = "white", fontsize = 10))),
    column_km = 3,
    left_annotation = rowAnnotation(foo = anno_block(gp = gpar(fill = 2:4),
        labels = c("group1", "group2", "group3"), 
        labels_gp = gpar(col = "white", fontsize = 10))),
    row_km = 3)
  • anno_points 繪制散點圖秽荤,axis_param控制坐標軸參數(shù)甜奄,需要制定side(指定坐標軸展示的位置),at(指定坐標)窃款,labels(指定標簽)
# 橫向散點圖
ha = HeatmapAnnotation(foo = anno_points(runif(10), ylim = c(0, 1),
    axis_param = list(
        side = "right",
        at = c(0, 0.5, 1), 
        labels = c("zero", "half", "one")
    ))
)

# 縱向散點圖
ha = rowAnnotation(foo = anno_points(runif(10), ylim = c(0, 1),
    width = unit(2, "cm"),
    axis_param = list(
        side = "bottom",
        at = c(0, 0.5, 1), 
        labels = c("zero", "half", "one"),
        labels_rot = 45
    ))
)
  • anno_lines繪制線圖课兄,可以使用add_points = TRUE加入散點圖,也可以使用smooth = TRUE繪制平滑后的曲線晨继,當設置smooth = TRUE會默認增加點圖
ha = HeatmapAnnotation(foo = anno_lines(cbind(c(1:5, 1:5), c(5:1, 5:1)), 
    gp = gpar(col = 2:3), add_points = TRUE, pt_gp = gpar(col = 5:6), pch = c(1, 16)))

ha = HeatmapAnnotation(foo = anno_lines(runif(10), smooth = TRUE))
  • anno_barplot用于繪制條形圖烟阐,輸入數(shù)據(jù)為二維矩陣時,則轉(zhuǎn)變?yōu)槎逊e圖
# 繪制柱狀圖
ha = HeatmapAnnotation(foo = anno_barplot(seq(-5, 5), baseline = "min"))

# 繪制堆積圖
ha = HeatmapAnnotation(foo = anno_barplot(matrix(nc = 2, c(1:10, 10:1))))
柱狀圖

堆積圖
  • anno_boxplot繪制箱線圖
ha = HeatmapAnnotation(foo = anno_boxplot(m, height = unit(4, "cm"), 
    gp = gpar(fill = 1:10)))
  • anno_histogram繪制直方圖
# n_breaks控制顯示的柱子數(shù)量
ha = rowAnnotation(foo = anno_histogram(m, n_breaks = 20))
  • anno_density繪制密度圖
ha = rowAnnotation(foo = anno_density(m))

示例

# 示例數(shù)據(jù)
mat = readRDS(system.file("extdata", "measles.rds", package = "ComplexHeatmap"))

# 列注釋 頂部 條形圖
ha1 = HeatmapAnnotation(
  dist1 = anno_barplot(
    colSums(mat), 
    bar_width = 1, 
    gp = gpar(col = "white", fill = "#FFE200"), 
    border = FALSE,
    axis_param = list(at = c(0, 2e5, 4e5, 6e5, 8e5),
                      labels = c("0", "200k", "400k", "600k", "800k")),
    height = unit(2, "cm")
  ), show_annotation_name = FALSE)

# 行注釋 右側(cè) 條形圖
ha2 = rowAnnotation(
  dist2 = anno_barplot(
    rowSums(mat), 
    bar_width = 1, 
    gp = gpar(col = "white", fill = "#FFE200"), 
    border = FALSE,
    axis_param = list(at = c(0, 5e5, 1e6, 1.5e6),
                      labels = c("0", "500k", "1m", "1.5m")),
    width = unit(2, "cm")
  ), show_annotation_name = FALSE)

# 列注釋 底部 標簽注釋
year_text = as.numeric(colnames(mat))
year_text[year_text %% 10 != 0] = ""
ha_column = HeatmapAnnotation(
  year = anno_text(year_text, rot = 0, location = unit(1, "npc"), just = "top")
)

# 顏色
col_fun = colorRamp2(c(0, 800, 1000, 127000), c("white", "cornflowerblue", "yellow", "red"))

# 熱圖主體
ht_list = Heatmap(mat, name = "cases", col = col_fun, cluster_row_slices = 2, 
                  cluster_columns = F, show_row_dend = F, rect_gp = gpar(col= "white"), 
                  show_column_names = FALSE,
                  row_names_side = "left", row_names_gp = gpar(fontsize = 6),
                  column_title = 'Measles cases in US states 1930-2001\nVaccine introduced 1961',
                  top_annotation = ha1, bottom_annotation = ha_column,
                  heatmap_legend_param = list(at = c(0, 5e4, 1e5, 1.5e5), 
                                              labels = c("0", "50k", "100k", "150k"))) + ha2
draw(ht_list, ht_gap = unit(5, "mm"))

# 分割線
decorate_heatmap_body("cases", {
  i = which(colnames(mat) == "1961")
  x = i/ncol(mat)
  grid.lines(c(x, x), c(0, 1), gp = gpar(lwd = 2, lty = 2))
  grid.text("Vaccine introduced", x, unit(1, "npc") + unit(5, "mm"))
})
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末紊扬,一起剝皮案震驚了整個濱河市蜒茄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌餐屎,老刑警劉巖檀葛,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異腹缩,居然都是意外死亡屿聋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門藏鹊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胜臊,“玉大人,你說我怎么就攤上這事伙判。” “怎么了黑忱?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵宴抚,是天一觀的道長勒魔。 經(jīng)常有香客問我,道長菇曲,這世上最難降的妖魔是什么冠绢? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮常潮,結(jié)果婚禮上弟胀,老公的妹妹穿的比我還像新娘。我一直安慰自己喊式,他們只是感情好孵户,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岔留,像睡著了一般夏哭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上献联,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天竖配,我揣著相機與錄音,去河邊找鬼里逆。 笑死进胯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的原押。 我是一名探鬼主播胁镐,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼班眯!你這毒婦竟也來了希停?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤署隘,失蹤者是張志新(化名)和其女友劉穎宠能,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磁餐,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡违崇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诊霹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羞延。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖脾还,靈堂內(nèi)的尸體忽然破棺而出伴箩,到底是詐尸還是另有隱情,我是刑警寧澤鄙漏,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布嗤谚,位于F島的核電站棺蛛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巩步。R本人自食惡果不足惜旁赊,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望椅野。 院中可真熱鬧终畅,春花似錦、人聲如沸竟闪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘫怜。三九已至术徊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲸湃,已是汗流浹背赠涮。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留暗挑,地道東北人笋除。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像炸裆,于是被迫代替她去往敵國和親垃它。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353