大数跨境

绘制热图新选择——ComplexHeatmap

绘制热图新选择——ComplexHeatmap 中科生信
2021-08-14
1
导读:ComplexHeatmapComplexHeatmap是Zuguang Gu制作的R语言包,可以绘制复杂热

ComplexHeatmap


ComplexHeatmap是Zuguang Gu制作的R语言包,可以绘制复杂热图,既可实现简单热图的功能,更能绘制更复杂的热图。复杂的热图有效地可视化不同数据集之间的关联并揭示潜在模式。ComplexHeatmap包提供了一种高度灵活的方式来排列多个热图并支持各种注释图形。目前的最新版本是2021-08-04发布的version 2.9.3.

01

安装方法

install.packages('devtools')library(devtools)install_github("jokergoo/ComplexHeatmap")

在 ComplexHeatmap包中,单个热图由热图主题和一系列的热图组件构成,如下图。

多个热图组成热图列表,其是热图和热图注释列表的串联。

热图和注释(现在是列注释)也可以垂直排列。

ComplexHeatmap包以对象为导向来进行后续处理,主要有以下类:

Heatmap类:包含heatmap、row/column names、titles、dendrograms和row/column annotations的单个热图。

HeatmapList类:heatmaps 和 heatmap annotations列表。

HeatmapAnnotation类:定义row/column annotations列表。HeatmapAnnotation可以是热图的组件,也可以作为热图独立。

我们使用说明文档里的提供的范例,生成一个随机矩阵,其中列中有三个组,行中有三个组。

install.packages('devtools')library(devtools)set.seed(123)nr1 = 4; nr2 = 8; nr3 = 6; nr = nr1 + nr2 + nr3nc1 = 6; nc2 = 8; nc3 = 10; nc = nc1 + nc2 + nc3mat = cbind(rbind(matrix(rnorm(nr1*nc1, mean = 1,   sd = 0.5), nr = nr1),          matrix(rnorm(nr2*nc1, mean = 0,   sd = 0.5), nr = nr2),          matrix(rnorm(nr3*nc1, mean = 0,   sd = 0.5), nr = nr3)),    rbind(matrix(rnorm(nr1*nc2, mean = 0,   sd = 0.5), nr = nr1),          matrix(rnorm(nr2*nc2, mean = 1,   sd = 0.5), nr = nr2),          matrix(rnorm(nr3*nc2, mean = 0,   sd = 0.5), nr = nr3)),    rbind(matrix(rnorm(nr1*nc3, mean = 0.5, sd = 0.5), nr = nr1),          matrix(rnorm(nr2*nc3, mean = 0.5, sd = 0.5), nr = nr2),          matrix(rnorm(nr3*nc3, mean = 1,   sd = 0.5), nr = nr3))   )mat = mat[sample(nr, nr), sample(nc, nc)] # random shuffle rows and columnsrownames(mat) = paste0("row", seq_len(nr))colnames(mat) = paste0("column", seq_len(nc))
install_github("jokergoo/ComplexHeatmap")

以下命令包含将矩阵可视化为具有默认设置的热图的函数的最小参数。与其他热图工具非常相似,它绘制了树状图、行/列名称和热图。默认的颜色图为"蓝白红",映射到矩阵中最小均值最大值。图例的标题以内部索引号分配。

Heatmap(mat)

ComplexHeatmap包的内容十分丰富,通过该包的内置函数,可以为热图增加丰富的注释。如下图将基因的相对表达进行了展示,在右边,我们把基因的绝对表达水平作为单列热图。基因长度和基因类型(即蛋白质编码或lincRNA)也作为热图注释或热图。在热图的左侧,有彩色矩形,通过从k-均值聚类中识别五个群集。在"基数均值"和"基因类型"热图之上,有汇总图(条形图和框图)显示五个集群中数据点的统计或分布。

另外也可对多个框图进行融合绘制。

02

ComplexHeatmap包热图的绘制丰富多样,下面从最基本的参数设置(颜色、标题和聚类)来进行介绍。

颜色

对于热图可视化,颜色是数据矩阵的主要表示。在大多数情况下,热图可视化具有连续数字值的矩阵。在这种情况下,用户应提供color mapping函数。color mapping函数应能够返回相应颜色的向量。用户应始终使用circlize::colorRamp2()生成color mapping。这两个参数是中断值向量和相应颜色的向量。通过LAB颜色空间在每个间隔内线性地插值颜色。还使用帮助生成具有正确刻度标记的图

circlize::colorRamp2()函数可以设置截断值,在以下示例中,-2 和 2 之间的值被线性插值以获得相应的颜色,大于 2 的值都映射为红色,小于 -2 的值都映射为绿色。

library(circlize)col_fun = colorRamp2(c(-2, 0, 2), c("green", "white", "red"))col_fun(seq(-3, 3))Heatmap(mat, name = "mat", col = col_fun)

如图所见,colorRamp2函数将负值映射到绿色,将正值映射为红色,即使负值和正值的分布不以零为中心。最重要的是,这种颜色映射不受离群值的影响。在以下绘图中,在存在离散值时,聚类会受到离群值(参见树状图)的严重影响,但颜色的映射却不受影响。

同时,如果多如图中的颜色设置为相同的colorRamp2函数结果,他们就可以直观地进行比较,在他们之中,相同的颜色 始终对应于相同的值 。

