ComplexHeatmap复杂热图绘制学习——4.热图列表

热图列表

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
image

在默认模式下,第二个热图中的树状图将被删除,行顺序将与第一个相同。前两个热图的行名称也被删除。

连接的返回值是一个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_titlecolumn_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))
image

拓展 可以用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
image

所有热图的宽度都可以设置为绝对单位。

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
image

如果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
image

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"))
image
draw(ht_list, ht_gap = unit(c(3, 10), "mm"))
image

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
image

主热图可以通过main_heatmap参数指定。该值可以是数字索引或热图的名称(需要在创建Heatmap对象时设置热图名称)。在下面的示例中,虽然ht1是第二个热图,但我们可以将其设置为主热图。

ht_list = ht2 + ht1 + ht3
draw(ht_list, main_heatmap = "rnorm")
image

默认情况下,树状图和行标题绘制在主热图旁边,只是为了强调聚类或拆分是从主热图而不是其他热图计算的。但是,主热图的树状图和行标题的位置可以由draw()函数中row_dend_siderow_sub_title_side控制 。

ht_list = ht2 + ht1 + ht3
draw(ht_list, main_heatmap = "rnorm", row_dend_side = "right", row_sub_title_side = "left")
image

类似地,如果主热图中没有行聚类,则所有其他热图也不会聚类。

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
image

您可能已经观察到,热图之间的所有行名称都从图中删除。您可以通过设置来显示它们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)
image

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)
image

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
image

如果前两个热图都有注释,由于简单注释的大小保持不变,所以会调整复杂注释的大小,使两个热图注释的总高度相同。

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"))
image

同样,如果第一个热图只包含简单的注释,树状图将被调整。

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"))
image.png

如果两个热图只包含简单的注释但数量不等,则树状图将被调整。

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)
image

如果您还想自动调整简单注释的大小,请在每次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)
image

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
image

foobar注释可以用两个分离的 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")))
image.png

那我们该如何恢复mat1行名称呢?有如下两种方法。

  1. 您可以将行注释设置为热图的“右注释”,并将热图放在最后一个。
Heatmap(mat1, name = "rnorm", col = col_rnorm, row_km = 2, right_annotation = ha1)
image
# or using the previous variable
# attach_annotation(ht1, ha1, side = "right")
  1. 通过添加文本注释来添加行名称:
ht1 + ha1 + rowAnnotation(rn = anno_text(rownames(mat1), 
    location = unit(0, "npc"), just = "left"))
image

热图和行注释基本上可以任意连接。

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)
image

如同前几节所讲的,行注释也可以是热图组件作为左注释或右注释。后续将会讨论了行注释作为独立注释和热图组件的区别。

4.8 只连接注释

连接可以在没有任何热图的情况下完成。

rowAnnotation(foo = 1:12) +
    rowAnnotation(bar = anno_barplot(1:12, width = unit(4, "cm")))
image.png

如果只有一个HeatmapAnnotation对象,则必须与NULL连接。

rowAnnotation(bar = anno_barplot(1:12, width = unit(4, "cm"))) + NULL
image

注释列表其实也是一个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))
image

在拓展知识中,展示了如何使用注释列表来可视化多个汇总统计信息。

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)
image
draw(ht_list, column_km = 2)
image
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)
image
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)
image

对于垂直热图列表,现在行注释(right_annotationleft_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)
image

由于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")]
image

foo1barrnorm热图的组成部分,因此不能在子集函数中选择它们,而foo2bar2是独立的行注释,可以选择它们的子集。

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
image
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")
image

另一种部分解决空间问题的方法是将注释名称向左移动并使用 heamtap 级别的行标题。

Heatmap(m, name = "mat",
    top_annotation = HeatmapAnnotation(foo = anno_points(1:10),
        annotation_name_side = "left"),
    row_title = "fooooooooooo",
    show_row_dend = FALSE)
image

但是,有时也需要对注释进行这种调整,例如当热图非常短时:

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")
image

因此,我们将其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
image

你可能感兴趣的:(ComplexHeatmap复杂热图绘制学习——4.热图列表)