ComplexHeatmap 之 Heatmap List 续(二)
点击上方,关于我们
AUTUMN
一夜梧桐一报秋
本章节结束 热图列表 最后一部分内容。
11、绘制热图列表
直接使用 draw()
函数绘制:
# code only for demonstration
draw(ht_list, ...)
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
提取树状图的逻辑相同,垂直热图列表的逻辑也相同,因此我们在此不再展示更多示例。
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:
在所有 Heatmap() 中设置 row_names_gp。heatmap_column_names_gp:
在所有 Heatmap() 中设置 column_names_gp。heatmap_row_title_gp:
在所有 Heatmap() 中设置 row_title_gp。heatmap_column_title_gp:
在所有 Heatmap() 中设置 column_title_gp。heatmap_border:
在所有 Heatmap() 中设置边框。
以下参数控制图例:
legend_title_gp:
在所有热图图例和注释图例中设置 title_gp。legend_title_position:
在所有热图图例和注释图例中设置 title_position。legend_labels_gp:
在所有热图图例和注释图例中设置 labels_gp。legend_grid_width:
在所有热图图例和注释图例中设置网格宽度。legend_grid_height:
在所有热图图例和注释图例中设置 grid_height。legend_border:
在所有热图图例和注释图例中设置边框。
以下参数控制热图注释:
annotation_border:
在所有 HeatmapAnnotation() 中设置边框。anno_simple_size:
设置简单注释的大小。
以下参数控制热图组件之间的间距:
DENDROGRAM_PADDING:
树状图和热图主体之间的空间。DIMNAME_PADDING:
行/列名称和热图主体之间的空间。TITLE_PADDING:
行/列标题和热图正文之间的空间。COLUMN_ANNO_PADDING:
列注释和热图主体之间的空间。ROW_ANNO_PADDING:
行注释和热图主体之间的空间。
你可以通过传统方式(如 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()
函数中设置这些全局参数来临时更改全局参数,并在绘制完成后重新设置。
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,用户可以根据具体场景进行配置。
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
未完待续。
收官!
代码 我上传到 QQ 群 老俊俊生信交流群
文件夹里。欢迎加入。加我微信我也拉你进 微信群聊 老俊俊生信交流群
哦。
群二维码:
老俊俊微信:
知识星球:
所以今天你学习了吗?
欢迎小伙伴留言评论!
今天的分享就到这里了,敬请期待下一篇!
最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!
如果觉得对您帮助很大,赏杯快乐水喝喝吧!
往期回顾
◀ComplexHeatmap 之 Heatmap List 续(一)
◀ComplexHeatmap 之 Heatmap List
◀ComplexHeatmap 之 Heatmap Annotations 续(三)
◀ComplexHeatmap 之 Heatmap Annotations 续(二)
◀ComplexHeatmap 之 Heatmap Annotations 续(一)
◀ComplexHeatmap 之 Heatmap Annotations
◀ComplexHeatmap 之 A Single Heatmap 续(二)