R語言學習筆記之熱圖繪制

TaoYan

簡介

本文將繪制靜態(tài)與交互式熱圖呈驶,需要使用到以下R包和函數:
heatmap():用于繪制簡單熱圖的函數
heatmap.2():繪制增強熱圖的函數
d3heatmap:用于繪制交互式熱圖的R包
ComplexHeatmap:用于繪制、注釋和排列復雜熱圖的R&bioconductor包(非常適用于基因組數據分析)

數據準備

使用R內置數據集mtcars

df <- as.matrix((scale(mtcars)))#歸一化疫鹊、矩陣化

使用基本函數繪制簡單簡單熱圖

主要是函數heatmap(x, scale="row")

  • x:數據矩陣
  • scale:表示不同方向袖瞻,可選值有:row, columa, none
  • Default plotheatmap(df, scale = "none")


Use custom colors
col <- colorRampPalette(c("red", "white", "blue"))(256)
heatmap(df, scale = "none", col=col)
#Use RColorBrewer color palette names
library(RColorBrewer)col <- colorRampPalette(brewer.pal(10, "RdYlBu"))(256)#自設置調色板dim(df)#查看行列數
## [1] 32 11
heatmap(df, scale = "none", col=col, RowSideColors = rep(c("blue", "pink"), each=16), 
ColSideColors = c(rep("purple", 5), rep("orange", 6)))
#參數RowSideColors和ColSideColors用于分別注釋行和列顏色等,可help(heatmap)詳情

增強熱圖

函數heatmap.2()
在熱圖繪制方面提供許多擴展司致,此函數包裝在gplots包里。

library(gplots)heatmap.2(df, scale = "none", col=bluered(100), 
trace = "none", density.info = "none")#還有其他參數可參考help(heatmap.2())

交互式熱圖繪制

d3heatmap包可用于生成交互式熱圖繪制,可通過以下代碼生成:

if (!require("devtools")) 
install.packages("devtools") 
devtools::install_github("rstudio/d3heatmap")

函數d3heatmap()用于創(chuàng)建交互式熱圖聋迎,有以下功能:

  • 將鼠標放在感興趣熱圖單元格上以查看行列名稱及相應值
  • 可選擇區(qū)域進行縮放
library(d3heatmap)d3heatmap(df, colors = "RdBu", k_row = 4, k_col = 2)

k_row脂矫、k_col分別指定用于對行列中樹形圖分支進行著色所需組數。進一步信息可help(d3heatmap())獲取砌庄。

使用dendextend包增強熱圖

軟件包dendextend可以用于增強其他軟件包的功能

library(dendextend)# order for rows
Rowv <- mtcars %>% scale %>% dist %>% 
hclust %>% as.dendrogram %>%
 set("branches_k_color", k = 3) %>% 
set("branches_lwd", 1.2) %>% ladderize# Order for columns# 
We must transpose the data
Colv <- mtcars %>% scale %>% t %>% dist %>% 
hclust %>% as.dendrogram %>%
 set("branches_k_color", k = 2, value = c("orange", "blue")) %>% set("branches_lwd", 1.2) %>% ladderize
#增強heatmap()函數
heatmap(df, Rowv = Rowv, Colv = Colv, scale = "none")
#增強heatmap.2()函數
heatmap.2(df, scale = "none", col = bluered(100), Rowv = Rowv, Colv = Colv, trace = "none", density.info = "none")
#增強交互式繪圖函數
d2heatmap()d3heatmap(scale(mtcars), colors = "RdBu", Rowv = Rowv, Colv = Colv)

繪制復雜熱圖

ComplexHeatmap包是bioconductor包羹唠,用于繪制復雜熱圖,它提供了一個靈活的解決方案來安排和注釋多個熱圖娄昆。它還允許可視化來自不同來源的不同數據之間的關聯(lián)熱圖佩微。可通過以下代碼安裝:

if (!require("devtools")) install.packages("devtools") 
devtools::install_github("jokergoo/ComplexHeatmap")

