查看原文
其他

ComplexHeatmap 之 Heatmap Annotations 续(一)

JunJunLab 老俊俊的生信笔记 2022-08-15


点击上方关注我们




开学季



5、图片注释

图像可以添加为注释。anno_image() 支持 pngsvgpdfepsjpeg/jpgtiff 格式的图像。它们作为注释导入的方式如下:

  • png、jpeg/jpg 和 tiff 图像由 png::readPNG()jpeg::readJPEG()tiff::readTIFF() 导入,并由 grid::grid.raster() 绘制。
  • svg 图像首先由 rsvg::rsvg_svg() 重新格式化,然后由 grImport2::readPicture() 导入并由 grImport2::grid.picture() 绘制。
  • pdf 和 eps 图像由 grImport::PostScriptTrace()grImport::readPicture() 导入,稍后由 grImport::grid.picture() 绘制。

以下示例的图标来自 https://github.com/Keyamoon/IcoMoon-Free。图像路径向量被设置为 anno_image() 的第一个参数:

image_png = sample(dir("IcoMoon-Free-master/PNG/64px", full.names = TRUE), 10)
image_svg = sample(dir("IcoMoon-Free-master/SVG/", full.names = TRUE), 10)
image_eps = sample(dir("IcoMoon-Free-master/EPS/", full.names = TRUE), 10)
image_pdf = sample(dir("IcoMoon-Free-master/PDF/", full.names = TRUE), 10)

# we only draw the image annotation for PNG images, while the others are the same
ha = HeatmapAnnotation(foo = anno_image(image_png))

不同的图像格式可以混合:

# code only for demonstration
ha = HeatmapAnnotation(foo = anno_image(c(image_png[1:3], image_svg[1:3],
    image_eps[1:3], image_pdf[1:3])))

边框和背景颜色(如果图像有透明背景)可以通过 gp 设置:

ha = HeatmapAnnotation(foo = anno_image(image_png,
    gp = gpar(fill = 1:10, col = "black")))

border 控制整个注释的边框:

# code only for demonstration
ha = HeatmapAnnotation(foo = anno_image(image_png, border = "red"))

图像周围的填充或空间由 space 设置:

ha = HeatmapAnnotation(foo = anno_image(image_png, space = unit(3"mm")))

如果只需要绘制部分图像,图像向量中的其他元素可以设置为'' 或 NA

image_png[1:2] = ""
ha = HeatmapAnnotation(foo = anno_image(image_png))

6、点注释

实现为 anno_points() 的点注释显示数据点的分布。数据点对象 x 可以是单个向量矩阵。如果是矩阵,pchsizegp 等图形设置可以对应矩阵列。再次注意,如果 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)))

ylim 控制 “y 轴” 或 “ 数据轴” 上的范围(如果是行注释,则数据轴是水平的),extend 控制数据轴方向上的扩展空间。axis 控制是否显示轴,axis_param 控制轴的设置。轴的默认设置为:

default_axis_param("column")
## $at
## NULL
##
## $labels
## NULL
##
## $labels_rot
## [1] 0
##
## $gp
## $fontsize
## [1] 8
##
##
## $side
## [1] "left"
##
## $facing
## [1] "outside"
##
## $direction
## [1] "normal"

你可以覆盖其中的一些:

ha = HeatmapAnnotation(foo = anno_points(runif(10), ylim = c(01),
    axis_param = list(
        side = "right",
        at = c(00.51),
        labels = c("zero""half""one")
    ))
)

可以控制轴标签的旋转:

ha = rowAnnotation(foo = anno_points(runif(10), ylim = c(01),
    width = unit(2"cm"),
    axis_param = list(
        side = "bottom",
        at = c(00.51),
        labels = c("zero""half""one"),
        labels_rot = 45
    ))
)

点注释的默认大小为 5mm。它可以由 anno_points() 中的 height/width 参数控制:

# code only for demonstration
ha = HeatmapAnnotation(foo = anno_points(runif(10), height = unit(2"cm")))

7、线注释

anno_lines() 通过段列表连接数据点。与 anno_points() 类似,数据变量可以是数值向量:

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

或矩阵:

ha = HeatmapAnnotation(foo = anno_lines(cbind(c(1:51:5), c(5:15:1)),
    gp = gpar(col = 2:3), add_points = TRUE, pt_gp = gpar(col = 5:6), pch = c(116)))

可以通过设置 add_points = TRUE 将点添加到线条中。

