表的内容

做一个热图

作者:Zuguang Gu (z.gu@dkfz.de)

日期:2015-10-14


一个热图主要用于快速的数据视图。它是一个特例的热图列表只包含一个热图。与可用的工具,ComplexHeatmap包提供了一个更灵活的方式来支持可视化的一个热图。在以下示例中,我们将演示如何设置参数可视化一个热图。

首先让我们加载包和生成一个随机矩阵:

库(ComplexHeatmap)库(circlize) set.seed(123)垫= cbind (rbind(矩阵(rnorm(16日1),4),矩阵(rnorm(32岁,1),8)),rbind(矩阵(rnorm(24日1),4),矩阵(rnorm(48岁,1),8)))#交换行和列垫=垫(样本(nrow(垫),nrow(垫),样品(ncol(垫),ncol(垫)))rownames(垫)= paste0 (“R”, 1:12) colnames(垫)= paste0 (1:10“C”)

情节的热图的默认设置。的默认风格的热图是相当类似的热图所产生的相同功能。

热图(垫)

违约情节的一部分

颜色

在大多数情况下,热图可视化矩阵连续值。在这种情况下,用户应该提供一个颜色映射函数。颜色映射函数应该接受一个向量的值,并返回一个向量相应的颜色。的colorRamp2 ()circlize包装有利于生成等功能。的两个参数colorRamp2 ()是一个向量的优惠值和相应的颜色。目前colorRamp2 ()线性插入颜色在每个区间通过实验室空间。

在以下示例中,3和3之间的值是线性插值来获得相应的颜色,值大于3都映射到红色和值小于3都映射到绿色(这里的颜色映射函数证明是健壮的异常值)。

mat2 =垫mat2[1] = 100000的热图(mat2坳= colorRamp2 (c (3 0 3), c(“绿色”、“白”、“红”)),cluster_rows = FALSE, cluster_columns = FALSE)

color_fun阴谋的一部分

如果矩阵是连续的,也可以提供一个向量的颜色和颜色会显示插值的k个分位数。但请记住这个方法并不健壮的异常值。

热图(垫,坳=牧师(彩虹(10)))

color_vector阴谋的一部分

如果矩阵包含离散值(数字或字符),颜色应该指定为一个名为向量使从离散值映射到颜色。如果没有名字的颜色,颜色的顺序对应的顺序独特的(垫)

discrete_mat =矩阵(样本(1:4,100,取代= TRUE), 10、10)颜色=结构(circlize: rand_color(4),名称= c(“1”、“2”、“3”、“4”))的热图(discrete_mat坳=颜色)

discrete_matrix阴谋的一部分

或一个字符矩阵:

discrete_mat =矩阵(样本(字母[1:4],100年,取代= TRUE), 10、10)颜色=结构(circlize: rand_color(4),名称=信[1:4])的热图(discrete_mat坳=颜色)

discrete_character_matrix阴谋的一部分

如你所见,数字矩阵(无论它是连续映射或离散映射),默认集群应用在这两个维度上字符矩阵时,聚类是抑制。

NA热图是允许的。你可以控制的颜色NA通过na_col论点。矩阵包含NA也可以聚集热图()但是给予警告消息。

mat_with_na =垫mat_with_na[样本(c(真、假),nrow(垫)* ncol(垫),取代= TRUE,概率= c (9))) = NA的热图(mat_with_na na_col =“橙色”)
# #警告get_dist (submat、距离):NA存在于矩阵,计算距离通过移除NA # #的值。
# #警告get_dist (t(垫),距离):NA存在于矩阵,计算距离通过移除NA # #的值。

na_value阴谋的一部分

彩色空间对插值颜色很重要。默认情况下,颜色是线性插值实验室的颜色空间,但你可以选择的颜色空间colorRamp2 ()函数。比较下面两个情节(+操作在两个热图将被引入制作的热图的列表装饰图案):

f1 = colorRamp2 (seq (min(垫)、马克斯(垫),长度= 3),c(“蓝色”、“继续”、“红色”))= colorRamp2 f2 (seq (min(垫)、马克斯(垫),长度= 3),c(“蓝色”、“继续”、“红色”),空间=“RGB”)的热图(垫、坳= f1, column_title =“LAB颜色空间”)+热图(垫、坳= f2, column_title =“RGB颜色空间”)