ComplexHeatmap包的主要功能函數是Heatmap(),格式為:Heatmap(matrix, col, name)

  • matrix:矩陣
  • col:顏色向量(離散色彩映射)或顏色映射函數(如果矩陣是連續(xù)數)
  • name:熱圖名稱
library(ComplexHeatmap)
Heatmap(df, name = "mtcars")
#自設置顏色
library(circlize)
Heatmap(df, name = "mtcars", col = colorRamp2(c(-2, 0, 2), c("green", "white", "red")))

使用調色板

Heatmap(df, name = "mtcars",col = colorRamp2(c(-2, 0, 2), brewer.pal(n=3, name="RdBu")))
#自定義顏色
mycol <- colorRamp2(c(-2, 0, 2), c("blue", "white", "red"))

熱圖及行列標題設置

Heatmap(df, name = "mtcars", col = mycol, column_title = "Column title", row_title = 
"Row title")

注意萌焰,行標題的默認位置是“l(fā)eft”哺眯,列標題的默認是“top”“歉可以使用以下選項更改:

  • row_title_side:允許的值為“左”或“右”(例如:row_title_side =“right”)
  • column_title_side:允許的值為“top”或“bottom”(例如:column_title_side =“bottom”) 也可以使用以下選項修改字體和大心套俊:
  • row_title_gp:用于繪制行文本的圖形參數
  • column_title_gp:用于繪制列文本的圖形參數
Heatmap(df, name = "mtcars", col = mycol, column_title = "Column title", 
column_title_gp = gpar(fontsize = 14, fontface = "bold"), 
row_title = "Row title", row_title_gp = gpar(fontsize = 14, fontface = "bold"))

在上面的R代碼中,fontface的可能值可以是整數或字符串:1 = plain撼玄,2 = bold夺姑,3 =斜體,4 =粗體斜體掌猛。如果是字符串盏浙,則有效值為:“plain”,“bold”荔茬,“italic”废膘,“oblique”和“bold.italic”。
顯示行/列名稱:

  • show_row_names:是否顯示行名稱慕蔚。默認值為TRUE
  • show_column_names:是否顯示列名稱丐黄。默認值為TRUE
Heatmap(df, name = "mtcars", show_row_names = FALSE)

更改聚類外觀

默認情況下,行和列是包含在聚類里的。可以使用參數修改:

  • cluster_rows = FALSE诞挨。如果為TRUE窗市,則在行上創(chuàng)建集群
  • cluster_columns = FALSE。如果為TRUE,則將列置于簇上
# Inactivate cluster on rows
Heatmap(df, name = "mtcars", col = mycol, cluster_rows = FALSE)


如果要更改列集群的高度或寬度,可以使用選項column_dend_height
row_dend_width

Heatmap(df, name = "mtcars", col = mycol, column_dend_height = unit(2, "cm"), 
row_dend_width = unit(2, "cm") )


我們還可以利用color_branches()自定義樹狀圖外觀

library(dendextend)
row_dend = hclust(dist(df)) # row clustering
col_dend = hclust(dist(t(df))) # column clustering
Heatmap(df, name = "mtcars", col = mycol, cluster_rows = 
color_branches(row_dend, k = 4), cluster_columns = color_branches(col_dend, k = 2))

不同的聚類距離計算方式

參數clustering_distance_rowsclustering_distance_columns
用于分別指定行和列聚類的度量標準,允許的值有“euclidean”, “maximum”, “manhattan”, “canberra”, “binary”, “minkowski”, “pearson”, “spearman”, “kendall”接校。

Heatmap(df, name = "mtcars", clustering_distance_rows = "pearson", 
clustering_distance_columns = "pearson")
#也可以自定義距離計算方式
Heatmap(df, name = "mtcars", clustering_distance_rows = function(m) dist(m))
Heatmap(df, name = "mtcars", clustering_distance_rows = function(x, y) 1 - cor(x, y))

請注意,在上面的R代碼中,通常為指定行聚類的度量的參數 clustering_distance_rows顯示示例蛛勉。建議對參數clustering_distance_columns(列聚類的度量標準)使用相同的度量標準鹿寻。

