作者: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)
如果矩阵是连续的,也可以提供一个向量的颜色和颜色会显示插值的k个分位数。但请记住这个方法并不健壮的异常值。
热图(垫,坳=牧师(彩虹(10)))
如果矩阵包含离散值(数字或字符),颜色应该指定为一个名为向量使从离散值映射到颜色。如果没有名字的颜色,颜色的顺序对应的顺序独特的(垫)
。
discrete_mat =矩阵(样本(1:4,100,取代= TRUE), 10、10)颜色=结构(circlize: rand_color(4),名称= c(“1”、“2”、“3”、“4”))的热图(discrete_mat坳=颜色)
或一个字符矩阵:
discrete_mat =矩阵(样本(字母[1:4],100年,取代= TRUE), 10、10)颜色=结构(circlize: rand_color(4),名称=信[1:4])的热图(discrete_mat坳=颜色)
如你所见,数字矩阵(无论它是连续映射或离散映射),默认集群应用在这两个维度上字符矩阵时,聚类是抑制。
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 # #的值。
彩色空间对插值颜色很重要。默认情况下,颜色是线性插值实验室的颜色空间,但你可以选择的颜色空间colorRamp2 ()
函数。比较下面两个情节(+
操作在两个热图将被引入制作的热图的列表装饰图案):
f1 = colorRamp2 (seq (min(垫)、马克斯(垫),长度= 3),c(“蓝色”、“继续”、“红色”))= colorRamp2 f2 (seq (min(垫)、马克斯(垫),长度= 3),c(“蓝色”、“继续”、“红色”),空间=“RGB”)的热图(垫、坳= f1, column_title =“LAB颜色空间”)+热图(垫、坳= f2, column_title =“RGB颜色空间”)
在图后,相应的值改变均匀褶皱轴上,你可以看到颜色变化在不同的颜色空间(情节是由HilbertCurve包)。选择一个合适的颜色空间有点主观的,这取决于特定数据和颜色主题。有时你需要尝试一些颜色空间来确定最好可以揭示潜在的数据结构。
默认的热图的名称作为标题的热图传奇。这个名字也扮演一个惟一的id,如果你一起绘制多个热图。以后我们可以用这个名字去相应的热图添加更多的图形(见热图装饰装饰图案)。
热图(垫、名称=“foo”)
传奇的热图的标题可以修改heatmap_legend_param
(见热图和注释的传说装饰图案更多控制的传说)。
热图(垫、heatmap_legend_param =列表(title =“传奇”))
你可以设置的热图标题将通过的行或列。注意在同一时间你只能把如列标题在顶部或底部的热图。图形参数可以设置row_title_gp
和column_title_gp
分别。请记住您应该使用gpar ()
指定图形的参数。
热图(垫、名称=“foo”, column_title =“我是一个列标题”,row_title =“我一行标题”)
热图(垫、名称=“foo”, column_title =“我是一个列标题底部“,column_title_side =“底部”)
热图(垫、名称=“foo”, column_title =“我是一个大列标题”,column_title_gp = gpar(字形大小= 20,fontface =“大胆”))
Roatations标题可以设置的row_title_rot
和column_title_rot
,但只有水平和垂直转动是允许的。
热图(垫、名称=“foo”, row_title =“标题行”,row_title_rot = 0)
集群的热图可视化的关键特性。在ComplexHeatmap包,支持集群高灵活性。您可以指定集群通过预定义的方法(如“eulidean”或“培生”),或一个距离函数,或由一个对象已经包含集群,或直接由集群功能。也可以使你的系统树图与不同的颜色和风格不同的分支为更好的揭示你的数据结构。
首先是一般设置集群,例如是否显示系统树图,系统树图,系统树图的大小。
热图(name = " foo "垫,cluster_rows = FALSE)
热图(name = " foo "垫,show_column_dend = FALSE)
热图(name = " foo "垫,row_dend_side =“正确的”)
热图(name = " foo "垫,column_dend_height =单位(2厘米))
有三种方法来指定距离聚类指标:
dist ()
功能和内皮尔森
,斯皮尔曼
和肯德尔
。NA
值是忽略了预定义的集群,但给予警告(见例子颜色部分)。热图(name = " foo "垫,clustering_distance_rows =“皮尔森”)
热图(name = " foo "垫,clustering_distance_rows =函数(m) dist (m))
热图(name = " foo "垫,clustering_distance_rows = function (x, y) 1 -软木(x, y))
基于这一特性,我们可以应用集群是健壮的异常值基于两两距离。
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)
如果可能距离方法提供,你也可以集群特征矩阵。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)})
可以指定方法进行层次聚类clustering_method_rows
和clustering_method_columns
。可能的方法是支持的hclust ()
函数。
热图(name = " foo "垫,clustering_method_rows =“单”)
默认情况下,集群是由hclust ()
。但是你也可以利用聚类结果由指定生成的其他方法cluster_rows
或cluster_columns
到一个hclust
或系统树图
对象。在以下示例中,我们使用戴安娜()
和艾格尼丝()
的方法集群包进行聚类。
库(集群)的热图(name = " foo "垫,cluster_rows = as.dendrogram(戴安娜(垫)),cluster_columns = as.dendrogram (agnes (t(垫))))
在本机热图()
会重新排序函数,系统树图行和列让特性有较大不同更多的互相分离,但根据我的经验,默认重新排序并不总是能给好的可视化。默认情况下系统树图的重新排序是关闭的热图()
函数。
除了默认的重新排序方法,您可以首先生成一个系统树图和其他应用重新排序方法然后发送重新排序系统树图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)
你可以提供你系统树图
对象的dendextend包和定制的可视化的系统树图。
图书馆(dendextend) dend = hclust (dist(垫))dend = color_branches (dend k = 2)的热图(name = " foo "垫,cluster_rows = dend)
更普遍的是,cluster_rows
和cluster_columns
可以计算集群的功能。自定义函数的输入参数应该是一个矩阵和返回值应该是一个hclust
或系统树图
对象。请注意,当cluster_rows
执行内部的论点吗米
是输入垫
本身,而米
的转置垫
在执行cluster_columns
。
热图(垫、名称=“foo”, cluster_rows = function (m) as.dendrogram(戴安娜(m)), cluster_columns = function (m) as.dendrogram (agnes (m)))
集群可以帮助调整订单的行和列。但你仍然可以手动设置的顺序row_order
和column_order
。注意您需要关闭集群如果你想手动设置顺序。row_order
和column_order
也可以根据矩阵行设置名称和列名称是否存在。
热图(垫、名称=“foo”, cluster_rows = FALSE, cluster_columns = FALSE, row_order = 12:1, column_order = 10:1)
请注意row_dend_reorder
和row_order
是不同的。row_dend_reorder
应用系统树图。因为任何节点在系统树图,旋转两个叶子给出了相同的系统树图。因此,重新排序的系统树图自动旋转sub-dendrogram在每个节点将有助于独立元素更多的差异彼此远离。而row_order
是应用于矩阵和系统树图会被抑制。
方面,可见性和图形参数维度名称可以设置如下。
热图(垫、名称=“foo”, row_names_side =“左”,row_dend_side =“正确”,column_names_side =“顶级”,column_dend_side =“底部”)
热图(name = " foo "垫,show_row_names = FALSE)
热图(name = " foo "垫,row_names_gp = gpar(字形大小= 20))
热图(name = " foo "垫,row_names_gp = gpar (col = c(代表(“红”,4),代表(“蓝色”,8))))
目前,旋转列名称和行名称不支持(或者在未来版本)。因为文字旋转,维度名称将进入其他的热图组件将陷入困境的热图布局。然而,当将被引入热图注释装饰图案、文字旋转的热图注释是允许的。因此,用户可以提供注释或列注释这一行只包含旋转文本来模拟旋转行/列名称(您将看到的例子热图注释装饰图案)。
一个可以分裂的热图行。这将提高组分离的热图的可视化。的公里
参数的值大于1意味着应用k - means聚类行和聚类应用于每个k - means聚类。
热图(name = " foo "垫,公里= 2)
更普遍的是,分裂
可以设置为一个向量或一个数据帧的不同组合水平分割的热图的行。实际上,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集群)美元)
如果row_order
设置,在每一个切片,行仍然命令。
热图(垫、名称=“foo”, row_order = 12:1, cluster_rows = FALSE,公里= 2)
身高的差距排片可以控制的差距
单位(一个单位或一个向量)。
热图(垫、名称=“foo”,分裂= paste0 (pam, pa集群美元),差距=单位(5毫米))
字符矩阵只能分手分裂
论点。
热图(name = " foo " discrete_mat,坳= 1:4,分裂=代表(字母[1:2],每个= 5))
当分离应用于行,图形参数可以指定行标题和行名称长度相同数量的排片。
热图(垫、名称=“foo”,公里= 2,row_title_gp = gpar (col = c(“红”、“蓝色”),字体= 1:2),row_names_gp = gpar (col = c(“绿色”、“橙色”),字形大小= c (10, 14)))
用户可能已经行和他们想要的系统树图k行通过分割系统树图分割成子树。在这种情况下,分裂
可以指定一个数字:
热图(垫、名称=“foo”, cluster_rows = dend分裂= 2)
或者他们只是分裂行通过指定分裂
作为一个整数。请注意它不同于公里
。如果公里
是集,首先应用k - means聚类,聚类应用于每个k-mean集群;而如果分裂
是一个整数,聚类应用于整个矩阵,后来分裂cutree ()
。
热图(name = " foo "垫,分裂= 2)
rect_gp
论点提供基本的图形设置的热图(注意身体填满
参数是禁用)。
热图(name = " foo "垫,rect_gp = gpar(=“绿色”,上校lty = 2, lwd = 2))
可以自我界定的热图的身体。默认的热图的身体是由一个矩形数组(这里称为细胞)与不同的填充颜色。如果类型
在rect_gp
被设置为没有一个
初始化数组的细胞,但没有图像。然后,用户可以定义自己的函数图形cell_fun
。cell_fun
应用在每一个细胞的热图,并提供以下信息在当前的单元格:
j
:在矩阵列索引。列索引对应窗口的方向,这就是原因j
作为第一个参数。我
:行索引矩阵。x
:细胞的中间点的x坐标测量窗口的热图的身体。y
:细胞的中间点的y坐标测量窗口的热图的身体。宽度
:细胞的宽度。高度
:细胞的高度。填满
:细胞的颜色。在以下的示例中,我们让一个热图显示相关矩阵的相似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
应用于每一个细胞通过一个吗为
循环,所以会有点慢对大型矩阵。
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