iMeta | 更好的ggVennDiagram, 更好用的韦恩图工具
myzbx 2025-04-27 15:06 20 浏览
点击蓝字 关注我们
ggVennDiagram:直观韦恩图工具的新版本
iMeta主页:http://www.imeta.science
方 法
● 原文链接DOI: https://doi.org/10.1002/imt2.177
● 2024年2月14日,华中农业大学高春辉等在iMeta在线发表了题为 “ggVennDiagram: intuitive Venn diagram software extended” 的文章。
● 本文发布了ggVennDiagram新版本,该版本可绘制包含多达7个集合的子集区域填充Venn图,原生支持具有无限数目集合的Upset图,提供了R包、Shiny应用程序和TBtools插件等3种不同的应用方式。
● 第一作者:高春辉
● 通讯作者:蔡鹏(cp@mail.hzau.edu.cn)
● 合作作者:陈程杰,Turgut Akyol,Adrian Dusa,余光创,曹彬
● 主要单位:华中农业大学,新加坡南洋理工大学,华南农业大学,丹麦Aarhus University,罗马尼亚University of Bucharest,南方医科大学
亮 点
● 可绘制包含多达7个集合的子集区域填充Venn图;
● 原生支持了具有无限数目集合的Upset图;
● 提供了一个可用于多个集合的Venn计算器;
● 提供了R包、Shiny应用程序和TBtools插件等3种不同的应用方式。
全文解读
正 文
韦恩图是可视化多个集合之间关系的常用方法。作为最受欢迎的数据可视化平台之一,R语言环境中有VennDiagram、venn和RVenn等多个软件包用于绘制维恩图。在借鉴这些现有工具的基础上,我们在2019年开发了ggVennDiagram。ggVennDiagram支持图形语法、精确的子集区域填充,以及其它一些易于使用的功能,逐渐成为韦恩图可视化领域中最受欢迎的工具之一。
在过去的两年里,ggVennDiagram经历了持续的优化,并获得了100多次文献引用。在这项研究中,我们发布了一个里程碑版本,包括以下新功能:
更容易安装。在该版本之前,ggVennDiagram有一个庞大的包依赖树,其中包含90多个包。其中,sf包是依赖最重的包。它不仅占用的磁盘空间最大,而且还有几个系统依赖;这些依赖大多数用户都没有安装,所以会导致安装失败。然而,sf对于ggVennDiagram中的复杂形状的生成又是必须的,因此直接删除它是不可行的。考虑到这一点,我们将形状生成函数整合到了一个新包中,即shapeMageR,从而去掉了这个严重的依赖。此外,还删除了其它几个依赖项,包括RVenn、purrr、magrittr和plotly(见表S1)。现在,ggVennDiagram及其依赖项的总文件大小已经从210 MB(1.1.0版本)减少到了约36 MB(见文件S1)。这使得ggVennDiagram的安装比以前更容易。
图1. ggVennDiagram的功能
包含五个集合输入的维恩图(A)和Upset图(B)。(A)子集成员数量可以通过浅红色和深红色填充来区分。(B)顶部图显示了交集的大小;左侧图显示了五个集合的大小;主图显示了这些交集来自哪里。交集和集合按字母顺序排序。(C)Venn计算器的示例。用户可以通过对象的方法轻松访问Venn对象及其子集。参见后面的代码示例。ggVennDiagram Shiny应用程序的屏幕截图(D)和TBtools中的ggVennDiagram插件(E)。
原生支持Upset图。Venn图和Upset图都是用于集合数据可视化的方法。在R平台上,Upset图的绘制现在由UpsetR包支持。然而,考虑到二者的应用场景十分一致,我们认为将Upset方法与Venn图结合起来,向用户提供统一的方法会更好。因此,我们在ggVennDiagram中支持Upset图的绘制。Upset图的实现方法依赖于南方医科大学余光创教授开发的aplot包,该包主要功能是让多个子图之间的坐标轴自动对齐。因此,我们只需要首先创建Upset图的子图,然后将三个组件合并在一起就可以了。图1显示了ggVennDiagram生成的Venn图和Upset图。需要说明的是,这里展示的包含了五个(以及六个和七个)集合的Venn图形状集合图形的形状是从Adrian Dusa编写的“venn”软件包中导入的。
功能完备的Venn计算器。ggVennDiagram软件包中使用S4和S3类存储结构化的中间数据,例如集合以及子集包含的成员和它们的名称等。这些类对用户通常是不可见的。不过,在论文审稿过程中审稿人提出了一个Venn计算器的说法,即这些功能可被用来帮助用户计算集合以及子集之间复杂的关系。为此,我们进一步完善了该部分的方法,实现了对两个以上集合(无上限)复杂逻辑关系下的计算任务。如图1C所示,现在可以使用这些方法获取多个集合的交集、并集和特异性成员的清单,为下一步进一步深入分析成员的结构提供了一个途径。
官方Shiny应用程序和TBtools插件。Shiny是一个Web应用程序框架,允许开发人员创建基于Web的交互式数据可视化工具。新版ggVennDiagram中包括了一个 Shiny应用程序,并已经被部署到shinyapps.io(这是由Posit/RStudio提供的基于云的服务)。Shiny应用程序提供了ggVennDiagram软件包大多数的功能,并且同时支持导出多种不同的图片格式。其中,导出的矢量格式图(svg、pdf和pptx)可以在Adobe Illustrator、Microsoft PowerPoint等常用办公软件中进一步编辑和调整(图1D)。另外,TBtools是一个综合性的、有完备用户界面的生物信息学软件,可以用于完成多种的生物信息学任务,由华南农业大学陈程杰博士开发。在TBtools-II提供的插件商店中,现在已经提供了ggVennDiagram 的Shiny应用程序(图1E)。总的来说,通过Shiny APP和TBtools插件,我们提供了交互式用户界面,使得不懂编程的用户仍然可以借助于ggVennDiagram生成高质量的图形。
功能示例
为了展示用法,我们首先生成一个包括四个集合的示例数据集。
library(ggVennDiagram)
genes <-paste("gene",1:1000,sep="")
set.seed(20231214)
x <- list(A=Ssample(genes,300),
B=sample(genes,525),
C=sample(genes,440),
D=sample(genes,350))
ggVennDiagram 的特有功能是将子集的成员用不同的颜色填充来可视化,使我们可以一眼看出哪些子集包含的成员更多。此外,ggVennDiagram 返回的是一个 ggplot 对象,可以使用 ggplot 函数进一步修改。下面的代码改变了填充所使用的颜色。
library(ggplot2)
ggVennDiagram(x) + scale_fill_gradient(low="grey90",high = "red")
ggVennDiagram包最主要的函数就是ggVennDiagram(),使用该函数提供的一些参数,可以调整图形的外观和标签等。例如,下面的一行代码可以改变集合边(以及集合名称)的颜色。
ggVennDiagram(x, set_color =c("blue","red","green","purple"))
ggVennDiagram支持2到7维的维恩图绘制。生成的图通常是发表级的。ggVennDiagram() 函数会检查第一个参数中有多少项,并自动调用相应的函数。因为5个以上集合的形状不能使用简单的椭圆或者圆来表示,所以这里的形状是从 venn 包里面导入并加工后使用的(
https://CRAN.R-project.org/package=venn)。
x <-list(A=sample(genes,300),
B=sample(genes,525),
C=sample(genes,440),
D=sample(genes,350),
E=sample(genes,200),
F=sample(genes,150),
G=sample(genes,100))
# two dimension Venn plot
ggVennDiagram(x[1:2],label = "none")
# three dimension Venn plot
ggVennDiagram(x[1:3],label ="none")
# four dimension Venn plot
ggVennDiagram(x[1:4],label ="none")
# five dimension Venn plot
ggVennDiagram(x[1:5],label ="none")
# six dimension Venn plot
ggVennDiagram(x[1:6],label = "none")
# seven dimension Venn plot
ggVennDiagram(x,label ="none")
新版本的 ggVennDiagram 原生支持了 Upset 图。当集合数目大于 7 或者设置 force_upset = TRUE 时会绘制 Upset 图。
# add an extra member in list
x$H =sample(genes,500)
ggVennDiagram(x)
#> Warning in ggVennDiagram(x): Only support 2-7 dimension Venn diagram. Will give a plain upset plot instead.
#> Warning: Removed 1 rows containing missing values (`position_stack()`).
ggVennDiagram(x[1:4], force_upset =TRUE, order.set.by ="name", order.intersect.by ="none")
下面介绍 Venn 计算器的功能。首先生成一个list,包括4个集合。将这个list转化成 Venn 对象后,可以使用 overlap()、discern()、union() 以及 discern_overlap() 等函数计算任意集合的不同组合形式下的子集所包含的成员,为后续的数据挖掘提供支持。
set.seed(20231225)
y =list(
A =sample(letters, 8) |> sort(),
B =sample(letters, 8) |> sort(),
C =sample(letters, 8) |>sort(),
D =sample(letters, 8) |> sort())
# view the list
y
#> $A
#> [1] "a" "e" "g" "o" "p" "s" "t" "v"
#>
#> $B
#> [1] "a" "d" "f" "i" "k" "s" "y" "z"
#>
#> $C
#> [1] "b" "g" "k" "o" "r" "s" "u" "w"
#>
#> $D
#> [1] "b" "c" "e" "h" "k" "q" "s" "y"
venn_y =Venn(y)
venn_y
#> An object of class 'Venn':
#> Slots: sets, names;
#> No. Sets: 4 SetNames: A, B, C, D.
# find the overlaping members of two or more sets
overlap(venn_y, 1:2) # members in both the first two sets
#> [1] "a" "s"
overlap(venn_y) # members in all the sets
#> [1] "s"
# find the different members between sets and set unions
discern(venn_y, 1) # members in set 1, but not in the resting sets
#> [1] "p" "t" "v"
discern(venn_y, c("A","B"), 3) # members in set A & B, but not in the 3rd set
#> [1] "a" "e" "p" "t" "v" "d" "f" "i" "y" "z"
# find the specific members in one or more sets
discern_overlap(venn_y, 1) # specific items in set 1
#> [1] "p" "t" "v"
discern_overlap(venn_y, 1:2) # specific items in set 1 and set 2
#> [1] "a"
代码和数据可用性
ggVennDiagram是开源软件,可在CRAN(
https://cran.r-project.org/package=ggVennDiagram)和GitHub(
https://github.com/gaospecial/ggVennDiagram)上免费获取。ggVennDiagram Shiny应用程序可在Shinyapps.io上访问(
https://bio-spring.shinyapps.io/ggVennDiagram)。TBtools插件可以通过软件的插件商店访问。补充资料(图表、表格、脚本、图形摘要、幻灯片、视频、中文翻译版本和更新资料)可在iMeta网站在线获取。
引文格式:
Gao, C.-H., Chen, C., Akyol, T., Dusa, A., Yu, G., Cao, B., and Cai, P. (2024). ggVennDiagram: intuitive Venn diagram software extended. iMeta 3, 69. doi: 10.1002/imt2.177
作者简介
高春辉(第一作者)
● 微生物学博士,业余软件工程师,现为华中农业大学资源与环境学院副研究员,硕士生导师。
● 研究方向为合成微生物群落的功能和调控机制。
蔡鹏(通讯作者)
● 华中农业大学资源与环境学院教授,博士生导师,国家杰出青年基金和优秀青年基金获得者。
● 研究方向为土壤生物膜与环境健康。
相关推荐
- 零基础入门AI智能体:详细了解什么是变量类型、JSON结构、Markdown格式
-
当品牌跳出固有框架,以跨界联动、场景创新叩击年轻群体的兴趣点,一场关于如何在迭代中保持鲜活的探索正在展开,既藏着破圈的巧思,也映照着与新一代对话的密码。在创建AI智能体时,我们会调用插件或大模型,而在...
- C# 13模式匹配:递归模式与属性模式在真实代码中的性能影响分析
-
C#13对模式匹配的增强让复杂数据处理代码更简洁,但递归模式与属性模式的性能差异一直是开发者关注的焦点。在实际项目中,选择合适的模式不仅影响代码可读性,还可能导致执行效率的显著差异。本文结合真实测试...
- 零基础快速入门 VBA 系列 6 —— 常用对象(工作簿、工作表和区域)
-
上一节,我介绍了VBA内置函数以及如何自动打字和自动保存文件。这一节,我们来了解一下Excel常用对象。Excel常用对象Excel有很多对象,其中最常用也最重要的包括以下3个:1.Workbo...
- 不同生命数字的生肖龙!准到雷普!
-
属龙的人总在自信爆棚和自讨苦吃之间反复横跳?看完这届龙宝宝的日常我悟了。属龙的人好像天生自带矛盾体:领导力超强可人缘时好时坏,工作雷厉风行却总在爱情里翻车。关键年份的龙性格差异更大——76年龙靠谱但不...
- 仓颉编程语言基础-面向对象编程-属性(Properties)
-
属性是仓颉颉中一种强大的机制,它允许你封装对类(或接口interface、结构体struct、枚举enum、扩展extend)内部状态的访问。它看起来像一个普通的成员变量(字段),但在其背后,它通过...
- Python中class对象/属性/方法/继承/多态/魔法方法详解
-
一、基础入门:认识类和对象1.类和对象的概念在Python中,类(class)是一种抽象的概念,用于定义对象的属性和行为,而对象(也称为实例)则是类的具体表现。比如,“汽车”可以是一个类,它有...
- VBA基础入门:搞清楚对象、属性和方法就成功了一半
-
如果你刚接触VBA(VisualBasicforApplications),可能会被“对象”“属性”“方法”这些术语搞得一头雾水。但事实上,这三个概念是VBA编程的基石。只要理解它们之间的关系,...
- P.O类型文推荐|年度编推合集(一百九十五篇)
-
点击左上方关注获取更多精彩推文目录2019年度编推35篇(1V1)《悖论》作者:流苏.txt(1V1)《桂花蒸》作者:大姑娘浪.txt(1V1)《豪门浪女》作者:奚行.txt...
- Python参数传递内存大揭秘:可变对象 vs 不可变对象
-
90%的Python程序员不知道,函数参数传递中可变对象的修改竟会导致意想不到的副作用!一、参数传递的本质:对象引用传递在Python中,所有参数传递都是对象引用的传递。这意味着函数调用时传递的不是对...
- JS 开发者必看!TC39 2025 最新动向,这些新语法要火?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。TC39第...
- 2025 年值得尝试的 5 个被低估的 JavaScript 库
-
这些JavaScript库可能不会在社交媒体或HackerNews上流行起来,但它们会显著提高您的工作效率和代码质量。JavaScript不再只是框架。虽然React、Vue和Sv...
- Python自动化办公应用学习笔记30—函数的参数
-
一、函数的参数1.形参:o定义:在函数定义时,声明在函数名后面括号中的变量。o作用:它们是函数内部的占位符变量,用于接收函数被调用时传入的实际值。o生命周期:在函数被调用时创建,在函数执...
- 16种MBTI人格全解析|测完我沉默了三秒:原来我是这样的人?
-
MBTI性格测试火了这么久,你还不知道自己是哪一型?有人拿它当社交话题,有人拿它分析老板性格,还有人干脆当成择偶参考表。不废话,今天我一次性给你整理全部16种MBTI人格类型!看完你不仅能知道自己是谁...
- JS基础与高级应用: 性能优化
-
在现代Web开发中,性能优化已成为前端工程师必须掌握的核心技能之一。本文从URL输入到页面加载完成的全过程出发,深入分析了HTTP协议的演进、域名解析、代码层面性能优化以及编译与渲染的最佳实践。通过节...
- 爱思创CSP-J/S初赛模拟赛线上开赛!助力冲入2024年CSP-J/S复赛!
-
CSP-J/S组初赛模拟赛爱思创,专注信奥教育19年,2022年CSP-J/S组赛事指定考点,特邀NOIP教练,开启全真实CSP-J/S组线上初赛模拟大赛!一、比赛对象:2024年备考CSP-J/S初...
- 一周热门
- 最近发表
-
- 零基础入门AI智能体:详细了解什么是变量类型、JSON结构、Markdown格式
- C# 13模式匹配:递归模式与属性模式在真实代码中的性能影响分析
- 零基础快速入门 VBA 系列 6 —— 常用对象(工作簿、工作表和区域)
- 不同生命数字的生肖龙!准到雷普!
- 仓颉编程语言基础-面向对象编程-属性(Properties)
- Python中class对象/属性/方法/继承/多态/魔法方法详解
- VBA基础入门:搞清楚对象、属性和方法就成功了一半
- P.O类型文推荐|年度编推合集(一百九十五篇)
- Python参数传递内存大揭秘:可变对象 vs 不可变对象
- JS 开发者必看!TC39 2025 最新动向,这些新语法要火?
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)