# Clustering metric function
robust_dist = function(x, y) { 
qx = quantile(x, c(0.1, 0.9)) qy = quantile(y, c(0.1, 0.9)) l = x > qx[1] & x < qx[2] & y 
> qy[1] & y < qy[2] x = x[l] y = y[l] sqrt(sum((x - y)^2))}
# Heatmap
Heatmap(df, name = "mtcars", clustering_distance_rows = robust_dist, 
clustering_distance_columns = robust_dist, 
col = colorRamp2(c(-2, 0, 2), c("purple", "white", "orange")))

聚類方法

參數clustering_method_rowsclustering_method_columns可用于指定進行層次聚類的方法。允許的值是hclust()函數支持的值诽凌,包括“ward.D”毡熏,“ward.D2”,“single”侣诵,“complete”痢法,“average”,…(見?hclust)杜顺。

Heatmap(df, name = "mtcars", clustering_method_rows = "ward.D", 
clustering_method_columns = "ward.D")

熱圖拆分

有很多方法來拆分熱圖财搁。一個解決方案是應用k-means使用參數km
在執(zhí)行k-means時使用set.seed()函數很重要躬络,這樣可以在稍后精確地再現結果

set.seed(1122)
# split into 2 groupsHeatmap(df, name = "mtcars", col = mycol, k = 2)
# split by a vector specifying row classes尖奔, 有點類似于ggplot2里的分面
Heatmap(df, name = "mtcars", col = mycol, split = mtcars$cyl )
#split也可以是一個數據框,其中不同級別的組合拆分熱圖的行穷当。
# Split by combining multiple variables
Heatmap(df, name ="mtcars", col = mycol, split = data.frame(cyl = mtcars$cyl, am = mtcars$am))
# Combine km and split
Heatmap(df, name ="mtcars", col = mycol, km = 2, split = mtcars$cyl)
#也可以自定義分割
library("cluster")
set.seed(1122)
pa = pam(df, k = 3)Heatmap(df, name = "mtcars", col = mycol, split = paste0("pam", 
pa$clustering))

還可以將用戶定義的樹形圖和分割相結合提茁。在這種情況下,split可以指定為單個數字:

row_dend = hclust(dist(df)) # row clusterin
grow_dend = color_branches(row_dend, k = 4)
Heatmap(df, name = "mtcars", col = mycol, cluster_rows = row_dend, split = 2)

熱圖注釋

利用HeatmapAnnotation()對行或列注釋馁菜。格式為: HeatmapAnnotation(df, name, col, show_legend)

  • df:帶有列名的data.frame
  • name:熱圖標注的名稱
  • col:映射到df中列的顏色列表
# Transposedf <- t(df)
# Heatmap of the transposed data
Heatmap(df, name ="mtcars", col = mycol)
# Annotation data frame
annot_df <- data.frame(cyl = mtcars$cyl, am = mtcars$am, mpg = mtcars$mpg)
# Define colors for each levels of qualitative variables
# Define gradient color for continuous variable (mpg)
col = list(cyl = c("4" = "green", "6" = "gray", "8" = "darkred"), am = c("0" = "yellow", 
"1" = "orange"), mpg = colorRamp2(c(17, 25), c("lightblue", "purple")) )
# Create the heatmap annotation
ha <- HeatmapAnnotation(annot_df, col = col)
# Combine the heatmap and the annotation
Heatmap(df, name = "mtcars", col = mycol, top_annotation = ha)
#可以使用參數show_legend = FALSE來隱藏注釋圖例
ha <- HeatmapAnnotation(annot_df, col = col, show_legend = FALSE)
Heatmap(df, name = "mtcars", col = mycol, top_annotation = ha)
#注釋名稱可以使用下面的R代碼添加
library("GetoptLong")
# Combine Heatmap and annotation
ha <- HeatmapAnnotation(annot_df, col = col, show_legend = FALSE)
Heatmap(df, name = "mtcars", col = mycol, top_annotation = ha)
# Add annotation names on the right
for(an in colnames(annot_df)) { 
seekViewport(qq("annotation_@{an}")) 
grid.text(an, unit(1, "npc") + unit(2, "mm"), 0.5, default.units = "npc", just = "left")}
#要在左側添加注釋名稱茴扁,請使用以下代碼
# Annotation names on the left
for(an in colnames(annot_df)) { seekViewport(qq("annotation_@{an}")) grid.text(an, 
unit(1, "npc") - unit(2, "mm"), 0.5, default.units = "npc", just = "left")}

