# 一文詳解如何用R 語言繪製熱圖

## 簡介

• heatmap():用於繪製簡單熱圖的函數
• heatmap.2():繪製增強熱圖的函數
• d3heatmap:用於繪製交互式熱圖的R包
• ComplexHeatmap:用於繪製、註釋和排列複雜熱圖的R&bioconductor包（非常適用於基因組數據分析）

## 數據準備

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

## 使用基本函數繪製簡單簡單熱圖

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

Use custom colorscol <- 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)詳情

## 增強熱圖

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")

● 將鼠標放在感興趣熱圖單元格上以查看行列名稱及相應值

● 可選擇區域進行縮放

library(d3heatmap)d3heatmap(df, colors = "RdBu", k_row = 4, k_col = 2)

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

## 使用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 包，用於繪製複雜熱圖，它提供了一個靈活的解決方案來安排和註釋多個熱圖。它還允許可視化來自不同來源的不同數據之間的關聯熱圖。可通過以下代碼安裝：

if (!require("devtools")) install.packages("devtools")

devtools::install_github("jokergoo/ComplexHeatmap")

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

• matrix：矩陣
• col：顏色向量（離散色彩映射）或顏色映射函數（如果矩陣是連續數）
• 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")

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"))

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

## 更改聚類外觀

cluster_rows = FALSE。如果為TRUE，則在行上創建集群

cluster_columns = FALSE。如果為TRUE，則將列置於簇上

# Inactivate cluster on rows

Heatmap(df, name = "mtcars", col = mycol, cluster_rows = FALSE)

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

row_dend_width = unit(2, "cm") )

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))

## 不同的聚類距離計算方式

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))

# 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")))

## 聚類方法

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

clustering_method_columns = "ward.D")

## 熱圖拆分

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))

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)

## 熱圖註釋

• 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")}

## 複雜註釋

# 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

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"))

## 基因表達矩陣

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))))

## 可視化矩陣中列的分佈

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

End.

0