如何在R中自动生成多基因集的两两2×2维恩/欧拉图矩阵?
批量生成基因集两两对比的维恩/欧拉图并排版为矩阵形式
需求背景
现有一个包含多个基因集的列表(示例数据如下),已能绘制单个两两组合的维恩/欧拉图,需要自动化生成所有基因集两两组合的2×2维恩/欧拉图,并将这些图整理为矩阵形式,实际场景中涉及70+个基因集的对比。
示例数据生成
首先生成示例基因集列表:
genes <- paste("gene", 1:1000, sep = "") x <- list(A = sample(genes, 300), B = sample(genes, 525), C = sample(genes, 440), D = sample(genes, 350))
批量绘图与矩阵排版方案
使用eulerr包生成欧拉图,结合gridExtra包实现矩阵式排版,代码如下:
1. 加载依赖包
library(eulerr) library(gridExtra)
2. 批量生成并排版所有两两对比图
# 获取基因集名称与数量 gene_names <- names(x) n <- length(gene_names) # 初始化空的图矩阵,用于存储每个位置的图对象 plot_matrix <- matrix(list(), nrow = n, ncol = n) # 循环生成所有组合的图 for (i in 1:n) { for (j in 1:n) { if (i == j) { # 对角线位置绘制单个基因集的欧拉图 p <- plot(euler(x[i]), quantities = TRUE, main = gene_names[i]) } else { # 非对角线位置绘制两两基因集的对比欧拉图 p <- plot(euler(x[c(i, j)]), quantities = TRUE, main = paste(gene_names[i], "vs", gene_names[j])) } plot_matrix[i, j] <- list(p) } } # 将图矩阵拼接为一张大网格图 grid.arrange(grobs = unlist(plot_matrix), nrow = n)
70+基因集场景的优化建议
当基因集数量达到70+时,直接生成70×70的矩阵图会导致单图尺寸极小,难以查看,可通过以下方式优化:
- 仅保留三角区域:只生成上三角或下三角的对比图(对角线可保留单基因集图或省略),减少冗余绘图
- 分批次生成:将基因集分组,生成多个子矩阵图而非一张大图
- 调整输出尺寸:保存图片时设置超大的宽高与高分辨率,例如:
ggsave("gene_set_comparison_matrix.png", grid.arrange(grobs = unlist(plot_matrix), nrow = n), width = 120, height = 120, dpi = 300)
内容的提问来源于stack exchange,提问作者B_slash_
相关产品推荐
相关产品推荐

