【孙老湿画图系列--第五弹】 维恩图 Venn Diagram
John Venn(1834.8.4─1923.4.4),英国数学家,在数学、逻辑学、哲学领域有所成就。
Venn图是John Venn在1880发表《On the Diagrammatic and Mechanical Representation of Propositions andReasonings》一文中首次使用的。Venn图主要用来表示集合及其相互之间的关系(如下图)。根据是否考虑比例,可将Venn图分为逻辑比例和精确比例两种,一般4个及其以上的样本无法用精确比例表示。
Venn图表示样本之间的集合关系,所以样本越多复杂度越高,如下公式所示:
一般情况5个样本的venn图就已经很复杂了,5个样本共有25 – 1 = 31个组合。多于5个样本就无法用椭圆表示,下图表示5、7、11个样本的venn图:
在R中绘制venn图包很多,gplots、venneuler、VennDiagram等。本文主要介绍VennDiagram包的使用,VennDiagram包最多只能绘制5个样本的venn图。
首先是数据的准备,第一列是ID信息(比如gene_id),第2-5列表示样本是否检测到这个基因(值的大小无所谓,0表示没有检测到,大于0表示检测到),保存到以tab格式分割的txt文件中(test_gene.txt),如下表所示:
ID | sample1 | sample2 | sample3 |
gene_1 | 0 | 0 | 16 |
gene_2 | 12 | 0 | 20 |
gene_3 | 7 | 2 | 28 |
gene_4 | 0 | 8 | 11 |
gene_5 | 0 | 0 | 16 |
gene_6 | 32 | 0 | 0 |
安装VennDiagram包:
install.packages("VennDiagram") # 安装VennDiagram
library(VennDiagram) # 加载VennDiagram
dat <- read.table("test_gene.txt",header = T, row.names = 1) #读取保存的文件
head(dat)
VennDiagram绘图的主函数venn.diagram(),可选参数很多,主要有以下几个:
x | 输入数据,list |
filename | 输出文件名称 |
height | 输出文件高度 |
width | 输出文件宽度 |
fill | 填充的颜色 |
cat.col | 样本标签的字体颜色 |
cat.cex | 调整样本标签的字体大小 |
lwd | 调整图形线条宽度 |
lty | 调整线条类型 |
col | 调整线条颜色 |
alpha | 调整透明度 |
cex | 调整label大小 |
margin | 调整边框距离 |
因为venn.diagram()需要的输入是list的格式,所以我们的dataframe格式的数据需要转换一下。就是说某个样本检测到了某个基因,就挑选出对应的gene_id, 没有检测到,就不用取出,给大家提供一个转换的方式,如下:
dat.list <-mapply(function(x){rownames(dat[dat[x] > 0, ])}, names(dat))
我们只要3个样本,所以指定我们需要展示的颜色
color <- c('blue', 'purple', 'green')
venn.plot <-venn.diagram(dat.list,euler.d = TRUE,
filename = "gene_id.tiff",
fill = color, cat.col = color, cat.cex = 1.5,
margin = c(0.1,0.1,0.1,0.1))
但是有时候我们并不知道各个集合都包含什么元素,而只知道集合及相互之间交集的大小,这个时候如何绘制韦恩图呢?不用担心,VennDiagram包还给我们提供了另外几个函数:绘制两个集合的韦恩图的draw.pairwise.venn,三个集合的draw.triple.venn,四个集合的draw.quad.venn、四个集合的draw.quintuple.venn。我们此处只介绍三个集合的韦恩图的draw.triple.venn的用法(其他用法一样):
area1 => 65 第一个样本的面积(检测到的基因数),area2, area3类似。
n12 => 表示样本1和样本2共有的面积(共有的基因数),n23, n13, n123类似
tiff(filename ="Triple_Venn_diagram.tiff", compression = "lzw")
venn.plot <- draw.triple.venn(
area1 = 65,
area2 = 75,
area3 = 85,
n12 = 35,
n23 = 15,
n13 = 25,
n123 = 5,
category = c("First","Second", "Third"),
fill = c("blue", "red","green"),
lty = "blank",
cex = 2,
cat.cex = 2,
cat.col = c("blue","red", "green")
)
dev.off()
本系列课程主要侧重于讲解图形原理,以及在R中的实现过程,并没有特意追求美观,故很多图的细节部分修饰有限,大家重点理解实现过程。
本期维恩图就分享到这里!本周四,饼图,孙老湿与你不见不散!
生信者言
让生信分析不再遥不可及