ComplexHeatmap 之 Heatmap Annotations 续(一)
点击上方关注我们
开学季
5、图片注释
图像可以添加为注释。anno_image()
支持 png、svg、pdf、eps、jpeg/jpg、tiff 格式的图像。它们作为注释导入的方式如下:
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 可以是单个向量
或矩阵
。如果是矩阵,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)))
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(0, 1),
axis_param = list(
side = "right",
at = c(0, 0.5, 1),
labels = c("zero", "half", "one")
))
)
可以控制轴标签的旋转:
ha = rowAnnotation(foo = anno_points(runif(10), ylim = c(0, 1),
width = unit(2, "cm"),
axis_param = list(
side = "bottom",
at = c(0, 0.5, 1),
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: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
添加平滑线(通过 loess()
)而不是原始线,但应谨慎使用,因为热图中列的顺序用作拟合的“x 值”,并且如果你仅仅认为根据重新排序的顺序进行拟合是有道理的。
当输入数据变量是一个矩阵时,对每一列分别进行平滑处理,也可以工作。
如果 smooth 为 TRUE,则添加点默认为 TRUE:
ha = HeatmapAnnotation(foo = anno_lines(runif(10), smooth = TRUE))
线注释的默认大小为 5 毫米。它可以由 anno_lines() 中的 height/width 参数控制。
8、条形图注释
数据点可以表示为条形图。anno_barplot()
中的一些参数如 ylim、axis、axis_param 与 anno_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(-5, 5), baseline = "min"))
ha = HeatmapAnnotation(foo = anno_barplot(seq(-5, 5), baseline = 0))
如果输入值是矩阵,它将是堆叠的条形图:
ha = HeatmapAnnotation(foo = anno_barplot(matrix(nc = 2, c(1:10, 10:1))))
gp
中参数的长度可以是矩阵中的列数:
ha = HeatmapAnnotation(foo = anno_barplot(cbind(1:10, 10: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, 1, function(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 群 老俊俊生信交流群
文件夹里。欢迎加入。加我微信我也拉你进 微信群聊 老俊俊生信交流群
哦。
群二维码:
老俊俊微信:
知识星球:
所以今天你学习了吗?
欢迎小伙伴留言评论!
今天的分享就到这里了,敬请期待下一篇!
最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!
如果觉得对您帮助很大,赏杯快乐水喝喝吧!
推 荐 阅 读