【R画图学习24.2】ComplexHeatmap绘制复杂热图(2) 您所在的位置:网站首页 标签legend 【R画图学习24.2】ComplexHeatmap绘制复杂热图(2)

【R画图学习24.2】ComplexHeatmap绘制复杂热图(2)

2023-03-10 11:37| 来源: 网络整理| 查看: 265

热图注释是热图的重要组成部分,它显示与热图中的行或列相关联的附加信息,也是一个看起来高水平热图的主要原因。 ComplexHeatmap包为设置注释和定义新的注释图形提供了非常灵活的支持。注释可以放在热图的四个侧面,由top_annotation,bottom_annotation, left_annotation和right_annotation参数组成。

接下来我们将对不同的注释函数anno_*()进行学习和测试,如空注释anno_empty()、块注释anno_block()、图像注释anno_image()、点注释anno_points()、线注释anno_lines()、条形图注释anno_barplot()、箱线图注释anno_boxplot()、直方图注释anno_histogram()、密度注释anno_density()等注释方法。

四个参数的值应该在HeatmapAnnotation类中并且由HeatmapAnnotation()函数构造,如果是行注释则由rowAnnotation()函数构造。(rowAnnotation()只是一个与HeatmapAnnotation(..., which = "row")相同的辅助函数) 。

我们还是用上一篇的测试数据为例:

column_ha = HeatmapAnnotation(foo1 = runif(24), bar1 = anno_barplot(runif(24)))

row_ha = rowAnnotation(foo2 = runif(18), bar2 = anno_barplot(runif(18)))

Heatmap(mat, name = "mat", top_annotation = column_ha, right_annotation = row_ha)

将热图注释指定为底部注释和左侧注释。

Heatmap(mat, name = "mat", bottom_annotation = column_ha, left_annotation = row_ha)

在上面的例子中,column_ha和row_ha都有两个注释,其中 foo1和foo2是数字向量,bar1和bar2是条形图。类似向量的注解在这里称为“简单注释”,条形图注解称为“复杂注释”,注释必须定义为名称=值对(例如 foo = ...)。

另外,值得注意的是,热图注释也可以独立于热图。它们可以通过+(水平连接)或%v%(垂直连接)到热图列表,类似于ggplot的图层概念,一层层的望上加。

Heatmap(...) + rowAnnotation() + ...

Heatmap(...) %v% HeatmapAnnotation(...) + ...

下面我们学习各种注释的类型。

1. 简单注释

所谓的“简单注释”是最常用的注释样式,它是类似热图或类似网格的图形,其中使用颜色映射到注释值。要生成一个简单的注释,您只需简单地将一个特定的名称注释向量放入HeatmapAnnotation()中。

下面2个例子就是2个简单的离散型变量的简单注释。

ha = HeatmapAnnotation(foo = 1:10)

ha = HeatmapAnnotation(bar = sample(letters[1:3], 10, replace = TRUE))

如果未指定颜色,则随机生成颜色。col设置注释的颜色,col需要设置命名列表。

library(circlize)

col_fun = colorRamp2(c(0, 5, 10), c("blue", "white", "red"))

ha = HeatmapAnnotation(foo = 1:10, col = list(foo = col_fun))

ha = HeatmapAnnotation(bar = sample(letters[1:3], 10, replace = TRUE),

    col = list(bar = c("a" = "red", "b" = "green", "c" = "blue")))

如果您指定多个向量,则会有多个注释(foo和bar)。col中的值将用于构建简单注释的图例。例如下面的例子就包含了foo和bar两个注释,颜色里面就会有

ha = HeatmapAnnotation(

    foo = 1:10,

    bar = sample(letters[1:3], 10, replace = TRUE),

    col = list(foo = col_fun,

              bar = c("a" = "red", "b" = "green", "c" = "blue")

    )

)

gp 主要控制网格边界的图形参数。

ha = HeatmapAnnotation(

    foo = 1:10,

    bar = sample(letters[1:3], 10, replace = TRUE),

    col = list(foo = col_fun,

              bar = c("a" = "red", "b" = "green", "c" = "blue")

    ),

    gp = gpar(col = "black")

)

简单注释的高度由simple_anno_size 参数控制。由于所有单个注释具有相同的高度,因此 的值 simple_anno_size是单个unit值。注意 width,height,annotation_width和annotation_height,是用来调整的完整heamtap注释(这总是混合几种注释)的宽度/高度。

ha = HeatmapAnnotation(

    foo = cbind(a = 1:10, b = 10:1),

    bar = sample(letters[1:3], 10, replace = TRUE),

    col = list(foo = col_fun,

              bar = c("a" = "red", "b" = "green", "c" = "blue")

    ),

    simple_anno_size = unit(1, "cm")

)

2. 简单注释作为函数

HeatmapAnnotation()通过将注释设置为函数来支持“复杂注释”。annotation 函数定义了如何在热图中的列或行对应的某个位置绘制图形。ComplexHeatmap包中预定义了很多注释函数 。

对于anno_*()形式的所有注释函数,如果在HeatmapAnnotation()或rowAnnotation()中指定 ,则不需要明确地做任何anno_*()事情来判断它是应该绘制在行上还是列上。anno_*()将会自动检测是行注释环境还是列注释环境。

上一节中的简单注解是由anno_simple()注解函数内部构造的 。直接使用anno_simple() 不会自动为最终绘图生成图例,但是,它可以为更多的注释图形提供更大的灵活性,这个功能允许在注释网格上添加更多符号。anno_simple()允许在注释网格顶部添加“点”或单字母符号。pch,pt_gp和pt_size控制点的设置。pch的值可以是具有可能NA值的向量。

