ggalign:热图等复杂组合图及图形数据对齐的 ggplot2 扩展
ggalign
一个 R 语言绘图工具 ggplot2
的高级扩展,它专注于在多个图形之间对齐观察值,利用 vctrs 包中的“number of observations”或 NROW()
函数,确保图形组织的一致性。无论是自包含排序图形的对齐,还是在多个图形中应用一致的分组和排序(如 k-means 聚类),ggalign
都可以帮助简化这一过程。
文档:A ggplot2 Extension for Consistent Axis Alignment
安装
两种方式,分别对应安装稳定版本和开发版本:
# CRAN
install.packages("ggalign")# 或者 github
# install.packages("remotes")
remotes::install_github("Yunuuuu/ggalign")
使用
如果熟悉ggplot2
的语法,那么上手使用ggalign
将很容易。下面将介绍使用 ggalign
中的 ggheatmap
等实现热图可视化,用来简单理解其功能
加载工具、创建数据
library(ggalign)
set.seed(123)
small_mat <- matrix(rnorm(81), nrow = 9)
rownames(small_mat) <- paste0("row", seq_len(nrow(small_mat)))
colnames(small_mat) <- paste0("column", seq_len(ncol(small_mat)))
head(small_mat)
可以看到,
ggalign
所需的输入数据格式,很符合人们容易理解的热图绘制逻辑
带有聚类分支树的热图
# initialize the heatmap layout, we can regard it as a normal ggplot object
ggheatmap(small_mat) +# we can directly modify geoms, scales and other ggplot2 componentsscale_fill_viridis_c() +# add annotation in the tophmanno("top") +# in the top annotation, we add a dendrogram, and split observations into 3 groupsalign_dendro(aes(color = branch), k = 3) +# in the dendrogram we add a point geomgeom_point(aes(color = branch, y = y)) +# change color mapping for the dendrogramscale_color_brewer(palette = "Dark2")
带有行/列注释的热图
ggheatmap(small_mat) +scale_fill_viridis_c() +hmanno("t", size = 0.5) +align_dendro(aes(color = branch), k = 3L) +ggalign(aes(y = value), data = rowSums) +geom_bar(stat = "identity", aes(fill = factor(.panel))) +scale_fill_brewer(name = NULL, palette = "Dark2") +hmanno("l", size = 0.5) +align_dendro(aes(color = branch), size = 0.5, k = 4L) +ggalign(aes(x = value), data = rowSums) +geom_bar(aes(y = .y, fill = factor(.y)),stat = "identity",orientation = "y") +scale_fill_brewer(name = NULL, palette = "Paired", guide = "none")
复杂热图
使用 ComplexHeatmap 的示例数据:
mat <- readRDS(system.file("extdata", "measles.rds", package = "ComplexHeatmap"))
绘图:
ggheatmap(mat, filling = FALSE) +geom_tile(aes(fill = value), color = "white") +scale_fill_gradientn(colours = c("white", "cornflowerblue", "yellow", "red"), values = scales::rescale(c(0, 800, 1000, 127000), c(0, 1))) +theme(axis.text.x = element_text(angle = -70, hjust = 0)) +hmanno("t", size = unit(2, "cm")) +ggalign(data = rowSums) +geom_bar(aes(y = value), fill = "#FFE200", stat = "identity") +scale_y_continuous(expand = expansion()) +ggtitle("Measles cases in US states 1930-2001\nVaccine introduced 1961") +theme(plot.title = element_text(hjust = 0.5)) +hmanno("r", size = unit(6, "cm")) +ggalign(data = rowSums) +geom_bar(aes(x = value), fill = "#FFE200", stat = "identity", orientation = "y") +scale_x_continuous(expand = expansion()) +theme(axis.text.x = element_text(angle = -60, hjust = 0)) +hmanno("r") +align_dendro(plot_dendrogram = TRUE) +theme(axis.text = element_blank(), axis.title = element_blank(), axis.ticks = element_blank())
图片生成的逻辑很清晰,每个子图都可以单独调整主题样式等,但是需要注意的是两个字:顺序,即 子图1 + 子样式1 + 子图2 + 子样式2 的串联顺序。样式的调整只对其承接的子图生效。
我为什么使用 ggalign
几年前,我曾尝试开发一个基于 ggplot2
的热图可视化扩展,由于缺乏动力,一直搁置。后来,出现一个名为 ggheatmap
的工具,但对我来说,差强人意,兼容性有限,其并不完全兼容 ggplot2
的语法。前段时间,我在浏览生信技能树的推文是,偶然看到一篇关于 ggalign
的推文,竟莫名的兴奋(有点子奇怪)。后来,我试用了这个工具,起初以为它只是一个简单的热图工具,但深入查看文档后,才发现它的功能远不止于此。
在日常数据处理和分析中,使用 R 语言进行数据可视化已成为一个不可或缺的环节。在 R 语言的可视化工具中,ggplot2
被广泛认为是必经之路,它为用户提供了灵活而强大的方式来创建各类可视化。然而,ggplot2 存在一个“隐性”
的局限性,它要求输入数据采用长格式,这对于许多初学者来说可能是一个不小的“思维门槛”。例如,当我处理标准化后的基因表达矩阵时,通常它以宽数据格式呈现。如果想使用 ggplot2
的 geom_tile
来绘制热图,以展示基因的表达情况,就必须将数据重塑:宽数据转换为长数据。
虽然一些其他工具(如 ComplexHeatmap)提供了更符合直观逻辑的数据格式,采用“数据即热图”的方式,但这些工具通常拥有独立的语法和对象类型,导致其输出与 ggplot2 生态体系不兼容。在进行图形拼接,我常常需要依赖额外工具,如拼图工具 patchwork
,在数据对齐时,比如把我做好的聚类树和 ComplexHeatmap
的热图拼接到一起,必须保证二者数据顺序的一致性,这时,需要复杂的手动操作……
然而,ggalign 的出现有效地解决了这一问题。它的 ggheatmap
等函数允许我直接使用宽数据格式,并基于 ggplot2
语法进行数据可视化,从而简化了工作流程,让绘制热图、拼接、不同他可视化的数据对齐等其他操作变得更高效、便捷。