对于离散值,颜色应进行指定,以便能从离散值映射到颜色。

discrete_mat = matrix(sample(1:4, 100, replace = TRUE), 10, 10)colors = structure(1:4, names = c("1", "2", "3", "4")) # black, red, green, blueHeatmap(discrete_mat, name = "mat", col = colors,    column_title = "a discrete numeric matrix")

或者字符矩阵:

discrete_mat = matrix(sample(letters[1:4], 100, replace = TRUE), 10, 10)colors = structure(1:4, names = letters[1:4])Heatmap(discrete_mat, name = "mat", col = colors,    column_title = "a discrete character matrix")

标题

ComplexHeatmap包使用column_title和row_title来指定行标题和列标题。

Heatmap(mat, name = "mat", column_title = "I am a column title",     row_title = "I am a row title")

使用column_title_side函数指定位置。

Heatmap(mat, name = "mat", column_title = "I am a column title at the bottom",     column_title_side = "bottom")

使用column_title_gp来调整字号。

Heatmap(mat, name = "mat", column_title = "I am a big column title",     column_title_gp = gpar(fontsize = 20, fontface = "bold"))

行或列标题支持作为模板,当行或列在热图中拆分时使用模板(因为将有多行/列标题)。一个简单的例子是:

# code only for demonstration# row title would be cluster_1 and cluster_2Heatmap(mat, name = "mat", row_km = 2, row_title = "cluster_%s")

标题也可设置为数学公式。

Heatmap(mat, name = "mat",     column_title = expression(hat(beta) == (X^t * X)^{-1} * X^t * y))

03

聚类

聚类可能是热图可视化的关键组件。在复杂热图包中,具有极大的灵活性支持分层聚类。您可以通过:

  • 预先定义的距离方法,例如"euclidean""pearson"

  • 距离函数,

  • 已包含聚类的对象(可强制分类的对象或对象),hclustdendrogramdendrogram

  • 集群功能。

也可以为不同的节点和分支呈现不同颜色和风格的树状图,以便更好地揭示树状图的结构。

首先,集群有一般设置,例如是否应用聚类或显示树状图、树状图的位置和树状图的高度。

Heatmap(mat, name = "mat", cluster_rows = FALSE) # 关闭行聚类
Heatmap(mat, name = "mat", show_column_dend = FALSE) # 隐藏列树状图
Heatmap(mat, name = "mat", row_dend_side = "right", column_dend_side = "bottom")# 行树状图显示在右侧
Heatmap(mat, name = "mat", column_dend_height = unit(4, "cm"),     row_dend_width = unit(4, "cm"))# 设置树状图高度

04

聚类方法——Distance methods

分层聚类分两步完成,分别是计算距离矩阵和应用聚类

使用内置的 距离计算方法

Heatmap(mat, name = "mat", clustering_distance_rows = "pearson",    column_title = "pre-defined distance method (1 - pearson)")
Heatmap(mat, name = "mat", clustering_distance_rows = function(m) dist(m),    column_title = "a function that calculates distance matrix")

如果有合适的距离选择,也可以将字符矩阵进行分组。

mat_letters = matrix(sample(letters[1:4], 100, replace = TRUE), 10)# distance in the ASCII tabledist_letters = function(x, y) {    x = strtoi(charToRaw(paste(x, collapse = "")), base = 16)    y = strtoi(charToRaw(paste(y, collapse = "")), base = 16)    sqrt(sum((x - y)^2))}Heatmap(mat_letters, name = "letters", col = structure(2:5, names = letters[1:4]),    clustering_distance_rows = dist_letters, clustering_distance_columns = dist_letters,    cell_fun = function(j, i, x, y, w, h, col) { # add text to each grid        grid.text(mat_letters[i, j], x, y)    })

05

Clustering methods

我们可以使用内置的参数来完成聚类的简单操作 ,例如clustering_method_rows、clustering_method_columns、hclust()等。

Heatmap(mat, name = "mat", clustering_method_rows = "single")

配合cluster包,我们也可以使用内置的函数方法来完成聚类操作。

library(cluster)Heatmap(mat, name = "mat", cluster_rows = diana(mat),   cluster_columns = agnes(t(mat)), column_title = "clustering objects")
# if cluster_columns is set as a function, you don't need to transpose the matrixHeatmap(mat, name = "mat", cluster_rows = diana,   cluster_columns = agnes, column_title = "clustering functions")

更多的热图操作都基于以上参数的设置,关于ComplexHeatmap包更高级的用法,下次我们再深入研究。

SUMMER.TIME.

SLIGHT HEAT  #2021#

微信公众号

 中科生信

新浪微博

@中科生信 


【声明】内容源于网络
0
0
中科生信
中科生信是一家专业从事生物技术服务的公司,提供生物医学领域的定制化数据分析服务。公司业务有:二代测序平台、数据库搭建技术、测序个性化分析平台、以及生信分析定制化服务!致力于为客户提供“一站式”科研服务。
内容 580
粉丝 0
中科生信 中科生信是一家专业从事生物技术服务的公司,提供生物医学领域的定制化数据分析服务。公司业务有:二代测序平台、数据库搭建技术、测序个性化分析平台、以及生信分析定制化服务!致力于为客户提供“一站式”科研服务。
总阅读915
粉丝0
内容580