摘要
在生物信息学、数据挖掘等领域的集合分析中,传统 Venn 图在多维度数据展示时存在信息拥挤、可读性差等问题。本文基于 R 语言的 ComplexUpset 包,以基因表达研究为场景,从包安装、数据准备到可视化实现,完整演示如何制作正刊级别的集合交集图,解决多条件下差异基因(或其他数据)的交集展示难题,代码可直接复用。
一、前言
在处理多组条件下的集合数据(如不同处理组的差异基因、多批次实验的共同结果等)时,Venn 图仅适用于 3 组以内的简单交集展示,当条件数增加到 4 组及以上时,图形会变得混乱,难以直观区分各交集的具体数量和构成。
ComplexUpset 包作为 ggplot2 的扩展工具,支持多组条件的集合可视化,不仅能清晰展示各交集的样本数量,还可灵活调整图形细节(如过滤小交集、排序交集顺序),同时兼容 ggplot2 的语法,方便后续美化。本文以 "4 种处理条件下的差异基因" 为例,实战演示该包的核心用法。
二、环境准备:安装并加载所需 R 包
首先需安装 ComplexUpset 包(核心可视化工具)、ggplot2(图形基础)、dplyr(数据处理),以及 RColorBrewer(配色辅助)。若已安装过对应包,可跳过安装步骤,直接加载。
R
# 1. 安装所需包(未安装时执行)
if (!require("ComplexUpset")) {
install.packages("ComplexUpset") # 核心集合可视化包
}
if (!require("ggplot2")) {
install.packages("ggplot2") # 基础绘图包
}
if (!require("dplyr")) {
install.packages("dplyr") # 数据处理包
}
if (!require("RColorBrewer")) {
install.packages("RColorBrewer") # 配色包
}
# 2. 加载已安装的包
library(ComplexUpset)
library(ggplot2)
library(dplyr)
library(RColorBrewer)
# 3. 固定随机种子(保证结果可重复,避免每次运行数据不一致)
set.seed(123)
三、数据准备:模拟基因表达研究数据集
为贴合实际科研场景,本文模拟一个 "4 种处理条件下的差异表达基因" 数据集(bio_data
),包含 2000 个基因,字段涵盖:基因 ID、各处理条件的响应状态(是否为差异基因)、基因功能分类、各处理组的表达变化倍数(log2FC)。
R
# 1. 设定基础参数
n_genes <- 2000 # 总基因数
gene_ids <- paste0("Gene_", sprintf("%04d", 1:n_genes)) # 生成唯一基因ID(如Gene_0001)
# 2. 创建核心数据框
bio_data <- data.frame(
Gene_ID = gene_ids,
# 4种处理条件:响应状态(TRUE=差异基因,FALSE=非差异基因),按实际研究概率分配
Treatment_A = sample(c(TRUE, FALSE), n_genes, replace = TRUE, prob = c(0.15, 0.85)), # 15%响应
Treatment_B = sample(c(TRUE, FALSE), n_genes, replace = TRUE, prob = c(0.12, 0.88)), # 12%响应
Treatment_C = sample(c(TRUE, FALSE), n_genes, replace = TRUE, prob = c(0.18, 0.82)), # 18%响应
Heat_Stress = sample(c(TRUE, FALSE), n_genes, replace = TRUE, prob = c(0.10, 0.90)), # 10%响应
stringsAsFactors = FALSE # 避免字符型字段自动转为因子
)
# 3. 补充基因功能分类(按科研常见类别分配,概率模拟实际分布)
bio_data$Gene_Type <- sample(
x = c("Metabolic", "Regulatory", "Structural", "Transport", "Defense"),
size = n_genes,
replace = TRUE,
prob = c(0.3, 0.25, 0.2, 0.15, 0.1) # 代谢类占比最高(30%),防御类最低(10%)
)
# 4. 补充表达变化倍数(log2FC):仅差异基因有随机值,非差异基因为0
bio_data$log2FC_A <- ifelse(bio_data$Treatment_A, rnorm(n_genes, mean = 0, sd = 2), 0)
bio_data$log2FC_B <- ifelse(bio_data$Treatment_B, rnorm(n_genes, mean = 0, sd = 1.8), 0)
bio_data$log2FC_C <- ifelse(bio_data$Treatment_C, rnorm(n_genes, mean = 0, sd = 2.2), 0)
# 可选:查看数据前5行,确认数据结构
head(bio_data)
数据说明:bio_data
共 2000 行(基因)、10 列(字段),其中Treatment_A
-Heat_Stress
为 4 个集合条件,后续可视化将围绕这 4 个条件的基因交集展开。
四、ComplexUpset 可视化实战
4.1 基础版集合交集图
核心函数为upset()
,需指定数据集、待分析的集合条件(intersect
参数),基础版可快速展示各交集的基因数量。
R
# 绘制基础版集合图
basic_plot <- upset(
data = bio_data, # 输入数据集
intersect = c('Treatment_A', 'Treatment_B', 'Treatment_C', 'Heat_Stress'), # 4个集合条件
name = 'condition', # 集合条件的名称(用于图例标注)
width_ratio = 0.1 # 调整集合名称列与条形图的宽度比例
)
# 输出图形
print(basic_plot)
基础图解读:
- 纵轴(Set size):对应交集的基因数量;
- 横轴上方:4 个处理条件的名称,黑色圆点表示 "该条件在当前交集中被满足"(即基因在该处理中为差异基因);
- 横轴下方:条形图高度对应各交集的基因数量,例如 "仅 Treatment_C 为差异基因""Treatment_A 与 Treatment_B 共同为差异基因" 等交集的数量可直接读取。
4.2 优化版集合交集图
基础版可能包含过小的交集(无实际意义),或交集顺序混乱,可通过min_size
(过滤小交集)、sort_sets
(排序集合)、sort_intersections
(排序交集)等参数优化。
R
# 绘制优化版集合图
custom_basic <- upset(
data = bio_data,
intersect = c('Treatment_A', 'Treatment_B', 'Treatment_C', 'Heat_Stress'),
min_size = 10, # 过滤基因数<10的交集(避免无意义的小交集)
max_size = 500, # 限制最大交集展示(可选,避免极端值影响图形)
sort_sets = 'descending', # 按集合的总基因数降序排列(从多到少)
sort_intersections = 'descending' # 按交集的基因数降序排列(重点交集在前)
)
# 输出优化图
print(custom_basic)
优化图优势:
- 过滤小交集后,图形更简洁,避免无效信息干扰;
- 降序排列后,基因数最多的集合 / 交集排在左侧,重点结果一目了然(如 "仅 Treatment_C 为差异基因" 的交集数量最多,可优先关注)。
五、总结与扩展
相较于 Venn 图,ComplexUpset 包的核心优势在于:
- 支持≥4 组条件的集合可视化,解决 Venn 图多组拥挤问题;
- 可灵活过滤、排序交集,突出核心结果;
- 基于 ggplot2,后续可通过
+ theme()
、scale_fill_brewer()
等语法进一步美化(如调整颜色、字体、图例位置)。
后续可扩展方向:
- 结合
Gene_Type
字段,在条形图中添加颜色区分(展示不同功能基因在交集中的构成); - 添加
log2FC
的箱线图(在交集图下方展示各交集基因的表达变化分布)。
本文代码可直接复制到 RStudio 中运行,只需根据自身数据调整intersect
参数(替换为实际的集合条件字段),即可快速生成专业的集合交集图,适用于科研论文、报告中的数据可视化场景。