ha = HeatmapAnnotation(foo = anno_simple(1:10, pch = 1,

    pt_gp = gpar(col = "red"), pt_size = unit(1:10, "mm")))

ha = HeatmapAnnotation(foo = anno_simple(1:10, pch = 1:10))

如果 anno_simple()的值是矩阵,pch也可以使用。 pch的长度应该与矩阵的行数或列数甚至矩阵的长度相同(矩阵的长度是矩阵中所有数据点的长度)。

ha = HeatmapAnnotation(foo = anno_simple(cbind(1:10, 10:1), pch = 1:2))

下面我们绘制一个简单的例子,加入一个常见的pvalue的信息。

pvalue = 10^-runif(24, min = 0, max = 3)

is_sig = pvalue < 0.01

pch = rep("*", 10)

pch[!is_sig] = NA

pvalue_col_fun = colorRamp2(c(0, 2, 3), c("green", "white", "red"))

#生成一个pvalue的注释信息

ha = HeatmapAnnotation(

    pvalue = anno_simple(-log10(pvalue), col = pvalue_col_fun, pch = pch),

    annotation_name_side = "left")

由于我们使用了函数,所以不会自动产生legend信息,我们需要自己加入pvalue的legend信息。

lgd_pvalue = Legend(title = "p-value", col_fun = pvalue_col_fun, at = c(0, 1, 2, 3),

    labels = c("1", "0.1", "0.01", "0.001"))

lgd_sig = Legend(pch = "*", type = "points", labels = "< 0.01")

draw(ht, annotation_legend_list = list(lgd_pvalue, lgd_sig))

3. 块注释

块注释更像是一个颜色块,它在热图的行或列被拆分时标识组。

Heatmap(mat, name = "mat",

    top_annotation = HeatmapAnnotation(foo = anno_block(gp = gpar(fill = 2:4))),

    column_km = 3)

更复杂一点的,行和列都加上标签,以及对标签的文字进行控制。

Heatmap(mat,

    top_annotation = HeatmapAnnotation(foo = anno_block(gp = gpar(fill = 2:4),

        labels = c("group1", "group2", "group3"),

        labels_gp = gpar(col = "white", fontsize = 10))),

    column_km = 3,

    left_annotation = rowAnnotation(foo = anno_block(gp = gpar(fill = 2:4),

        labels = c("group1", "group2", "group3"),

        labels_gp = gpar(col = "white", fontsize = 10))),

    row_km = 3)

4. 点注释

点注释anno_points()为实现显示数据点在列表中的分布。数据点对象x可以是单个向量或矩阵。如果它是一个矩阵,图形属性设置(例如pch,size和gp)可以关联到矩阵的列。再次注意,如果x是矩阵,则行x 对应于热图矩阵中的列。

ha = HeatmapAnnotation(foo = anno_points(runif(10)))

ha = HeatmapAnnotation(foo = anno_points(matrix(runif(20), nc = 2),

    pch = 1:2, gp = gpar(col = 2:3)))

5. 线注释

anno_lines()通过段列表连接数据点。和点注释类似,就是点之间连成了线。与 anno_points()类似,数据变量可以是数值向量:

ha = HeatmapAnnotation(foo = anno_lines(runif(10)))

ha = HeatmapAnnotation(foo = anno_lines(cbind(c(1:5, 1:5), c(5:1, 5:1)),

    gp = gpar(col = 2:3), add_points = TRUE, pt_gp = gpar(col = 5:6), pch = c(1, 16)))

#如上图所示,可以通过设置将点添加到线中add_points = TRUE。也通过设置smooth = TRUE可以添加平滑线(by loess())而不是原始线,但应谨慎使用,因为热图中列的顺序用作拟合的“x值”,并且仅当您认为拟合反对重新排序的顺序是有道理的。

6. 条形图注释

数据点可以表示为条形图。 anno_barplot()的一些参数:如ylim,axis,axis_param和 anno_points()是一样的。

ha = HeatmapAnnotation(foo = anno_barplot(1:10))

条行图的宽度由 bar_width控制。它是热图中单元格宽度的相对值。图形参数由gp控制。

ha = HeatmapAnnotation(foo = anno_barplot(1:10, gp = gpar(fill = 1:10)))

可以通过baseline选择条形的基线。

ha = HeatmapAnnotation(foo = anno_barplot(seq(-5, 5), baseline = 0))

当时矩阵的时候,就是堆积柱形图了。

ha = HeatmapAnnotation(foo = anno_barplot(cbind(1:10, 10:1),

    gp = gpar(fill = 2:3, col = 2:3)))

7. 箱线图注释

Boxplot注解以及后面介绍的注解函数更适合小矩阵。不适合就有多列矩阵的列注释。

对于anno_boxplot(),输入数据变量应该是矩阵或列表。如果 x是矩阵,如果是列注释,则箱线图的统计量按列计算,如果是行注释,则按行计算。

m = matrix(rnorm(100), 10)

ha = HeatmapAnnotation(foo = anno_boxplot(m, height = unit(4, "cm")))

图形参数和前面一样由gp控制。框的宽度由box_width控制。outline控制是否显示离群点。

8. 直方图注释

作为直方图的注释更适合作为行注释。数据变量的设置与anno_boxplot()相同,可以是矩阵或列表。由anno_histogram实现。

与anno_boxplot()类似,输入数据变量应该是矩阵或列表。如果 x是矩阵,如果是列注释,则直方图按列计算,如果是行注释,则直方图按行计算。

m = matrix(rnorm(1000), nc = 100)

ha = rowAnnotation(foo = anno_histogram(m))

直方图的中断次数由n_breaks控制。颜色由gp控制。

9. 密度曲线注释

与直方图注释类似,anno_density()将分布显示为拟合曲线。

ha = rowAnnotation(foo = anno_density(m))



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有