復雜注釋

將熱圖與一些基本圖形結合起來進行注釋,利用anno_point(),anno_barplot()
,anno_boxplot(),anno_density()anno_histogram()汪疮。

# Define some graphics to display the distribution of columns
.hist = anno_histogram(df, gp = gpar(fill = "lightblue"))
.density = anno_density(df, type = "line", gp = gpar(col = "blue"))
ha_mix_top = HeatmapAnnotation(hist = .hist, density = .density)
# Define some graphics to display the distribution of rows
.violin = anno_density(df, type = "violin", gp = gpar(fill = "lightblue"), which = "row")
.boxplot = anno_boxplot(df, which = "row")
ha_mix_right = HeatmapAnnotation(violin = .violin, bxplt = .boxplot, which = "row", 
width = unit(4, "cm"))
# Combine annotation with heatmap
Heatmap(df, name = "mtcars", col = mycol, column_names_gp = gpar(fontsize = 8), 
top_annotation = ha_mix_top, top_annotation_height = unit(4, "cm")) + ha_mix_right

熱圖組合

# Heatmap 1
ht1 = Heatmap(df, name = "ht1", col = mycol, km = 2, column_names_gp = gpar(fontsize = 9))
# Heatmap 2
ht2 = Heatmap(df, name = "ht2", col = colorRamp2(c(-2, 0, 2), c("green", "white", "red")), column_names_gp = gpar(fontsize = 9))
# Combine the two heatmaps
ht1 + ht2

可以使用選項width = unit(3峭火,“cm”))來控制熱圖大小。注意铲咨,當組合多個熱圖時,第一個熱圖被視為主熱圖蜓洪。剩余熱圖的一些設置根據主熱圖的設置自動調整纤勒。這些設置包括:刪除行集群和標題,以及添加拆分等隆檀。

draw(ht1 + ht2, 
      # Titles 
     row_title = "Two heatmaps, row title",
     row_title_gp = gpar(col = "red"), 
     column_title = "Two heatmaps, column title", 
     column_title_side = "bottom", 
      # Gap between heatmaps 
     gap = unit(0.5, "cm"))

可以使用參數show_heatmap_legend = FALSE摇天,show_annotation_legend = FALSE刪除圖例。

基因表達矩陣

在基因表達數據中恐仑,行代表基因泉坐,列是樣品值。關于基因的更多信息可以在表達熱圖之后附加裳仆,例如基因長度和基因類型腕让。

expr = readRDS(paste0(system.file(package = "ComplexHeatmap"), "/extdata/gene_expression.rds"))
mat = as.matrix(expr[, grep("cell", colnames(expr))])
type = gsub("s\\d+_", "", colnames(mat))
ha = HeatmapAnnotation(df = data.frame(type = type))
Heatmap(mat, name = "expression", km = 5, top_annotation = ha, top_annotation_height = unit(4, "mm"), 
show_row_names = FALSE, show_column_names = FALSE) +
Heatmap(expr$length, name = "length", width = unit(5, "mm"), col = colorRamp2(c(0, 100000), c("white", "orange"))) +
Heatmap(expr$type, name = "type", width = unit(5, "mm")) +
Heatmap(expr$chr, name = "chr", width = unit(5, "mm"), col = rand_color(length(unique(expr$chr))))

也可以可視化基因組變化和整合不同的分子水平(基因表達,DNA甲基化,…)

可視化矩陣中列的分布

使用函數densityHeatmap().

densityHeatmap(df)

8 Infos

