R 语言 eulerr 包绘制韦恩图:比例精准

在数据可视化中,韦恩图是展示多组数据交集关系的常用工具,尤其在生物信息(如基因差异表达分析)、统计分析等领域高频使用。但传统绘图工具常面临椭圆比例失衡、数值显示混乱、样式调整繁琐 等问题,而 R 语言的eulerr包恰好能解决这些痛点 ------ 它支持按数据比例自动适配图形,同时提供丰富的自定义参数,新手也能快速画出专业级韦恩图。本文将从包加载、数据准备、基础绘图到高级美化,一步步带大家掌握eulerr包的使用方法,所有代码可直接复制运行。

一、前期准备:安装并加载 eulerr 包

首先需确保eulerr包已安装,若未安装,可通过install.packages()函数完成安装,再用library()加载包。代码如下:

R 复制代码
# 检查并安装eulerr包(仅首次使用需执行安装)
if (!require(eulerr)) {
  install.packages("eulerr")  # 从CRAN仓库安装
}
library(eulerr)  # 加载包

二、数据准备:构建韦恩图所需的交集统计数据

eulerr包绘图的核心是 **"分组 - 交集" 统计向量 **,需明确每组数据的独立数量及各组间的交集数量。以生物信息中 "多条件基因差异表达分析" 为例,假设我们有 3 个实验条件,需统计 "仅某条件特有基因数""某两个条件共有基因数""三个条件共有基因数",具体数据构建如下:

R 复制代码
# 设置随机种子(保证后续绘图结果可重复)
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)

实际应用提示:

若需基于原始数据(如基因表达矩阵)统计交集,可先通过DESeq2limma包完成差异表达分析,得到每个基因在各条件下的 "是否差异表达" 逻辑向量(如cond1_decond2_decond3_de),再用table()函数统计交集:

R 复制代码
# 示例:基于逻辑向量统计交集
intersection_counts <- table(cond1_de, cond2_de, cond3_de)
# 后续需将table结果整理为上述"组名-数值"的向量格式

三、基础绘图:快速生成比例精准的韦恩图

eulerr包绘图分两步:先用euler()函数拟合数据(按数据比例计算图形位置),再用plot()函数可视化。基础款韦恩图代码如下:

R 复制代码
# 1. 拟合数据(核心步骤,自动计算图形比例)
basic_fit <- euler(gene_data)

# 2. 绘制基础韦恩图
plot(
  x = basic_fit,          # 传入拟合好的数据对象
  main = "基础韦恩图(eulerr包)",  # 图标题
  main.cex = 1.2          # 标题字体大小
)

基础图特点:

  • 椭圆比例完全匹配数据量(如 Condition2 独立基因数最多,对应椭圆面积最大);
  • 自动标注分组名称,无冗余样式,适合快速查看数据关系。

四、样式美化:从实用到专业的 3 种进阶方案

基础图满足 "能用",但实际报告或论文中需更精准的信息展示(如数值、百分比)和更美观的样式。以下提供 3 种常用美化方案,可根据需求选择。

方案 1:显示数值 + 百分比,增强信息密度

在图中直接标注 "绝对数量" 和 "百分比",方便读者快速获取具体数据,同时调整颜色和边框提升可读性:

R 复制代码
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:添加图例,适配多组数据场景

当分组名称较长或需更清晰的分组说明时,可添加图例,并调整颜色为柔和的浅色系,适合汇报场景:

R 复制代码
plot(
  x = basic_fit,
  main = "韦恩图(带图例)",
  main.cex = 1.2,
  
  # 仅显示数值(避免信息过载)
  quantities = TRUE,  # 简化写法,默认显示counts
  quantities.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:深色主题 + 高对比度,适配论文插图

论文插图常需高对比度以保证印刷清晰,深色填充 + 白色文字的组合视觉效果突出,同时调整标题和图例位置提升整体协调性:

R 复制代码
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       # 图例与图形的间距(避免重叠)
  )
)

五、常见问题与解决方案

  1. 椭圆重叠异常 :若出现图形重叠混乱,需检查数据是否符合 "无矛盾"(如某交集数量大于独立组数量),可通过basic_fit$residuals查看拟合残差,残差接近 0 说明拟合良好;

  2. 中文显示乱码 :若绘图中中文(如标题、图例)显示为方框,需在plot()前设置中文字体,如par(family = "SimHei")(Windows 系统)或par(family = "Arial Unicode MS")(Mac 系统);

  3. 导出图片模糊 :建议用png()pdf()函数导出矢量图,避免拉伸模糊,示例:

    r

    R 复制代码
    # 导出为高清PNG图
    png("eulerr_venn.png", width = 800, height = 600, res = 300)
    plot(basic_fit, ...)  # 此处放入美化后的plot代码
    dev.off()  # 关闭绘图设备

总结

eulerr包的核心优势在于 **"比例精准" 和 "自定义灵活"** ------ 无需手动调整图形位置,即可实现数据与图形的精准匹配;同时通过quantitiesfillsedges等参数,可轻松适配报告、PPT、论文等不同场景的需求。本文提供的代码均经过验证,可直接复制运行,新手只需替换自身数据即可快速上手。