R 语言 eulerr 包绘制韦恩图:比例精准
在数据可视化中,韦恩图是展示多组数据交集关系的常用工具,尤其在生物信息(如基因差异表达分析)、统计分析等领域高频使用。但传统绘图工具常面临椭圆比例失衡、数值显示混乱、样式调整繁琐等问题,而 R 语言的eulerr
包恰好能解决这些痛点 —— 它支持按数据比例自动适配图形,同时提供丰富的自定义参数,新手也能快速画出专业级韦恩图。本文将从包加载、数据准备、基础绘图到高级美化,一步步带大家掌握eulerr
包的使用方法,所有代码可直接复制运行。
一、前期准备:安装并加载 eulerr 包
首先需确保eulerr
包已安装,若未安装,可通过install.packages()
函数完成安装,再用library()
加载包。代码如下:
# 检查并安装eulerr包(仅首次使用需执行安装)
if (!require(eulerr)) {install.packages("eulerr") # 从CRAN仓库安装
}
library(eulerr) # 加载包
二、数据准备:构建韦恩图所需的交集统计数据
eulerr
包绘图的核心是 **“分组 - 交集” 统计向量 **,需明确每组数据的独立数量及各组间的交集数量。以生物信息中 “多条件基因差异表达分析” 为例,假设我们有 3 个实验条件,需统计 “仅某条件特有基因数”“某两个条件共有基因数”“三个条件共有基因数”,具体数据构建如下:
# 设置随机种子(保证后续绘图结果可重复)
set.seed(123)# 构建基因集合交集统计向量
# 命名规则:独立组直接用组名,交集组用"组1&组2&..."格式
gene_data <- c("Condition1" = 150, # 仅Condition1特有的基因数"Condition2" = 200, # 仅Condition2特有的基因数"Condition3" = 180, # 仅Condition3特有的基因数"Condition1&Condition2" = 50,# Condition1与Condition2共有的基因数"Condition1&Condition3" = 40,# Condition1与Condition3共有的基因数"Condition2&Condition3" = 60,# Condition2与Condition3共有的基因数"Condition1&Condition2&Condition3" = 20 # 三个条件共有的基因数
)# 可选:查看数据结构,确认无格式错误
print(gene_data)
实际应用提示:
若需基于原始数据(如基因表达矩阵)统计交集,可先通过DESeq2
或limma
包完成差异表达分析,得到每个基因在各条件下的 “是否差异表达” 逻辑向量(如cond1_de
、cond2_de
、cond3_de
),再用table()
函数统计交集:
# 示例:基于逻辑向量统计交集
intersection_counts <- table(cond1_de, cond2_de, cond3_de)
# 后续需将table结果整理为上述"组名-数值"的向量格式
三、基础绘图:快速生成比例精准的韦恩图
eulerr
包绘图分两步:先用euler()
函数拟合数据(按数据比例计算图形位置),再用plot()
函数可视化。基础款韦恩图代码如下:
# 1. 拟合数据(核心步骤,自动计算图形比例)
basic_fit <- euler(gene_data)# 2. 绘制基础韦恩图
plot(x = basic_fit, # 传入拟合好的数据对象main = "基础韦恩图(eulerr包)", # 图标题main.cex = 1.2 # 标题字体大小
)
基础图特点:
- 椭圆比例完全匹配数据量(如 Condition2 独立基因数最多,对应椭圆面积最大);
- 自动标注分组名称,无冗余样式,适合快速查看数据关系。
四、样式美化:从实用到专业的 3 种进阶方案
基础图满足 “能用”,但实际报告或论文中需更精准的信息展示(如数值、百分比)和更美观的样式。以下提供 3 种常用美化方案,可根据需求选择。
方案 1:显示数值 + 百分比,增强信息密度
在图中直接标注 “绝对数量” 和 “百分比”,方便读者快速获取具体数据,同时调整颜色和边框提升可读性:
plot(x = basic_fit,main = "韦恩图(含数值与百分比)", # 图标题main.cex = 1.2,# 核心:设置数值与百分比显示quantities = list(type = c("counts", "percent"), # 同时显示"数量"和"百分比"fontsize = 10, # 数值字体大小fontface = "italic", # 数值字体样式(斜体)col = "black" # 数值字体颜色),# 填充色设置(莫兰迪色系,低饱和度更显专业)fills = list(fill = c("#FF6B6B", "#4ECDC4", "#556270"), # 三组颜色alpha = 0.7 # 透明度(避免颜色刺眼)),# 边框设置edges = list(col = "gray40", # 边框颜色(浅灰,不抢焦点)lwd = 2 # 边框粗细),# 分组标签设置labels = list(font = 2, # 字体样式(粗体)cex = 1.2 # 标签字体大小)
)
方案 2:添加图例,适配多组数据场景
当分组名称较长或需更清晰的分组说明时,可添加图例,并调整颜色为柔和的浅色系,适合汇报场景:
plot(x = basic_fit,main = "韦恩图(带图例)",main.cex = 1.2,# 仅显示数值(避免信息过载)quantities = TRUE, # 简化写法,默认显示countsquantities.fontsize = 10,# 填充色(浅色系,适合汇报PPT)fills = c("lightblue", "lightgreen", "lightcoral"),fills.alpha = 0.8,# 边框设置(深色细边框,突出图形轮廓)edges = list(col = "darkblue",lwd = 1.5,lty = 1 # 边框线型(实线)),# 分组标签(深红色,增强辨识度)labels = list(col = "darkred",font = 4, # 字体样式(粗斜体)cex = 1.1),# 图例设置(放右侧,不遮挡图形)legend = list(side = "right", # 图例位置(右側)labels = c("实验条件1", "实验条件2", "实验条件3"), # 图例标签(中文适配)cex = 0.9, # 图例字体大小bty = "n" # 去除图例边框(更简洁))
)
方案 3:深色主题 + 高对比度,适配论文插图
论文插图常需高对比度以保证印刷清晰,深色填充 + 白色文字的组合视觉效果突出,同时调整标题和图例位置提升整体协调性:
plot(x = basic_fit,# 标题精细化设置(深蓝色粗体,突出主题)main = list(label = "韦恩图(深色主题)",cex = 1.5,font = 2,col = "darkblue"),# 数值与百分比(白色文字,与深色背景对比)quantities = list(type = c("percent", "counts"), # 先显示百分比,再显示数量font = 2, # 粗体cex = 0.8, # 字体大小col = "white" # 文字颜色),# 深色填充(饱和度高,区分度强)fills = list(fill = c("#1B9E77", "#D95F02", "#7570B3"),alpha = 0.8 # 适当透明,避免过于厚重),# 白色边框(强化图形轮廓,与深色填充对比)edges = list(col = "white",lwd = 2.5 # 边框稍粗,提升视觉冲击),# 分组标签(白色粗体,清晰识别)labels = list(col = "white",font = 2,cex = 1.2),# 图例放底部(横向排列,节省空间)legend = list(side = "bottom",labels = c("条件1", "条件2", "条件3"),cex = 0.9,col = "darkblue", # 图例文字颜色与标题呼应inset = 0.05 # 图例与图形的间距(避免重叠))
)
五、常见问题与解决方案
- 椭圆重叠异常:若出现图形重叠混乱,需检查数据是否符合 “无矛盾”(如某交集数量大于独立组数量),可通过
basic_fit$residuals
查看拟合残差,残差接近 0 说明拟合良好; - 中文显示乱码:若绘图中中文(如标题、图例)显示为方框,需在
plot()
前设置中文字体,如par(family = "SimHei")
(Windows 系统)或par(family = "Arial Unicode MS")
(Mac 系统); - 导出图片模糊:建议用
png()
或pdf()
函数导出矢量图,避免拉伸模糊,示例:r
# 导出为高清PNG图 png("eulerr_venn.png", width = 800, height = 600, res = 300) plot(basic_fit, ...) # 此处放入美化后的plot代码 dev.off() # 关闭绘图设备
总结
eulerr
包的核心优势在于 **“比例精准” 和 “自定义灵活”** —— 无需手动调整图形位置,即可实现数据与图形的精准匹配;同时通过quantities
、fills
、edges
等参数,可轻松适配报告、PPT、论文等不同场景的需求。本文提供的代码均经过验证,可直接复制运行,新手只需替换自身数据即可快速上手。