查看原文
其他

【孙老湿画图系列--第五弹】 维恩图 Venn Diagram

孙怀博 生信者言 2022-03-29

John Venn1834.8.4─1923.4.4),英国数学家,在数学、逻辑学、哲学领域有所成就。

 

Venn图是John Venn1880发表《On the Diagrammatic and Mechanical Representation of Propositions andReasonings》一文中首次使用的。Venn主要用来表示集合及其相互之间的关系(如下图)。根据是否考虑比例,可将Venn图分为逻辑比例和精确比例两种,一般4个及其以上的样本无法用精确比例表示。



Venn表示样本之间的集合关系,所以样本越多复杂度越高,如下公式所示:

一般情况5个样本的venn图就已经很复杂了,5个样本共有25 – 1 = 31个组合。多于5个样本就无法用椭圆表示,下图表示5711个样本的venn图:


 

R中绘制venn图包很多,gplotsvenneulerVennDiagram等。本文主要介绍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中的实现过程,并没有特意追求美观,故很多图的细节部分修饰有限,大家重点理解实现过程。


本期维恩图就分享到这里!本周四,饼图,孙老湿与你不见不散!


生信者言

让生信分析不再遥不可及

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存