# 安装包
if (!requireNamespace("ggplot2", quietly = TRUE)) {
install.packages("ggplot2")
}if (!requireNamespace("ggVennDiagram", quietly = TRUE)) {
install.packages("ggVennDiagram")
}if (!requireNamespace("VennDiagram", quietly = TRUE)) {
install.packages("VennDiagram")
}
# 加载包
library(ggplot2)
library(ggVennDiagram)
library(VennDiagram)
韦恩图
对于Venn图的可视化,常用的R包有ggVennDiagram和VennDiagram包,相比于VennDiagram包而言ggVennDiagram具有适用于更多分组、可以适配ggplot2语法和可以灵活设置的输出格式等优点,学习和后期处理更简单。然而ggVennDiagram的集合颜色只能设置为与元素个数相关的连续型渐变色,不能设置为每个集合一种颜色的离散型色彩,VennDiagram则恰好相反,因此可以根据具体需求选择需要使用哪个R包进行绘图。
示例
环境配置
系统要求: 跨平台(Linux/MacOS/Windows)
编程语言:R
依赖包:
ggplot2
;ggVennDiagram
;VennDiagram
数据准备
数据使用模拟基因集,假设我们有多组不同的处理A~D,在不同处理下各自产生了一定数量的差异表达基因。 ggVennDiagram要求的输入格式为一个list,list中的每个元素都需要有对应的名称以及包含的子元素。
<- paste("gene",1:1000,sep="")
genes set.seed(123)
<- list(A=sample(genes,300),
x B=sample(genes,525),
C=sample(genes,440),
D=sample(genes,350))
可视化
ggVennDiagram基本参数:
-
x
: 需要输入的list集合数据 -
category.names
: 集合名称,默认为list中定义的名称 -
show_intersect
: 设置为TRUE时,输出可交互式图像 -
set_color
: 集合的描边颜色,可输入一个或数量与集合一致的颜色 -
set_size
: 集合标签的大小 -
label
: 集合中数字标签的类型,可从”both”, “count”, “percent”, “none”中选择一个输入,默认为”both” -
label_alpha
: 数字标签的背景透明度 -
label_geom
: 数字标签的图层位置,可从”label”, “text”中选择一个,默认为”label”,当输入”text“时标签将位于集合色块的下方 -
label_color
: 数字标签的颜色 -
label_size
: 数字标签的大小 -
label_percent_digit
: 数字标签的小数保留位数 -
label_txtWidth
: 在交互模式时,显示交集元素的文本框宽度 -
edge_lty
: 集合描边的线条类型,默认为”solid“实线,其他可以设置的线条类型有:“blank”, “solid”, “dashed”, “dotted”, “dotdash”, “longdash”, “twodash” -
edge_size
: 集合描边的线条宽度 -
force_upset
: 是否使用upset图展示交集情况 -
nintersects
: 绘图采用的集合数量,如果为NULL则使用所有的集合 -
order.intersect.by
: 绘制upset图时交集的排列方式 -
order.set.by
: 绘制upset图时集合的排列方式 -
relative_height
: 绘制upset图时上方柱状图的相对高度 -
relative_width
: 绘制upset图时左侧柱状图的相对宽度
1. 基础韦恩图
# 基础韦恩图
ggVennDiagram(x)

此图展示了在不同处理下差异基因的交集情况。
2. 美化韦恩图
ggVennDiagram中集合的颜色是根据集合中包含的元素数量设置的连续型变量。可以通过ggplot2中的scale_fill_gradient
或scale_fill_gradient2
等函数修改集合颜色,例如使用以下代码实现连续色彩设置:
# 颜色设置
ggVennDiagram(x) + scale_fill_gradient(low="grey90",high = "red")

也可以使用scale_fill_gradient2
来更自由地定义颜色:
# 颜色设置
ggVennDiagram(x) + scale_fill_gradient2(low="grey90",mid = "yellow",midpoint = 100,high = "red")

更复杂的色彩设置可以通过调用调色板完成:
# 颜色设置
ggVennDiagram(x) + scale_fill_distiller(palette = "Set1")

