ComplexHeatmap 之 Heatmap List 续(一)
感谢老俊俊的大力支持。我们会每日跟新,欢迎您关注老俊俊的生信笔记。

点击上方,关于我们

AUTUMN
一夜梧桐一报秋
继续讲解热图列表部分。
6、调整注释
如果热图列表中的一些热图有注释,在大多数情况下,不同热图的热图注释的高度是不同的。热图标注有自动调整,这个调整也会涉及到树状图的调整。
通常, 简单注释
的大小不会在调整中发生变化。在以下示例中,调整了第二个热图的树状图。请注意,仍然可以通过在 HeatmapAnnotation()
中设置 anno_simple_size 或全局设置 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)

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 的 行名称。有两种方法:
1、您可以将行注释设置为热图的 “right annotation” ,并将热图放在最后一个:
Heatmap(mat1, name = "rnorm", col = col_rnorm, row_km = 2, right_annotation = ha1)
# or using the previous variable
# attach_annotation(ht1, ha1, side = "right")

2、通过添加文本注释来添加行名称:
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)

行注释也可以是热图组件作为左注释或右注释。
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))

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)

由于 row_Annotation()
允许 任意数量的注释,因此上面显示的方式是同时 水平 和 垂直 扩展热图列表的唯一方法。
10、从热图列表提取子集
可以通过提供 行索引 和 列索引 来对热图列表进行子集化。对于水平热图列表,行索引对应所有热图和注释中的行,而列索引仅对应热图和注释的一个子集。对于垂直热图列表,情况正好相反。
下面我们以水平热图列表为例:
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 是 heatmap rnorm 的组成部分,所以不能在 subset 函数中选择,而 foo2 和 bar2 是独立的行注解,可以选择取它们的子集。

未完待续。
收官!
代码 我上传到 QQ 群 老俊俊生信交流群
文件夹里。欢迎加入。加我微信我也拉你进 微信群聊 老俊俊生信交流群
哦。
群二维码:

老俊俊微信:
知识星球:
所以今天你学习了吗?
欢迎小伙伴留言评论!
今天的分享就到这里了,敬请期待下一篇!
最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!
如果觉得对您帮助很大,赏杯快乐水喝喝吧!
往期回顾
◀ComplexHeatmap 之 Heatmap List
◀ComplexHeatmap 之 Heatmap Annotations 续(三)
◀ComplexHeatmap 之 Heatmap Annotations 续(二)
◀ComplexHeatmap 之 Heatmap Annotations 续(一)
◀ComplexHeatmap 之 Heatmap Annotations
◀ComplexHeatmap 之 A Single Heatmap 续(二)
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!