大家都在搜
前几篇介绍了两种热图绘制工具,Excel和R语言 的Pheatmap包。接下来小编继续为大家介绍用R语言的ComplexHeatmap包绘制热图 Complexheatmap是由顾祖光博士创建的R包,在他的GitHub里有详细的故事。ComplexHeatmap是基于绘图系统grid的。 https://github.com/jokergoo Complexheatmap的设计原理是,它提供一套很灵活的方法,用于多热图,即热图列表布局及支持自定义注释绘图,一个热图列表包含若干热图和注释信息。 绘制热图首先需要准备已经标准化的二维矩阵作为输入,可以出图后我们就需要对主体部分进行修改,一些比较常用的参数包括单元格(颜色,边界,大小等),行/列聚类(是否聚类,是否展示聚类树,聚类树的位置,大小,颜色等),行/列注释(行/列名,位置,大小,颜色,角度等),图注信息等。 在ComplexHeatmap主要使用了grid绘图系统,使用gpar调整热图参数:
控制聚类信息的参数:
控制单元格的参数: col = circlize::colorRamp2(c(-2, 0, 2), c("navy", "white", "firebrick3")) 颜色。 rect_gp = gpar(col= "white") 指定单元格边界颜色 border 指定热图边界颜色 控制行/列标签的参数:
控制整体图形的参数:
控制图注的参数:
控制注释的参数:
HeatmapAnnotation热图注释对于ComplexHeatmap来说,其主旨就是绘制复杂热图,所以对热图的注释以及拼图极其重视,对于*_annotation来说包括包括各种类型图形和文字丰富结果,并且还支持使用+(行)和%v%(列)对多个热图进行组装。热图注释是热图的重要组成部分,它显示与热图中的行或列关联的其他信息。ComplexHeatmap软件包为设置注释和定义新的注释图形提供了非常灵活的支持。注释可以放在热图的四个侧面,由top_annotation,bottom_annotation,left_annotation和right_annotation参数。第一步,载入R包,完成本地安装 if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")BiocManager::install("ComplexHeatmap") 第二步,安装完成后,输入加载命令。 library(ComplexHeatmap) library(circlize) 得出, ComplexHeatmap包提供了一种更灵活的方式支持单个热图的可视化。在下面的简单例子中,我们会说明如何设置参数以显示一个简单热图。 首先,载入语言包并生成一个随机矩阵。 set.seed(123) mat = cbind(rbind(matrix(rnorm(16, -1), 4), matrix(rnorm(32, 1), 8)), rbind(matrix(rnorm(24, 1), 4), matrix(rnorm(48, -1), 8))) mat = mat[sample(nrow(mat), nrow(mat)), sample(ncol(mat), ncol(mat))] rownames(mat) = paste0("R", 1:12) colnames(mat) = paste0("C", 1:10) 使用默认参数,一行命令即可作图。 Heatmap(mat) 大多数情况下,热图可视化含连续值得矩阵。在这种情况下,用户需要提供一个颜色映射函数。一个颜色映射函数需要接收一个数值向量并返回对应的颜色。circlize包提供的colorRamp2()对于生成这样的函数很有用。当前该函数通过LAB颜色空间线性地在每个区间插入颜色。 -3到3的区间被线性插入值用于获取对应的颜色,值大于3的被映射为红色,小于-3的被映射为绿色,因此这里的颜色对于异常值具有鲁棒性。 mat2 = mat mat2[1, 1] = 100000 Heatmap(mat2, col = colorRamp2(c(-3, 0, 3), c("green", "white", "red")), cluster_rows = FALSE, cluster_columns = FALSE) 如果矩阵值是连续的,你也可以提供一个颜色向量,颜色会根据第"k"个百分位进行插值。但是记住这种方法对于异常点没有鲁棒性。 Heatmap(mat, col = rev(rainbow(10))) 如果矩阵包含离散值(要么是数值的要么是字符串),颜色应该指定为一个命名向量用于将离散值映射为颜色。如果颜色没有名字,那么颜色的顺序会对应于unique(mat)的顺序。 discrete_mat = matrix(sample(1:4, 100, replace = TRUE), 10, 10) colors = structure(circlize::rand_color(4), names = c("1", "2", "3", "4")) Heatmap(discrete_mat, col = colors) 或者一个字符串矩阵: discrete_mat = matrix(sample(letters[1:4], 100, replace = TRUE), 10, 10) colors = structure(circlize::rand_color(4), names = letters[1:4]) Heatmap(discrete_mat, col = colors) 你可以看到,对于数值型矩阵(无论它是连续映射还是离散映射),默认两个维度都会进行聚类。而对于字符串矩阵,聚类默认是被抑制的。 热图中允许存在NA值。你可以通过na_col参数控制NA值的颜色。包含NA值矩阵也可以使用Heatmap()函数聚类(因为dist()函数接收NA值),使用“pearson”、 “spearman” 或 “kendall” 方法会给出警告信息。 mat_with_na = mat mat_with_na[sample(c(TRUE, FALSE), nrow(mat)*ncol(mat), replace = TRUE, prob = c(1, 9))] = NA Heatmap(mat_with_na, na_col = "orange", clustering_distance_rows = "pearson") ## Warning in get_dist(submat, distance): NA exists in the matrix, calculating distance by removing NA ## values. 对颜色插值来说颜色空间非常重要。默认情况下,颜色都是在LAB color space中线性插值,但你可以使用,colorRamp2()函数选择其他的颜色空间。比较下面的两幅图: f1 = colorRamp2(seq(min(mat), max(mat), length = 3), c("blue", "#EEEEEE", "red")) f2 = colorRamp2(seq(min(mat), max(mat), length = 3), c("blue", "#EEEEEE", "red"), space = "RGB") Heatmap(mat, col = f1, column_title = "LAB color space") + Heatmap(mat, col = f2, column_title = "RGB color space") 关注下篇继续为大家介绍用R语言的ComplexHeatmap包绘制热图~ |