unnamed-chunk-1阴谋的一部分

在图后,相应的值改变均匀褶皱轴上,你可以看到颜色变化在不同的颜色空间(情节是由HilbertCurve包)。选择一个合适的颜色空间有点主观的,这取决于特定数据和颜色主题。有时你需要尝试一些颜色空间来确定最好可以揭示潜在的数据结构。

unnamed-chunk-2阴谋的一部分unnamed-chunk-2阴谋的一部分

标题

默认的热图的名称作为标题的热图传奇。这个名字也扮演一个惟一的id,如果你一起绘制多个热图。以后我们可以用这个名字去相应的热图添加更多的图形(见热图装饰装饰图案)。

热图(垫、名称=“foo”)

with_matrix_name阴谋的一部分

传奇的热图的标题可以修改heatmap_legend_param(见热图和注释的传说装饰图案更多控制的传说)。

热图(垫、heatmap_legend_param =列表(title =“传奇”))

heatmap_legend_title阴谋的一部分

你可以设置的热图标题将通过的行或列。注意在同一时间你只能把如列标题在顶部或底部的热图。图形参数可以设置row_title_gpcolumn_title_gp分别。请记住您应该使用gpar ()指定图形的参数。

热图(垫、名称=“foo”, column_title =“我是一个列标题”,row_title =“我一行标题”)

row_column_title阴谋的一部分

热图(垫、名称=“foo”, column_title =“我是一个列标题底部“,column_title_side =“底部”)

row_column_title阴谋的一部分

热图(垫、名称=“foo”, column_title =“我是一个大列标题”,column_title_gp = gpar(字形大小= 20,fontface =“大胆”))

row_column_title阴谋的一部分

Roatations标题可以设置的row_title_rotcolumn_title_rot,但只有水平和垂直转动是允许的。

热图(垫、名称=“foo”, row_title =“标题行”,row_title_rot = 0)

title_rotation阴谋的一部分

聚类

集群的热图可视化的关键特性。在ComplexHeatmap包,支持集群高灵活性。您可以指定集群通过预定义的方法(如“eulidean”或“培生”),或一个距离函数,或由一个对象已经包含集群,或直接由集群功能。也可以使你的系统树图与不同的颜色和风格不同的分支为更好的揭示你的数据结构。

首先是一般设置集群,例如是否显示系统树图,系统树图,系统树图的大小。

热图(name = " foo "垫,cluster_rows = FALSE)

cluster_basic阴谋的一部分

热图(name = " foo "垫,show_column_dend = FALSE)

cluster_basic阴谋的一部分

热图(name = " foo "垫,row_dend_side =“正确的”)

cluster_basic阴谋的一部分

热图(name = " foo "垫,column_dend_height =单位(2厘米))

cluster_basic阴谋的一部分

有三种方法来指定距离聚类指标:

热图(name = " foo "垫,clustering_distance_rows =“皮尔森”)

cluster_distance阴谋的一部分

热图(name = " foo "垫,clustering_distance_rows =函数(m) dist (m))

cluster_distance阴谋的一部分

热图(name = " foo "垫,clustering_distance_rows = function (x, y) 1 -软木(x, y))

cluster_distance阴谋的一部分

基于这一特性,我们可以应用集群是健壮的异常值基于两两距离。

mat_with_outliers =垫(我在1:10)mat_with_outliers[我]= 1000 robust_dist =函数(x, y) {qx =分位数(x, c (0.1, 0.9)) qy =分位数(y, c (0.1, 0.9)) l = > qx [1] & x < qx [2] & y > qy [1] & y < qy [2] x = x [l] y = y [l] sqrt(和((x, y) ^ 2))}的热图(name = " foo " mat_with_outliers,坳= colorRamp2 (c (3 0 3), c(“绿色”、“白”、“红”)),clustering_distance_rows = robust_dist clustering_distance_columns = robust_dist)

cluster_distance_advanced阴谋的一部分

如果可能距离方法提供,你也可以集群特征矩阵。cell_fun参数将在后面的小节中解释。