需要自定义调色板也非常简单:
# 颜色设置
<- c('#E64E00','#65B48E','#E6EB00','#E64E00')
cols <- colorRampPalette(cols)
pal ggVennDiagram(x) + scale_fill_gradientn(colors = pal(10)) # 数字为色阶数量

ggVennDiagram同样可以通过edge_lty
、edge_size
、set_color
自定义集合的边框。
# 边框设置
ggVennDiagram(x, set_color=c("blue","red","green","purple"), edge_lty="dashed", edge_size=2)

字体设置可以通过以下参数修改:
# 字体设置
# 下列参数中较为特殊的是label,label的四个可选输入中"percent"为仅显示百分比, "count"为仅显示数量,“none”为不显示。
ggVennDiagram(x, set_size = 5, label = "percent", label_alpha = 0,
label_color = "red", label_size = 5, label_percent_digit = 2)

3. VennDiagram
我们还可以通过VennDiagram包来绘制韦恩图。
venn.diagram基本参数:
-
x
: 需要输入的list集合数据 -
filename
: 输出文件名 -
imagetype
: 输出文件类型可从”tiff”,“png”,“svg”中选择 -
units
: 图片尺寸单位可从”cm”,“px”,“unit”中选择 -
height
: 图片高度 -
width
: 图片宽度 -
resolution
: 图片分辨率 -
compression
: 图片压缩算法 -
scaled
: 根据比例显示集合大小 -
alpha
: 集合透明度 -
fill
: 集合颜色 -
col
: 线条颜色 -
lwd
: 线条粗细 -
lty
: 线条形状,1为实线, 2为虚线, blank为无线条 -
label.col
: 数字颜色 -
cex
: 数字大小 -
cat.dist
: 标签距离集合的远近 -
cat.pos
: 标签相对于集合的角度 -
cat.cex
: 标签字体大小 -
cat.col
: 标签颜色
VennDiagram包的核心函数为venn.diagram
,该函数不能直接将图像绘制到画板上,可以通过与grid::grid.draw()
函数配合将图像绘制到画板。
<- venn.diagram(x,filename = NULL);grid::grid.draw(p) p

VennDiagram集合颜色设置于ggVennDiagram最大的区别在于颜色是根据不同集合设置的离散型颜色,设置方法如下:
# 仅输入一个颜色时,所有集合显示同一个颜色,当输入颜色数量与集合数量一致时每个集合各自一个颜色,也可以使用指定命名的方式精确设置集合的颜色
<- venn.diagram(
p filename = NULL,
x, fill = c("A"="#2E75A2","B"="#FBD75F","C"="#379337","D"="#C13A3C"),
alpha= 0.3);grid::grid.draw(p)

线条设置:
<- venn.diagram(
p filename = NULL,
x, col = c("A"="#2E75A2","B"="#FBD75F","C"="#379337","D"="#C13A3C"),
lwd = 0.3, lty = 2);grid::grid.draw(p)

字体设置,如果需要调整位置请使用 cat.dist
、cat.pos
参数:
<- venn.diagram(
p filename = NULL,
x, cat.col =c("A"="#2E75A2","B"="#FBD75F","C"="#379337","D"="#C13A3C"),
label.col = "red");grid::grid.draw(p)

按照比例展示集合大小,该模式仅适用于两个集合使用:
<- venn.diagram(
p c("A","B")], filename = NULL, fill= c("A"="#2E75A2","B"="#FBD75F"),
x[scaled = T
::grid.draw(p) );grid

应用场景

此图中R1-R4为四种不同的基因型,由于R2 R4在目的基因处基因型完全相同,因此R2R4共有的差异表达基因可能就是目的基因的下游 [4]。
参考文献
[1] Yu Y, Li W, Liu Y, Liu Y, Zhang Q, Ouyang Y, Ding W, Xue Y, Zou Y, Yan J, Jia A, Yan J, Hao X, Gou Y, Zhai Z, Liu L, Zheng Y, Zhang B, Xu J, Yang N, Xiao Y, Zhuo L, Lai Z, Yin P, Liu HJ, Fernie AR, Jackson D, Yan J. A Zea genus-specific micropeptide controls kernel dehydration in maize. Cell. 2025 Jan 9;188(1):44-59.e21. doi: 10.1016/j.cell.2024.10.030. Epub 2024 Nov 12. PMID: 39536747.