ComplexHeatmap 之 Heatmap Annotations 续(三)
点击上方关注我们
道阻且长
本期结束热图的注释系列。
15、标记注释
有时热图中有 很多行或列 ,我们想标记其中的一些。anno_mark()
用于标记行或列的子集并用 线连接到标签 。
anno_mark()
至少需要两个参数,其中 at 是原始矩阵的索引,labels 是相应的文本:
m = matrix(rnorm(1000), nrow = 100)
rownames(m) = 1:100
ha = rowAnnotation(foo = anno_mark(at = c(1:4, 20, 60, 97:100), labels = month.name[1:10]))
Heatmap(m, name = "mat", cluster_rows = FALSE, right_annotation = ha,
row_names_side = "left", row_names_gp = gpar(fontsize = 4))
Heatmap(m, name = "mat", cluster_rows = FALSE, right_annotation = ha,
row_names_side = "left", row_names_gp = gpar(fontsize = 4), row_km = 4)
16、汇总注释
有一个特殊的注释 anno_summary()
只适用于 一列热图 或 一行热图(我们可以说热图只包含一个向量)。它显示了热图中向量的 汇总统计信息。如果相应的向量是离散的,则汇总注释显示为 条形图
,如果向量是连续的,则摘要注释是 箱线图
。拆分热图时始终使用 anno_summary()
,以便可以比较热图切片之间的统计数据。
第一个示例显示了 离散热图
的汇总注释。条形图显示每个切片中每个级别的比例。热图切片的高度已经可以看到绝对值:
ha = HeatmapAnnotation(summary = anno_summary(height = unit(4, "cm")))
v = sample(letters[1:2], 50, replace = TRUE)
split = sample(letters[1:2], 50, replace = TRUE)
Heatmap(v, name = "mat", col = c("a" = "red", "b" = "blue"),
top_annotation = ha, width = unit(2, "cm"), row_split = split)
第二个示例显示了 连续型
热图的汇总注释。图形参数应该由 gp
手动设置。后面介绍创建和添加箱线图的图例:
ha = HeatmapAnnotation(summary = anno_summary(gp = gpar(fill = 2:3),
height = unit(4, "cm")))
v = rnorm(50)
Heatmap(v, name = "mat", top_annotation = ha, width = unit(2, "cm"),
row_split = split)
通常我们不会绘制这个单列热图。它总是与其他 “主要热图”
结合在一起。例如。带有单列热图的基因表达矩阵,显示该基因是蛋白质编码基因还是 linc-RNA 基因。
在下文中,我们展示了一个带有两个单列热图的 “主热图” 的简单示例。热图连接的功能将在后面介绍:
m = matrix(rnorm(50*10), nrow = 50)
ht_list = Heatmap(m, name = "main_matrix")
ha = HeatmapAnnotation(summary = anno_summary(height = unit(3, "cm")))
v = sample(letters[1:2], 50, replace = TRUE)
ht_list = ht_list + Heatmap(v, name = "mat1", top_annotation = ha, width = unit(1, "cm"))
ha = HeatmapAnnotation(summary = anno_summary(gp = gpar(fill = 2:3),
height = unit(3, "cm")))
v = rnorm(50)
ht_list = ht_list + Heatmap(v, name = "mat2", top_annotation = ha, width = unit(1, "cm"))
split = sample(letters[1:2], 50, replace = TRUE)
lgd_boxplot = Legend(labels = c("group a", "group b"), title = "group",
legend_gp = gpar(fill = c("red", "blue")))
draw(ht_list, row_split = split, ht_gap = unit(5, "mm"),
heatmap_legend_list = list(lgd_boxplot))
17、缩放、连接注释
anno_mark()
将热图上的 单行或单列 连接到标签,下一个注释函数 anno_link()
将 行或列的子集 连接到可以添加更全面图形的绘图区域。请参阅以下示例,其中我们为每个行组制作箱线图:
set.seed(123)
m = matrix(rnorm(100*10), nrow = 100)
subgroup = sample(letters[1:3], 100, replace = TRUE, prob = c(1, 5, 10))
rg = range(m)
panel_fun = function(index, nm) {
pushViewport(viewport(xscale = rg, yscale = c(0, 2)))
grid.rect()
grid.xaxis(gp = gpar(fontsize = 8))
grid.boxplot(m[index, ], pos = 1, direction = "horizontal")
popViewport()
}
anno = anno_link(align_to = subgroup, which = "row", panel_fun = panel_fun,
size = unit(2, "cm"), gap = unit(1, "cm"), width = unit(4, "cm"))
Heatmap(m, name = "mat", right_annotation = rowAnnotation(foo = anno), row_split = subgroup)
anno_zoom()
的重要参数是:
align_to
:它定义了绘图区域(或框)如何对应于热图中的行或列。如果该值是一个索引列表,则每个框对应于列表中一个向量中带有索引的行或列。如果该值是与热图中的行或列长度相同的分类变量(例如因子或字符向量),则每个框对应于分类变量中每个级别的行/列。panel_fun
:自定义函数,定义如何在框中绘制图形。该函数必须有一个索引参数,它是框对应的行/列的索引。它可以有第二个参数 nm,它是热图中所选部分的 “名称”。如果将 nm 指定为分类变量或带有名称的列表,则 nm 的相应值来自 align_to。size
:盒子的大小。它们可以是纯数字,它们被视为热图总高度/宽度的相对分数。size 的值也可以是绝对单位。gap
:盒子之间的间隙。它应该是一个 unit 对象。
anno_link()
也适用于列注释。
使用 anno_link() 的另一个示例是将词云列表与行组对应,请参阅博客文章词云作为热图注释以了解如何使用 anno_link() 实现它。
18、多个注释
18.1、常规设置:
如前所述,要在 HeatmapAnnotation()
中放置多个注释,只需将它们指定为 名称-值 对即可。在 HeatmapAnnotation()
中,有一些参数控制多个注释。对于这些参数,它们被指定为长度与注释数量相同的向量,或具有注释子集的命名向量。
被指定为 向量 、矩阵 和 数据框 的简单注释将自动在热图上有图例。show_legend
控制是否为它们绘制图例。请注意,如果 show_legend 是向量,则 show_legend 的值应为以下格式之一:
长度与简单注释数量相同的逻辑向量。 一个与 totla 注释数量相同长度的逻辑向量。复杂注释的值将被忽略。 用于控制简单注释子集的命名向量。
ha = HeatmapAnnotation(foo = 1:10,
bar = cbind(1:10, 10:1),
pt = anno_points(1:10),
show_legend = c("bar" = FALSE)
)
Heatmap(matrix(rnorm(100), 10), name = "mat", top_annotation = ha)
gp
控制简单注释的图形参数(填充除外),例如注释网格的边框:
ha = HeatmapAnnotation(foo = 1:10,
bar = cbind(1:10, 10:1),
pt = anno_points(1:10),
gp = gpar(col = "red")
)
border
控制每个注释的边框。show_annotation_name
控制是否显示注释名称。如前所述,该值可以是单个值、向量或命名向量:
ha = HeatmapAnnotation(foo = 1:10,
bar = cbind(1:10, 10:1),
pt = anno_points(1:10),
show_annotation_name = c(bar = FALSE), # only turn off `bar`
border = c(foo = TRUE) # turn on foo
)
annotation_name_gp
、annotation_name_offset
、annotation_name_side
和 annotation_name_rot
控制注释名称的样式和位置。后三个可以指定为命名向量。如果将 annotation_name_offset 指定为命名向量,则可以将其指定为字符而不是单元对象:annotation_name_offset = c(foo = "1cm")
。
gap
控制每两个相邻注释之间的空间。该值可以是单个单位或单位向量:
ha = HeatmapAnnotation(foo = 1:10,
bar = cbind(1:10, 10:1),
pt = anno_points(1:10),
gap = unit(2, "mm"))
ha = HeatmapAnnotation(foo = 1:10,
bar = cbind(1:10, 10:1),
pt = anno_points(1:10),
gap = unit(c(2, 10), "mm"))
18.2、注释大小:
height
、width
、annotation_height
和 annotation_width
控制完整热图注释的高度或宽度。通常你不需要设置它们,因为所有单个注释都有固定的高度/宽度,整个热图注释的最终高度/宽度是它们的总和。调整这些值的大小将涉及相当复杂的调整,具体取决于它是简单注释还是复杂注释。调整热图列表时也会调整热图注释的大小。在下面的例子中,我们以注释为例,展示了一些调整大小的场景:
默认值:
# foo: 1cm, bar: 5mm, pt: 1cm
ha = HeatmapAnnotation(foo = cbind(1:10, 10:1),
bar = 1:10,
pt = anno_points(1:10))
如果设置了高度,则简单注释的大小不会改变,而只调整复杂注释。如果有多个复杂的注释,则按照其原始大小的比例进行调整:
# foo: 1cm, bar: 5mm, pt: 4.5cm
ha = HeatmapAnnotation(foo = cbind(1:10, 10:1),
bar = 1:10,
pt = anno_points(1:10),
height = unit(6, "cm"))
simple_anno_size
控制所有简单注释的高度。回想一下 ht_opt$simple_anno_size
可以设置为全局控制所有热图中简单注释的大小:
# foo: 2cm, bar:1cm, pt: 3cm
ha = HeatmapAnnotation(foo = cbind(1:10, 10:1),
bar = 1:10,
pt = anno_points(1:10),
simple_anno_size = unit(1, "cm"), height = unit(6, "cm"))
如果 annotation_height
设置为绝对单位向量,则所有三个注释的高度都会相应调整:
# foo: 1cm, bar: 2cm, pt: 3cm
ha = HeatmapAnnotation(foo = cbind(1:10, 10:1),
bar = 1:10,
pt = anno_points(1:10),
annotation_height = unit(1:3, "cm"))
如果 annotation_height
设置为纯数字,作为注释的相对比例,则高度也应设置为绝对单位,并通过比例调整每个单个注释的大小:
# foo: 1cm, bar: 2cm, pt: 3cm
ha = HeatmapAnnotation(foo = cbind(1:10, 10:1),
bar = 1:10,
pt = anno_points(1:10),
annotation_height = 1:3, height = unit(6, "cm"))
annotation_height 可以与相对单位( null 空单位)和绝对单位混合使用:
# foo: 1.5cm, bar: 1.5cm, pt: 3cm
ha = HeatmapAnnotation(foo = cbind(1:10, 10:1),
bar = 1:10,
pt = anno_points(1:10),
annotation_height = unit(c(1, 1, 3), c("null", "null", "cm")), height = unit(6, "cm")
)
# foo: 2cm, bar: 1cm, pt: 3cm
ha = HeatmapAnnotation(foo = cbind(1:10, 10:1),
bar = 1:10,
pt = anno_points(1:10),
annotation_height = unit(c(2, 1, 3), c("cm", "null", "cm")), height = unit(6, "cm")
)
如果只有简单的注释,简单的设置高度不会改变高度:
# foo: 1cm, bar: 5mm
ha = HeatmapAnnotation(foo = cbind(1:10, 10:1),
bar = 1:10,
height = unit(6, "cm"))
除非 simple_anno_size_adjust
设置为 TRUE:
# foo: 4cm, bar: 2cm
ha = HeatmapAnnotation(foo = cbind(1:10, 10:1),
bar = 1:10,
height = unit(6, "cm"),
simple_anno_size_adjust = TRUE)
18.3、注释标签:
注释的替代标签可以通过 annotation_label
参数设置:
ha = HeatmapAnnotation(foo = 1:10,
bar = cbind(1:10, 10:1),
pt = anno_points(1:10),
annotation_label = c("Annotation_foo", "Annotation_bar", "Annotation_pt")
)
也可以使用复杂的文本设置注释标签:
ha = HeatmapAnnotation(foo = 1:10,
bar = cbind(1:10, 10:1),
pt = anno_points(1:10),
annotation_label = gt_render(
c("**Annotation**_<span style='color:red'>foo</span>",
"**Annotation**_<span style='color:blue'>bar</span>",
"**Annotation**_<span style='color:green'>pt</span>"),
gp = gpar(box_fill = "grey")
)
)
从 2.5.6 版本开始,可以配置注释名称的旋转:
ha = HeatmapAnnotation(foo = 1:10,
bar = cbind(1:10, 10:1),
pt = anno_points(1:10),
annotation_name_rot = 45
)
Heatmap(matrix(rnorm(100), 10), name = "mat", top_annotation = ha)
或在行上:
ha = rowAnnotation(foo = 1:10,
bar = cbind(1:10, 10:1),
pt = anno_points(1:10),
annotation_name_rot = 45
)
Heatmap(matrix(rnorm(100), 10), name = "mat", left_annotation = ha)
未完待续。
收官!
代码 我上传到 QQ 群 老俊俊生信交流群
文件夹里。欢迎加入。加我微信我也拉你进 微信群聊 老俊俊生信交流群
哦。
群二维码:
老俊俊微信:
知识星球:
所以今天你学习了吗?
欢迎小伙伴留言评论!
今天的分享就到这里了,敬请期待下一篇!
最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!
如果觉得对您帮助很大,赏杯快乐水喝喝吧!
推 荐 阅 读