mat_letters =矩阵(样本(字母[1:4],100年,取代= TRUE), 10) dist_letters = function (x, y) {x = strtoi (charToRaw(粘贴(x,崩溃= " ")),基础= 16)y = strtoi (charToRaw(粘贴(y,崩溃= " ")),基础= 16)√6(和((x, y) ^ 2))}的热图(name = " foo ", mat_letters坳=结构(2:5,名字=信[1:4]),clustering_distance_rows = dist_letters clustering_distance_columns = dist_letters cell_fun = function (j,我,x, y, w, h,上校){网格。文本(mat_letters (i, j), x, y)})

cluster_character_matrix阴谋的一部分

可以指定方法进行层次聚类clustering_method_rowsclustering_method_columns。可能的方法是支持的hclust ()函数。

热图(name = " foo "垫,clustering_method_rows =“单”)

cluster_method阴谋的一部分

默认情况下,集群是由hclust ()。但是你也可以利用聚类结果由指定生成的其他方法cluster_rowscluster_columns到一个hclust系统树图对象。在以下示例中,我们使用戴安娜()艾格尼丝()的方法集群包进行聚类。

库(集群)的热图(name = " foo "垫,cluster_rows = as.dendrogram(戴安娜(垫)),cluster_columns = as.dendrogram (agnes (t(垫))))

cluster_object阴谋的一部分

在本机热图()会重新排序函数,系统树图行和列让特性有较大不同更多的互相分离,但根据我的经验,默认重新排序并不总是能给好的可视化。默认情况下系统树图的重新排序是关闭的热图()函数。

除了默认的重新排序方法,您可以首先生成一个系统树图和其他应用重新排序方法然后发送重新排序系统树图cluster_rows论点。

比较三个情节:

