【R画图学习24.3】ComplexHeatmap绘制复杂热图(3)

接着上个帖子,这个帖子主要学习文字注释的一些技巧。

1. 文字注释

文本可以用anno_text()注释。图形参数由gp控制。

ha = rowAnnotation(foo = anno_text(month.name, gp = gpar(fontsize = 1:12+4)))

位置由location和just控制。旋转由rot控制。

ha = rowAnnotation(foo = anno_text(month.name, location = 1, rot = 30,

    just = "right", gp = gpar(fontsize = 1:12+4)))

ha = rowAnnotation(foo = anno_text(month.name, location = 0.5, just = "center"))

location和just根据放置在热图中的注释的位置自动计算(例如,如果文本是热图的右注释,则文本向左对齐,如果它是左注释则向右对齐)。

宽度/高度是根据所有文本自动计算的。通常你不需要手动设置它的宽度/高度。

可以通过gp设置背景颜色。这里fill控制填充背景颜色,col控制文本颜色,border控制背景边框颜色。

可以看出,我们明确设置width为最长文本宽度的 1.2 倍。

ha = rowAnnotation(foo = anno_text(month.name, location = 0.5, just = "center",

    gp = gpar(fill = rep(2:4, each = 4), col = "white", border = "black"),

    width = max_text_width(month.name)*1.2))

与其他注释不同,默认情况下文本注释没有注释标题。标题可以在anno_text()通过设置show_name = TRUE被添加。

Heatmap(mat1) + rowAnnotation(month = anno_text(month.name[1:12], just = "center",

        location = unit(0.5, "npc"), show_name = TRUE),

    annotation_name_rot = 0)

2. 标记注释

有时热图中有很多行或列,我们想标记其中的一些。anno_mark()用于标记行或列的子集并用线连接到标签。anno_mark()至少需要两个参数:at、labels,其中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)

3. 摘要注释

有一个特殊的注释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)

下面是个连续变量的例子:

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)

通常我们不会绘制这个单列热图。它总是与其他“主要热图”结合在一起。

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

4. 缩放或者链接注释

anno_mark()将热图上的单行或单列连接到标签,注释功能anno_link()将行或列的子集连接到可以添加更全面图形的绘图区域。

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_link() 也适用于列注释。

5. 多重注释

要在HeatmapAnnotation()中放置多个注释,只需将它们指定为名称-值对。在HeatmapAnnotation()中,有一些参数控制多个注释。对于这些参数,它们被指定为长度与注释数量相同的向量,或具有注释子集的命名向量。被指定为向量、矩阵和数据框的简单注释将自动在热图上有图例。show_legend控制是否为它们绘制图例。

注意:如果show_legend是向量,则show_legend的值应为以下格式之一:

长度与简单注释数量相同的逻辑向量。

一个与totla注释数量相同长度的逻辑向量。复杂注释的值将被忽略。

用于控制简单注释子集的命名向量。

除此之外,注释还有很多样式的控制参数。比如:gp控制简单注释的图形参数(除了fill),例如注释网格的边框。

border控制每个注释的边界。 show_annotation_name控制是否显示注释名称。如前所述,该值可以是单个值、向量或命名向量。

annotation_name_gp, annotation_name_offset,annotation_name_side和 annotation_name_rot控制注释名称的样式和位置。后三个可以指定为命名向量。如果 annotation_name_offset指定为命名向量,则可以指定为字符而不是unit对象:annotation_name_offset = c(foo = "1cm")。annotation_label参数设置注释的替代标签。

gap控制每两个相邻注释之间的空间。该值可以是单个值或单位向量。

height, width,annotation_height并annotation_width控制完整热图注释的高度或宽度。通常你不需要设置它们,因为所有单个注释都有固定的高度/宽度,整个热图注释的最终高度/宽度是它们的总和。

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)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容