sessionInfo()
## R version 3.3.3 (2017-03-06)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 8.1 x64 (build 9600)## 
## locale:
## [1] LC_COLLATE=Chinese (Simplified)_China.936 
## [2] LC_CTYPE=Chinese (Simplified)_China.936 
## [3] LC_MONETARY=Chinese (Simplified)_China.936
## [4] LC_NUMERIC=C 
## [5] LC_TIME=Chinese (Simplified)_China.936 ##
 ## attached base packages:
## [1] grid stats graphics grDevices utils datasets methods 
## [8] base 
## 
## other attached packages:
## [1] GetoptLong_0.1.6 cluster_2.0.5 circlize_0.3.10 
## [4] ComplexHeatmap_1.12.0 dendextend_1.4.0 d3heatmap_0.6.1.1
##[7] gplots_3.0.1 RColorBrewer_1.1-2 
## 
## loaded via a namespace (and not attached):
## [1] Rcpp_0.12.9 DEoptimR_1.0-8 plyr_1.8.4 
## [4] viridis_0.3.4 class_7.3-14 prabclus_2.2-6 
## [7] bitops_1.0-6 base64enc_0.1-3 tools_3.3.3 
## [10] digest_0.6.12 mclust_5.2.2 jsonlite_1.3 
## [13] evaluate_0.10 tibble_1.2 gtable_0.2.0 
## [16] lattice_0.20-34 png_0.1-7 yaml_2.1.14 
## [19] mvtnorm_1.0-6 gridExtra_2.2.1 trimcluster_0.1-2 
## [22] stringr_1.2.0 knitr_1.15.1 GlobalOptions_0.0.11
## [25] htmlwidgets_0.8 gtools_3.5.0 caTools_1.17.1 
## [28] fpc_2.1-10 diptest_0.75-7 nnet_7.3-12 
## [31] stats4_3.3.3 rprojroot_1.2 robustbase_0.92-7 
## [34] flexmix_2.3-13 rmarkdown_1.3.9002 gdata_2.17.0 
## [37] kernlab_0.9-25 ggplot2_2.2.1 magrittr_1.5 
## [40] whisker_0.3-2 backports_1.0.5 scales_0.4.1 
## [43] htmltools_0.3.5 modeltools_0.2-21 MASS_7.3-45
## [46] assertthat_0.1 shape_1.4.2 colorspace_1.3-2 
## [49] KernSmooth_2.23-15 stringi_1.1.2 lazyeval_0.2.0 
## [52] munsell_0.4.3 rjson_0.2.15
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末纯丸,一起剝皮案震驚了整個濱河市偏形,隨后出現的幾起案子,更是在濱河造成了極大的恐慌觉鼻,老刑警劉巖俊扭,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異坠陈,居然都是意外死亡萨惑,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門仇矾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庸蔼,“玉大人,你說我怎么就攤上這事若未≈熳欤” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵粗合,是天一觀的道長萍嬉。 經常有香客問我,道長隙疚,這世上最難降的妖魔是什么壤追? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮供屉,結果婚禮上行冰,老公的妹妹穿的比我還像新娘。我一直安慰自己伶丐,他們只是感情好悼做,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哗魂,像睡著了一般肛走。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上录别,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天朽色,我揣著相機與錄音,去河邊找鬼组题。 笑死葫男,一個胖子當著我的面吹牛,可吹牛的內容都是我干的崔列。 我是一名探鬼主播梢褐,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了利职?” 一聲冷哼從身側響起趣效,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猪贪,沒想到半個月后跷敬,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡热押,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年西傀,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桶癣。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拥褂,死狀恐怖,靈堂內的尸體忽然破棺而出牙寞,到底是詐尸還是另有隱情饺鹃,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布间雀,位于F島的核電站悔详,受9級特大地震影響,放射性物質發(fā)生泄漏惹挟。R本人自食惡果不足惜茄螃,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望连锯。 院中可真熱鬧归苍,春花似錦、人聲如沸运怖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摇展。三九已至吻氧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吗购,已是汗流浹背医男。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工砸狞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捻勉,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓刀森,卻偏偏與公主長得像踱启,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容