pushViewport(视窗(=网格布局。布局(nr = 1,数控= 3)))pushViewport(视窗(layout.pos。行= 1,layout.pos。坳= 1)画(热图(name = " foo "垫,row_dend_reorder = FALSE, column_title =“不”重新排序),newpage = FALSE) upViewport () pushViewport(视窗(layout.pos。行= 1,layout.pos。坳= 2)画(热图(name = " foo "垫,row_dend_reorder = TRUE, column_title =“应用重新排序”),newpage = FALSE) upViewport()库(dendsort) dend = dendsort (hclust (dist(垫)))pushViewport(视窗(layout.pos。行= 1,layout.pos。坳= 3)画(热图(name = " foo "垫,cluster_rows = dend row_dend_reorder = FALSE, column_title =“dendsort重新排序”),newpage = FALSE) upViewport (2)

cluster_dendsort阴谋的一部分

你可以提供你系统树图对象的dendextend包和定制的可视化的系统树图。

图书馆(dendextend) dend = hclust (dist(垫))dend = color_branches (dend k = 2)的热图(name = " foo "垫,cluster_rows = dend)

cluster_dendextend阴谋的一部分

更普遍的是,cluster_rowscluster_columns可以计算集群的功能。自定义函数的输入参数应该是一个矩阵和返回值应该是一个hclust系统树图对象。请注意,当cluster_rows执行内部的论点吗是输入本身,而的转置在执行cluster_columns

热图(垫、名称=“foo”, cluster_rows = function (m) as.dendrogram(戴安娜(m)), cluster_columns = function (m) as.dendrogram (agnes (m)))

cluster_function阴谋的一部分

集群可以帮助调整订单的行和列。但你仍然可以手动设置的顺序row_ordercolumn_order。注意您需要关闭集群如果你想手动设置顺序。row_ordercolumn_order也可以根据矩阵行设置名称和列名称是否存在。

热图(垫、名称=“foo”, cluster_rows = FALSE, cluster_columns = FALSE, row_order = 12:1, column_order = 10:1)

manual_order阴谋的一部分

请注意row_dend_reorderrow_order是不同的。row_dend_reorder应用系统树图。因为任何节点在系统树图,旋转两个叶子给出了相同的系统树图。因此,重新排序的系统树图自动旋转sub-dendrogram在每个节点将有助于独立元素更多的差异彼此远离。而row_order是应用于矩阵和系统树图会被抑制。

维度名称

方面,可见性和图形参数维度名称可以设置如下。

热图(垫、名称=“foo”, row_names_side =“左”,row_dend_side =“正确”,column_names_side =“顶级”,column_dend_side =“底部”)

dimension_name阴谋的一部分

热图(name = " foo "垫,show_row_names = FALSE)

dimension_name阴谋的一部分

热图(name = " foo "垫,row_names_gp = gpar(字形大小= 20))

dimension_name阴谋的一部分

热图(name = " foo "垫,row_names_gp = gpar (col = c(代表(“红”,4),代表(“蓝色”,8))))

dimension_name阴谋的一部分

目前,旋转列名称和行名称不支持(或者在未来版本)。因为文字旋转,维度名称将进入其他的热图组件将陷入困境的热图布局。然而,当将被引入热图注释装饰图案、文字旋转的热图注释是允许的。因此,用户可以提供注释或列注释这一行只包含旋转文本来模拟旋转行/列名称(您将看到的例子热图注释装饰图案)。

分裂的热图的行

一个可以分裂的热图行。这将提高组分离的热图的可视化。的公里参数的值大于1意味着应用k - means聚类行和聚类应用于每个k - means聚类。

热图(name = " foo "垫,公里= 2)

k_means阴谋的一部分

更普遍的是,分裂可以设置为一个向量或一个数据帧的不同组合水平分割的热图的行。实际上,k - means聚类生成一个向量行类和附加分裂用一个额外的列。合并后的行标题为每一行片可以控制的combined_name_fun论点。每一片的顺序可以控制的水平每个变量的分裂

热图(name = " foo "垫,分裂=代表(c (“A”、“B”), 6))

情节的块分割

热图(name = " foo "垫,分裂= data.frame(代表(c (“A”、“B”), 6),代表(c (“c”,“D”),每个= 6)))

情节的块分割

热图(垫、名称=“foo”,分裂= data.frame(代表(c (“A”、“B”), 6),代表(c (“c”,“D”),每个= 6)),combined_name_fun = function (x)粘贴(x,崩溃= " \ n "))

情节的块分割

热图(垫、名称=“foo”,公里= 2,分裂=因素(代表(c (“A”、“B”), 6),水平= c (“A”“B”)), combined_name_fun = function (x)粘贴(x,崩溃= " \ n "))

情节的块分割

热图(垫、名称=“foo”,公里= 2,分裂=代表(c (“A”、“B”), 6), combined_name_fun = NULL)

情节的块分割

如果你不满意默认的k - means分区方法,很容易使用其他分区方法分配分区向量分裂

pa = pam(垫,k = 3)的热图(name = " foo "垫,分裂= paste0 (pam, pa集群)美元)

pam情节的一部分

如果row_order设置,在每一个切片,行仍然命令。

热图(垫、名称=“foo”, row_order = 12:1, cluster_rows = FALSE,公里= 2)

split_row_order阴谋的一部分

身高的差距排片可以控制的差距单位(一个单位或一个向量)。

热图(垫、名称=“foo”,分裂= paste0 (pam, pa集群美元),差距=单位(5毫米))

split_gap阴谋的一部分

字符矩阵只能分手分裂论点。

热图(name = " foo " discrete_mat,坳= 1:4,分裂=代表(字母[1:2],每个= 5))

split_discrete_matrix阴谋的一部分

当分离应用于行,图形参数可以指定行标题和行名称长度相同数量的排片。

热图(垫、名称=“foo”,公里= 2,row_title_gp = gpar (col = c(“红”、“蓝色”),字体= 1:2),row_names_gp = gpar (col = c(“绿色”、“橙色”),字形大小= c (10, 14)))

split_graphical_parameter阴谋的一部分

用户可能已经行和他们想要的系统树图k行通过分割系统树图分割成子树。在这种情况下,分裂可以指定一个数字:

热图(垫、名称=“foo”, cluster_rows = dend分裂= 2)

split_dendrogram阴谋的一部分

或者他们只是分裂行通过指定分裂作为一个整数。请注意它不同于公里。如果公里是集,首先应用k - means聚类,聚类应用于每个k-mean集群;而如果分裂是一个整数,聚类应用于整个矩阵,后来分裂cutree ()

热图(name = " foo "垫,分裂= 2)

unnamed-chunk-3阴谋的一部分

自定义的热图的身体

rect_gp论点提供基本的图形设置的热图(注意身体填满参数是禁用)。

热图(name = " foo "垫,rect_gp = gpar(=“绿色”,上校lty = 2, lwd = 2))

rect_gp阴谋的一部分

可以自我界定的热图的身体。默认的热图的身体是由一个矩形数组(这里称为细胞)与不同的填充颜色。如果类型rect_gp被设置为没有一个初始化数组的细胞,但没有图像。然后,用户可以定义自己的函数图形cell_funcell_fun应用在每一个细胞的热图,并提供以下信息在当前的单元格:

在以下的示例中,我们让一个热图显示相关矩阵的相似corrplot包:

cor_mat =软木(垫)od = hclust (dist (cor_mat)) $秩序cor_mat = cor_mat (od, od)纳米= rownames (cor_mat) col_fun = circlize:: colorRamp2 (c (1,0, - 1), c(“绿色”、“白”、“红”))#“坳= col_fun”这是用于生成传奇的热图(cor_mat name =“相关性”,上校= col_fun rect_gp = gpar (type = "没有"),cell_fun = function (j,我,x, y,宽度,高度,填){网格。矩形(x = x, y = y,宽度=宽度、高度=身高、gp = gpar (col =“灰色”,填补= NA))如果(i = = j){网格。文本(nm[我],x = x, y = y)} else if(我> j){网格。圆(x = x, y = y, r = abs (cor_mat (i, j)) / 2 *分钟(单位。c(宽度、高度)),gp = gpar(填补= col_fun (cor_mat (i, j)),坳= NA))其他}{grid.text (sprintf (“%。1 f, cor_mat (i, j)), x, y, gp = gpar(字形大小= 8))}},cluster_rows = FALSE, cluster_columns = FALSE, show_row_names = FALSE, show_column_names = FALSE)

cell_fun阴谋的一部分

请注意cell_fun应用于每一个细胞通过一个吗循环,所以会有点慢对大型矩阵。

会话信息

sessionInfo ()
# # R版本3.2.2(2015-08-14)# #平台:x86_64-pc-linux-gnu(64位)# #下运行:Ubuntu 14.04.3 LTS # # # #语言环境:# # [1]LC_CTYPE = en_US。utf - 8 LC_NUMERIC = C而= en_US。utf - 8 # # [4] LC_COLLATE = C LC_MONETARY = en_US。utf - 8 LC_MESSAGES = en_US。utf - 8 # # [7] LC_PAPER = en_US。utf - 8 LC_NAME C = C LC_ADDRESS = # # [10] LC_TELEPHONE = C LC_MEASUREMENT = en_US。utf - 8 LC_IDENTIFICATION = C附加基本包:# # # # # # [1]stats4平行网格数据图形grDevices跑龙套数据集方法# # # # # #[10]基地其他附加包:# # [1]dendextend_1.1.0 dendsort_0.3.2 cluster_2.0.3 HilbertCurve_1.0.0 # # [5] GenomicRanges_1.22.0 GenomeInfoDb_1.6.0 IRanges_2.4.0 S4Vectors_0.8.0 # # [9] BiocGenerics_0.16.0 circlize_0.3.1 ComplexHeatmap_1.6.0 knitr_1.11 # # [13] markdown_0.7.7 # # # #通过加载一个名称空间(而不是附加):# # [1]whisker_0.3-2 XVector_0.10.0 magrittr_1.5 zlibbioc_1.16.0 # # [5] lattice_0.20-33 colorspace_1.2-6 rjson_0.2.15 stringr_1.0.0 # # [9] tools_3.2.2 png_0.1-7 RColorBrewer_1.1-2 formatR_1.2.1 # # [13] HilbertVis_1.28.0 GlobalOptions_0.0.8 shape_1.4.2 evaluate_0.8 # # [17] mime_0.4 stringi_0.5-5 GetoptLong_0.1.0