热图列表
ComplexHeatmap包的主要特点是它可以水平或垂直连接热图和注释列表,我们可以将各种信息来源进行可视化关联。在本章中,我们主要介绍水平串联(在分析中使用频率较高)后面也展示了一些垂直串联的例子。水平和垂直串联在语法上是基本相似的。
对于水平串联,所有热图和注释的行数应该相同。我们首先介绍热图的串联,然后我们将展示如何将热图与注释串联。
在下面例子中,有三个矩阵,其中第三个是一个热图向量,它将被转换为一列矩阵。当您连接热图列表时,一列热图有时很有用,它可以显示例如每行的注释或每行的一些分数。例如,如果行是基因,则基因的类型(即蛋白质编码与否)可以表示为一列字符矩阵,差异表达分析的p值或倍数变化可以表示为一列数字矩阵,并连接到主热图中。
set.seed(123)
mat1 = matrix(rnorm(80, 2), 8, 10)
mat1 = rbind(mat1, matrix(rnorm(40, -2), 4, 10))
rownames(mat1) = paste0("R", 1:12)
colnames(mat1) = paste0("C", 1:10)
mat2 = matrix(runif(60, max = 3, min = 1), 6, 10)
mat2 = rbind(mat2, matrix(runif(60, max = 2, min = 0), 6, 10))
rownames(mat2) = paste0("R", 1:12)
colnames(mat2) = paste0("C", 1:10)
le = sample(letters[1:3], 12, replace = TRUE)
names(le) = paste0("R", 1:12)
ind = sample(12, 12)
mat1 = mat1[ind, ]
mat2 = mat2[ind, ]
le = le[ind]
要连接热图,只需使用+
运算符。
ht1 = Heatmap(mat1, name = "rnorm")
ht2 = Heatmap(mat2, name = "runif")
ht3 = Heatmap(le, name = "letters")
ht1 + ht2 + ht3
在默认模式下,第二个热图中的树状图将被删除,行顺序将与第一个相同。前两个热图的行名称也被删除。
连接的返回值是一个HeatmapList
对象。直接打印ht_list
将调用draw()
具有默认设置的方法。通过显式调用draw()
方法,您可以对热图列表进行更多控制。
ht_list = ht1 + ht2 + ht3
class(ht_list)
## [1] "HeatmapList"
## attr(,"package")
## [1] "ComplexHeatmap"
您可以将任意数量的热图附加到热图列表中。您也可以将热图列表附加到热图列表。
# code only for demonstration
ht1 + ht_list
ht_list + ht1
ht_list + ht_list
当用户希望通过for
循环构建热图列表时,NULL
可以添加到热图列表中。
# code only for demonstration
ht_list = NULL ## Heatmap(...) + NULL gives you a HeatmapList object
for(s in sth) {
ht_list = ht_list + Heatmap(...)
}
您还可以向热图列表中添加热图注释,后续介绍。
4.1 标题
热图列表也有标题,就像覆盖所有热图的全局标题。row_title
和column_title
应该在draw()
函数中设置。
从以下示例中,我们为每个热图设置了不同的颜色以使其可区分。
col_rnorm = colorRamp2(c(-3, 0, 3), c("green", "white", "red"))
col_runif = colorRamp2(c(0, 3), c("white", "orange"))
col_letters = c("a" = "pink", "b" = "purple", "c" = "blue")
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm,
row_title = "Heatmap 1", column_title = "Heatmap 1")
ht2 = Heatmap(mat2, name = "runif", col = col_runif,
row_title = "Heatmap 2", column_title = "Heatmap 2")
ht3 = Heatmap(le, name = "letters", col = col_letters)
ht_list = ht1 + ht2 + ht3
draw(ht_list, row_title = "Three heatmaps, row title", row_title_gp = gpar(col = "red"),
column_title = "Three heatmaps, column title", column_title_gp = gpar(fontsize = 16))
拓展 可以用gt_render()
来构造复杂的文本。
4.2 热图的大小
某些热图的宽度可以设置为绝对单位。注意width
控制热图主体的宽度。
ht2 = Heatmap(mat2, name = "runif", col = col_runif, width = unit(4, "cm"))
ht3 = Heatmap(le, name = "letters", col = col_letters, width = unit(5, "mm"))
ht1 + ht2 + ht3
所有热图的宽度都可以设置为绝对单位。
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm, width = unit(4, "cm"))
ht2 = Heatmap(mat2, name = "runif", col = col_runif, width = unit(6, "cm"))
ht3 = Heatmap(le, name = "letters", col = col_letters, width = unit(1, "cm"))
ht1 + ht2 + ht3
如果width
是数字,则将其转换为null
单位。
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm, width = 6)
ht2 = Heatmap(mat2, name = "runif", col = col_runif, width = 4)
ht3 = Heatmap(le, name = "letters", col = col_letters, width = 1)
ht1 + ht2 + ht3
heatmap_width
也可以控制热图的宽度,但它是热图主体加上热图组件的总宽度。
4.3 热图之间的差距
ht_gap
控制热图之间的空间。该值可以是单个单位或单位向量。
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm)
ht2 = Heatmap(mat2, name = "runif", col = col_runif)
ht3 = Heatmap(le, name = "letters", col = col_letters)
ht_list = ht1 + ht2 + ht3
draw(ht_list, ht_gap = unit(1, "cm"))
draw(ht_list, ht_gap = unit(c(3, 10), "mm"))
4.4 主热图自动调整
热图列表中总是有一个主热图来控制全局行排序。所有其它热图都会根据主热图中的设置自动调整。对于这些非主热图,则进行如下调整:
- 不执行行聚类,它们都采用主热图的行排序。
- 行标题被删除。
- 如果主热图按行拆分,所有其他热图也将按与主热图相同的级别拆分。
- 主热图的高度作为所有热图的高度。
默认情况下,第一个热图被作为主热图。
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm, row_km = 2)
ht2 = Heatmap(mat2, name = "runif", col = col_runif)
ht3 = Heatmap(le, name = "letters", col = col_letters)
ht2 + ht1 + ht3 # ht2 is the main heatmap and row_km in ht1 is ignored
主热图可以通过main_heatmap
参数指定。该值可以是数字索引或热图的名称(需要在创建Heatmap
对象时设置热图名称)。在下面的示例中,虽然ht1
是第二个热图,但我们可以将其设置为主热图。
ht_list = ht2 + ht1 + ht3
draw(ht_list, main_heatmap = "rnorm")
默认情况下,树状图和行标题绘制在主热图旁边,只是为了强调聚类或拆分是从主热图而不是其他热图计算的。但是,主热图的树状图和行标题的位置可以由draw()
函数中row_dend_side
和row_sub_title_side
控制 。
ht_list = ht2 + ht1 + ht3
draw(ht_list, main_heatmap = "rnorm", row_dend_side = "right", row_sub_title_side = "left")
类似地,如果主热图中没有行聚类,则所有其他热图也不会聚类。
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm, cluster_rows = FALSE)
ht2 = Heatmap(mat2, name = "runif", col = col_runif)
ht3 = Heatmap(le, name = "letters", col = col_letters)
ht1 + ht2 + ht3
您可能已经观察到,热图之间的所有行名称都从图中删除。您可以通过设置来显示它们auto_adjust = FALSE
。
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm)
ht2 = Heatmap(mat2, name = "runif", col = col_runif)
ht3 = Heatmap(le, name = "letters", col = col_letters)
ht_list = ht1 + ht2 + ht3
draw(ht_list, auto_adjust = FALSE)
4.5 draw()函数中控制主热图
主热图的设置可以在主Heatmap()
函数中控制。为方便起见,draw()
可以直接设置热图的行属性. 如果设置了draw()
这些属性中的一些,主热图中的相应设置将被Heatmap()
覆盖。
在draw()
功能上,以下是控制所有热图的行顺序主要热图设置。
cluster_rows
clustering_distance_rows
clustering_method_rows
row_dend_width
show_row_dend
row_dend_reorder
row_dend_gp
row_order
以下控制行切片设置。
row_gap
row_km
row_km_repeats
row_split
以下控制热图高度设置。
height
heatmap_height
在以下示例中,在draw()
中的row_km = 2, cluster_rows = FALSE
将覆盖 ht1
的设置。
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm, row_km = 2, cluster_rows = FALSE)
ht2 = Heatmap(mat2, name = "runif", col = col_runif)
ht3 = Heatmap(le, name = "letters", col = col_letters)
ht_list = ht1 + ht2 + ht3
draw(ht_list, row_km = 1, row_split = le, cluster_rows = TRUE)
4.6 作为组件调整注释
如果热图列表中的一些热图有注释,在大多数情况下,不同热图的热图注释的高度是不同的。热图注释会自动调整,这个调整也会涉及到树状图的调整。
通常,简单注释的大小不会在调整中发生变化。在以下示例中,调整了第二个热图的树状图。请注意,您仍然可以通过设置anno_simple_size
inHeatmapAnnotation()
或全局设置来更改简单注释的大小ht_opt$anno_simple_size
。
ha1 = HeatmapAnnotation(foo1 = 1:10, annotation_name_side = "left")
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm, top_annotation = ha1)
ht2 = Heatmap(mat2, name = "runif", col = col_runif)
ht3 = Heatmap(le, name = "letters", col = col_letters)
ht1 + ht2 + ht3
如果前两个热图都有注释,由于简单注释的大小保持不变,所以会调整复杂注释的大小,使两个热图注释的总高度相同。
ha1 = HeatmapAnnotation(foo1 = 1:10, bar1 = anno_points(1:10),
annotation_name_side = "left")
ha2 = HeatmapAnnotation(bar2 = anno_barplot(1:10))
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm, top_annotation = ha1)
ht2 = Heatmap(mat2, name = "runif", col = col_runif, top_annotation = ha2)
ht3 = Heatmap(le, name = "letters", col = col_letters)
ht_list = ht1 + ht2 + ht3
draw(ht_list, ht_gap = unit(c(6, 2), "mm"))
同样,如果第一个热图只包含简单的注释,树状图将被调整。
ha1 = HeatmapAnnotation(foo1 = 1:10, annotation_name_side = "left")
ha2 = HeatmapAnnotation(bar2 = anno_barplot(1:10, height = unit(2, "cm")))
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm, top_annotation = ha1)
ht2 = Heatmap(mat2, name = "runif", col = col_runif, top_annotation = ha2)
ht3 = Heatmap(le, name = "letters", col = col_letters)
ht_list = ht1 + ht2 + ht3
draw(ht_list, ht_gap = unit(c(6, 2), "mm"))
如果两个热图只包含简单的注释但数量不等,则树状图将被调整。
ha1 = HeatmapAnnotation(foo1 = 1:10, annotation_name_side = "left")
ha2 = HeatmapAnnotation(bar2 = cbind(b1 = 1:10, b2 = 11:20, b3 = 21:30))
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm, top_annotation = ha1)
ht2 = Heatmap(mat2, name = "runif", col = col_runif, top_annotation = ha2)
ht3 = Heatmap(le, name = "letters", col = col_letters)
ht_list = ht1 + ht2 + ht3
draw(ht_list)
如果您还想自动调整简单注释的大小,请在每次HeatmapAnnotation()
调用simple_anno_size_adjust = TRUE
即可 。
如果第二个热图没有底部注释,则第二个热图的列名称将调整为直接放在热图主体下方。
ha1 = HeatmapAnnotation(foo1 = 1:10, bar1 = anno_points(1:10), annotation_name_side = "left")
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm, bottom_annotation = ha1)
ht2 = Heatmap(mat2, name = "runif", col = col_runif)
ht3 = Heatmap(le, name = "letters", col = col_letters)
ht_list = ht1 + ht2 + ht3
draw(ht_list)
4.7 注释连接
行注释可以连接到水平热图列表,而不仅仅是热图的一个组件。请参阅以下非常简单的示例。
ha1 = rowAnnotation(foo = 1:12, bar = anno_barplot(1:12, width = unit(4, "cm")))
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm, row_km = 2)
ht1 + ha1
foo
和bar
注释可以用两个分离的 rowAnnotation()
被注释。
Heatmap(mat1, name = "rnorm", col = col_rnorm, row_km = 2) +
rowAnnotation(foo = 1:12) +
rowAnnotation(bar = anno_barplot(1:12, width = unit(4, "cm")))
那我们该如何恢复mat1
行名称呢?有如下两种方法。
- 您可以将行注释设置为热图的“右注释”,并将热图放在最后一个。
Heatmap(mat1, name = "rnorm", col = col_rnorm, row_km = 2, right_annotation = ha1)
# or using the previous variable
# attach_annotation(ht1, ha1, side = "right")
- 通过添加文本注释来添加行名称:
ht1 + ha1 + rowAnnotation(rn = anno_text(rownames(mat1),
location = unit(0, "npc"), just = "left"))
热图和行注释基本上可以任意连接。
rowAnnotation(foo = 1:12) +
Heatmap(mat1, name = "rnorm", col = col_rnorm, row_km = 2) +
rowAnnotation(bar = anno_barplot(1:12, width = unit(4, "cm"))) +
Heatmap(mat2, name = "runif", col = col_runif)
如同前几节所讲的,行注释也可以是热图组件作为左注释或右注释。后续将会讨论了行注释作为独立注释和热图组件的区别。
4.8 只连接注释
连接可以在没有任何热图的情况下完成。
rowAnnotation(foo = 1:12) +
rowAnnotation(bar = anno_barplot(1:12, width = unit(4, "cm")))
如果只有一个HeatmapAnnotation
对象,则必须与NULL
连接。
rowAnnotation(bar = anno_barplot(1:12, width = unit(4, "cm"))) + NULL
注释列表其实也是一个HeatmapList
对象。
anno_list = rowAnnotation(foo = 1:12) +
rowAnnotation(bar = anno_barplot(1:12, width = unit(4, "cm")))
class(anno_list)
## [1] "HeatmapList"
## attr(,"package")
## [1] "ComplexHeatmap"
因此,您可以将draw()
函数的一些功能用于注释列表,例如行拆分。
draw(anno_list, row_split = rep(c("A", "B"), each = 6))
在拓展知识中,展示了如何使用注释列表来可视化多个汇总统计信息。
4.9 垂直串联
热图和注释(现在是列注释)可以由%v%
进行垂直连接。所有相关的设置和调整都与水平串联非常相似。请检查以下示例。
mat1t = t(mat1)
mat2t = t(mat2)
ht1 = Heatmap(mat1t, name = "rnorm", col = col_rnorm, row_title = "rnorm")
ht2 = Heatmap(mat2t, name = "runif", col = col_runif, row_title = "runif")
ht3 = Heatmap(rbind(letters = le), name = "letters", col = col_letters)
ht_list = ht1 %v% ht2 %v% ht3
draw(ht_list)
draw(ht_list, column_km = 2)
ha = HeatmapAnnotation(foo = anno_barplot(1:12, height = unit(2, "cm")))
ht_list = ht1 %v% ha %v% ht2 %v% ht3
draw(ht_list, column_km = 2)
ht1 = Heatmap(mat1t, name = "rnorm", col = col_rnorm, row_km = 2)
ht2 = Heatmap(mat2t, name = "runif", col = col_runif, row_km = 2)
ht3 = Heatmap(rbind(letters = le), name = "letters", col = col_letters)
ha = HeatmapAnnotation(foo = anno_barplot(1:12, height = unit(2, "cm")))
ht_list = ht1 %v% ha %v% ht2 %v% ht3
draw(ht_list, column_km = 2)
对于垂直热图列表,现在行注释(right_annotation
和left_annotation
)应该是热图组件,它们的调整就像水平热图列表的列注释一样。
ht1 = Heatmap(mat1t, name = "rnorm", col = col_rnorm, row_km = 2,
left_annotation = rowAnnotation(foo1 = 1:10, bar1 = anno_barplot(1:10)))
ha = HeatmapAnnotation(foo = anno_barplot(1:12, height = unit(2, "cm"),
axis_param = list(side = "right")))
ht2 = Heatmap(mat2t, name = "runif", col = col_runif, row_km = 2,
left_annotation = rowAnnotation(foo2 = 1:10))
ht3 = Heatmap(rbind(letters = le), name = "letters", col = col_letters)
ht_list = ht1 %v% ha %v% ht2 %v% ht3
draw(ht_list, column_km = 2)
由于rowAnnotation()
允许任意数量的注释,上面显示的方式是同时水平和垂直扩展热图列表的唯一方法。
4.10 热图列表的子集
类似于Heatmap
子集对象,热图列表也可以通过提供行索引和列索引来子集化。对于水平热图列表,行索引对应所有热图和注释中的行,而列索引仅对应热图和注释的一个子集。对于垂直热图列表,情况正好相反。
下面我们以水平热图列表为例。
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm,
left_annotation = rowAnnotation(foo1 = 1:12, bar1 = anno_points(1:12)))
ht2 = Heatmap(mat2, name = "runif", col = col_runif)
ha = rowAnnotation(foo2 = anno_barplot(1:12), bar2 = 12:1)
ht_list = ht1 + ht2 + ha
names(ht_list)
## [1] "rnorm" "runif" "foo2" "bar2"
ht_list[1:6, c("rnorm", "bar2")]
foo1
和bar
是rnorm
热图的组成部分,因此不能在子集函数中选择它们,而foo2
和bar2
是独立的行注释,可以选择它们的子集。
4.11 绘制热图列表
在交互式R会话中直接进入HeatmapList对象show()
调用draw()
内部调用该方法的方法。当你进入对象后没有绘图时,你应该明确使用draw()
:
# code only for demonstration
draw(ht_list, ...)
4.12 获取顺序和树状图
row_order()
, column_order()
,row_dend()
和column_dend()
可用于从热图列表中检索相应的信息。需要将这些函数应用于draw()
。
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm)
ht2 = Heatmap(mat2, name = "runif", col = col_runif)
ht_list = ht1 + ht2
ht_list = draw(ht_list)
row_order(ht_list)
## [1] 10 4 8 2 1 12 11 6 7 3 9 5
column_order(ht_list)
## $rnorm
## [1] 5 2 7 6 10 1 9 8 4 3
##
## $runif
## [1] 4 10 2 5 7 6 1 3 8 9
如果行或列被拆分,返回的值也将是一个列表。
ht1 = Heatmap(mat1, name = "rnorm", col = col_rnorm)
ht2 = Heatmap(mat2, name = "runif", col = col_runif, column_km = 2)
ht_list = ht1 + ht2
ht_list = draw(ht_list, row_km = 2)
row_order(ht_list)
## $`1`
## [1] 7 3 9 5
##
## $`2`
## [1] 10 4 8 2 1 12 11 6
column_order(ht_list)
## $rnorm
## $rnorm[[1]]
## [1] 5 2 7 6 10 1 9 8 4 3
##
##
## $runif
## $runif$`2`
## [1] 4 10 2 5
##
## $runif$`1`
## [1] 7 6 1 3 8 9
您可以为列顺序指定某个热图。
column_order(ht_list, name = "runif")
## $`2`
## [1] 4 10 2 5
##
## $`1`
## [1] 7 6 1 3 8 9
提取树状图的逻辑相同,垂直热图列表的逻辑也相同,可以参照水平热图列表。
4.13 全局参数修改
ht_opt()
是一个全局控制参数的一些选项函数。您可以通过此全局函数同时为所有热图/注释设置一些参数。请注意,您应该将其放在热图代码之前,并在绘制热图后重置所有选项值,避免影响下一个热图。
ht_opt
## Option Value
## -------------------------:----------
## heatmap_row_names_gp NULL
## heatmap_column_names_gp NULL
## heatmap_row_title_gp NULL
## heatmap_column_title_gp NULL
## legend_title_gp NULL
## legend_title_position NULL
## legend_labels_gp NULL
## legend_grid_height NULL
## legend_grid_width NULL
## legend_border NULL
## legend_gap 4mm, 4mm
## heatmap_border NULL
## annotation_border NULL
## fast_hclust FALSE
## show_parent_dend_line TRUE
## verbose FALSE
## message TRUE
## show_vp FALSE
## simple_anno_size 5mm
## DENDROGRAM_PADDING 0.5mm
## DIMNAME_PADDING 1mm
## TITLE_PADDING NULL
## COLUMN_ANNO_PADDING 1mm
## ROW_ANNO_PADDING 1mm
## HEATMAP_LEGEND_PADDING 2mm
## ANNOTATION_LEGEND_PADDING 2mm
## save_last FALSE
## validate_names TRUE
有以下参数来控制所有热图:
-
heatmap_row_names_gp
:row_names_gp
全部设置Heatmap()
。 -
heatmap_column_names_gp
:column_names_gp
全部设置Heatmap()
。 -
heatmap_row_title_gp
:row_title_gp
全部设置Heatmap()
。 -
heatmap_column_title_gp
:column_title_gp
全部设置Heatmap()
。 -
heatmap_border
:border
全部设置Heatmap()
。
以下参数控制图例:
-
legend_title_gp
:title_gp
在所有热图图例和注释图例中设置。 -
legend_title_position
:title_position
在所有热图图例和注释图例中设置。 -
legend_labels_gp
:labels_gp
在所有热图图例和注释图例中设置。 -
legend_grid_width
:grid_width
在所有热图图例和注释图例中设置。 -
legend_grid_height
:grid_height
在所有热图图例和注释图例中设置。 -
legend_border
:border
在所有热图图例和注释图例中设置。
以下参数控制热图注释:
-
annotation_border
:border
全部设置HeatmapAnnotation()
。 -
anno_simple_size
: 设置简单注释的大小。
以下参数控制热图组件之间的空间:
-
DENDROGRAM_PADDING
:树状图和热图主体之间的空间。 -
DIMNAME_PADDING
:行/列名称和热图主体之间的空格。 -
TITLE_PADDING
:行/列标题和热图正文之间的空间。 -
COLUMN_ANNO_PADDING
:列注释和热图主体之间的空间。 -
ROW_ANNO_PADDING
:行注释和热图主体之间的空间。
其他参数:
-
fast_hclust
: 是否用于fastcluster::hclust()
加速聚类? -
show_parent_dend_line
: 分割热图时,是否添加虚线来标记父树状图和子树状图?
您可以通过传统方式(如base::options()
)或$
运算符获取或设置选项值 :
ht_opt("heatmap_row_names_gp")
ht_opt$heatmap_row_names_gp
# to set option values
ht_opt("heatmap_row_names_gp" = gpar(fontsize = 8))
ht_opt$heatmap_row_names_gp = gpar(fontsize = 8)
通过以下方式重置为默认值:
ht_opt(RESET = TRUE)
下面的例子展示了全局控制一些图形参数。
ht_opt(heatmap_column_names_gp = gpar(fontface = "italic"),
heatmap_column_title_gp = gpar(fontsize = 10),
legend_border = "black",
heatmap_border = TRUE,
annotation_border = TRUE
)
ht1 = Heatmap(mat1, name = "ht1", column_title = "Heatmap 1",
top_annotation = HeatmapAnnotation(foo = 1:10))
ht2 = Heatmap(mat2, name = "ht2", column_title = "Heatmap 2",
top_annotation = HeatmapAnnotation(bar = 1:10))
ht1 + ht2
ht_opt(RESET = TRUE)
这些全局参数也可以在draw()
函数中设置可以临时改变全局参数,绘制完成后重新设置回来。请查看draw,HeatmapList-method
的帮助页面。
4.14 调整注释产生的空白
热图注释可能有注释名称和轴,在最终布局中排列热图组件时也会考虑这些空间。有时,这种调整结果并不美观,您可能会在图中看到不必要的空白区域。
一种情况是对于没有行名称的矩阵,热图右侧的空间由注释名称的大小决定,这会导致热图和图例之间出现空白。此外,热图列表级别的行标题绘制在注释轴的左侧,如果没有行树状图,则会提供空白区域。
adjust_annotation_extension
控制是否考虑布局的注释名称和轴的空间。比较以下两个图。
m = matrix(rnorm(100), 10)
ht = Heatmap(m, name = "mat",
top_annotation = HeatmapAnnotation(foo = anno_points(1:10)),
show_row_dend = FALSE)
draw(ht, row_title = "fooooooooooo", adjust_annotation_extension = TRUE, # default
column_title = "adjust_annotation_extension = TRUE")
draw(ht, row_title = "fooooooooooo", adjust_annotation_extension = FALSE,
column_title = "adjust_annotation_extension = FALSE")
另一种部分解决空间问题的方法是将注释名称向左移动并使用 heamtap 级别的行标题。
Heatmap(m, name = "mat",
top_annotation = HeatmapAnnotation(foo = anno_points(1:10),
annotation_name_side = "left"),
row_title = "fooooooooooo",
show_row_dend = FALSE)
但是,有时也需要对注释进行这种调整,例如当热图非常短时:
ht = Heatmap(m, name = "mat",
top_annotation = HeatmapAnnotation(foo = anno_points(1:10)),
show_row_dend = FALSE)
draw(ht, row_title = "fooooooooooo", adjust_annotation_extension = TRUE,
column_title = "adjust_annotation_extension = TRUE")
因此,我们将其adjust_annotation_extension
设置TRUE
为默认值,用户可以根据具体场景进行配置。
4.15 手动图形周围空间
ComplexHeatmap的布局并不完美,仍有可能将某些文本绘制到绘图区域之外。在这种情况下,您可以在draw()
函数中手动设置参数padding
以增加最终绘图周围的空白区域。
padding
的值应该是4个长度的单位向量。这四个值分别对应底部、左侧、顶部和右侧的空间。
下面的例子不是一个完美的例子,因为行名的最大宽度可以通过max_row_name_width
参数控制,但我们仍然可以用它来演示padding
.
m2 = m
rownames(m2) = paste0("R", 1:10)
rownames(m2)[1] = "a long long long long long row name"
ht = Heatmap(m2, name = "mat", row_names_side = "left", show_row_dend = FALSE)
draw(ht, padding = unit(c(2, 20, 2, 2), "mm")) ## see right heatmap in following