可以通过设置 smooth = TRUE 添加平滑线(通过 loess())而不是原始线,但应谨慎使用,因为热图中列的顺序用作拟合的“x 值”,并且如果你仅仅认为根据重新排序的顺序进行拟合是有道理的。

当输入数据变量是一个矩阵时,对每一列分别进行平滑处理,也可以工作。

如果 smooth 为 TRUE,则添加点默认为 TRUE:

ha = HeatmapAnnotation(foo = anno_lines(runif(10), smooth = TRUE))

线注释的默认大小为 5 毫米。它可以由 anno_lines() 中的 height/width 参数控制。

8、条形图注释

数据点可以表示为条形图。anno_barplot() 中的一些参数如 ylimaxisaxis_paramanno_points() 相同:

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

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

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

图形参数由 gp 控制:

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

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

ha = HeatmapAnnotation(foo = anno_barplot(seq(-55), baseline = "min"))
ha = HeatmapAnnotation(foo = anno_barplot(seq(-55), baseline = 0))

如果输入值是矩阵,它将是堆叠的条形图:

ha = HeatmapAnnotation(foo = anno_barplot(matrix(nc = 2, c(1:1010:1))))

gp 中参数的长度可以是矩阵中的列数:

ha = HeatmapAnnotation(foo = anno_barplot(cbind(1:1010:1),
    gp = gpar(fill = 2:3, col = 2:3)))

条形图注释的默认大小为 5 毫米。它可以由 anno_barplot() 中的 height/width 参数控制。

# code only for demonstration
ha = HeatmapAnnotation(foo = anno_barplot(runif(10), height = unit(2"cm")))

以下示例显示了可视化比例矩阵的条形图注释(行总和为 1):

m = matrix(runif(4*10), nc = 4)
m = t(apply(m, 1function(x) x/sum(x)))
ha = HeatmapAnnotation(foo = anno_barplot(m, gp = gpar(fill = 2:5),
    bar_width = 1, height = unit(6"cm")))

轴的方向可以反转,这在注释放在热图左侧时很有用:

ha_list = rowAnnotation(axis_reverse = anno_barplot(m, gp = gpar(fill = 2:5),
    axis_param = list(direction = "reverse"),
    bar_width = 1, width = unit(4"cm"))) +
rowAnnotation(axis_normal = anno_barplot(m, gp = gpar(fill = 2:5),
    bar_width = 1, width = unit(4"cm")))
draw(ha_list, ht_gap = unit(4"mm"))

direction = "reverse" 也适用于其他具有轴的注释函数,但它更常用于条形图注释。

参数 add_numbers 可以设置为 TRUE,以便与条形关联的数字绘制在条形之上。对于列注释,文本默认旋转 45 度。

ha = HeatmapAnnotation(foo = anno_barplot(1:10, add_numbers = TRUE,
    height = unit(1"cm")))

9、箱线图注释

Boxplot 注释以及后面介绍的注解函数更适合 小矩阵

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

set.seed(12345)
m = matrix(rnorm(100), 10)
ha = HeatmapAnnotation(foo = anno_boxplot(m, height = unit(4"cm")))

图形参数由 gp 控制:

ha = HeatmapAnnotation(foo = anno_boxplot(m, height = unit(4"cm"),
    gp = gpar(fill = 1:10)))

箱的宽度由 box_width 控制。outline 控制是否显示离群点:

ha = HeatmapAnnotation(foo = anno_boxplot(m, height = unit(4"cm"),
    box_width = 0.9, outline = FALSE))

anno_boxplot() 只为一行绘制一个箱线图。

10、直方图注释

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

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

m = matrix(rnorm(1000), nc = 100)
ha = rowAnnotation(foo = anno_histogram(m)) # apply `m` on rows

直方图的中刻度数由 n_breaks 控制:

ha = rowAnnotation(foo = anno_histogram(m, n_breaks = 20))

颜色由 gp 控制:

ha = rowAnnotation(foo = anno_histogram(m, gp = gpar(fill = 1:10)))


未完待续。


收官!


代码 我上传到 QQ 群 老俊俊生信交流群 文件夹里。欢迎加入。加我微信我也拉你进 微信群聊 老俊俊生信交流群 哦。

群二维码:


老俊俊微信:




知识星球:



所以今天你学习了吗?

欢迎小伙伴留言评论!

今天的分享就到这里了,敬请期待下一篇!

最后欢迎大家分享转发,您的点赞是对我的鼓励肯定

如果觉得对您帮助很大,赏杯快乐水喝喝吧!

推 荐 阅 读




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存