查看原文
其他

突破韦恩图数量限制,R包UpSetR集合可视化

生信小白鱼 鲤小白 小白鱼的生统笔记 2022-05-08
R包UpSetR集合可视化基础简介

传统的维恩图通常很难展示>5组以上的集合情形,而花瓣图则丢失了很多信息。与之相比,UpSet绘图提供了一种有效的方法来可视化多个集合的交集,它通过R包UpSetR实现。今天呢白鱼小编就给大家简介一下关于UpSet图以及R的UpSetR包。



UpSet图的集合展示模式


对于某元素在三个集合(A,B,C)中的分布状态,所有可能的组合如下。

其中,值1表示元素在该组中存在,值0表示元素不存在于该组。以下图为例,“1 1 0”表示元素存在于集合A、B,但不存在于C中。注意没有“0 0 0”的状态。

UpSet图使用每个元素在各集合中的1-0状态,将每个组合集的大小可视化。对于元素在各集合中的组合类型,共有三种模式。

(1)distinct mode:1表示存在于该集合中,0表示不在该集合中;例如,“1 1 0”表示集合A和B共享这个元素,而不在C中出现(等同于R的集合计算函数,setdiff(intersect(A, B), C));在这种模式下,七个组合集是维恩图中的七个分区,它们是互斥的。

(2)intersect mode:即交集模式,1表示存在于该集合中,考虑所有1的交集部分,0的情况不予考虑;例如,“1 1 0”表示集合A和B的交集,不关注其是否在C中出现(等同于R的集合计算函数,intersect(A, B));在这种模式下,七个组合集可以重叠。

(3)union mode:即并集模式,1表示存在于该集合中,考虑所有1的并集部分,0的情况不予考虑;例如,“1 1 0”表示集合A和B的并集,不关注其是否在C中出现(等同于R的集合计算函数,union(A, B));在此模式下,七个组合集可以重叠。


对于常规的Venn图而言,通常情况下展示的是“distinct mode”。因此,R包UpSetR默认展示的通常也是“distinct mode”。如下示意图,展示了在“distinct mode”中,二者的对应关系。



R包UpSetR基础简介


数据类型

  

UpSetR作图数据可以有两种表示方式。

(1)集合列表,其中每个集合都是向量,向量中放置元素字符,所有集合组合为列表数据类型。

list(set1 =c("a", "b", "c"),     set2 =c("b", "c", "d", "e"),     ...)

(2)0-1数据矩阵,或者逻辑矩阵,其中行是元素,列是集合,如下所示。

  set1 set2 set3                            set1    set2     set3h    1    1    1                       h    TRUE    TRUE     TRUEt    1    0    1                       t    TRUE    FALSE    TRUEj    1    0    0                       j    TRUE    FALSE    FALSEu    1    0    1                       u    TRUE    FALSE    TRUEw    1    0    0                       w    TRUE    FALSE    FALSE...                                    ...

集合列表和矩阵之间,可通过“list_to_matrix()”将列表转化为矩阵。

lt =list(set1 =c("a", "b", "c"),          set2 =c("b", "c", "d", "e"))list_to_matrix(lt) ##   set1 set2## a    1    0## b    1    1## c    1    1## d    0    1## e    0    1



UpSetR作图示例

  

UpSet图模式和UpSetR的输入数据类型简介完后,接下来就开始演示UpSetR的操作了。本篇示例数据和R代码的网盘链接:https://pan.baidu.com/s/1dYVf9cCx6z3IQdNPFCkRjw


网盘附件“otu_table.txt”为包含6个样本的OTU相对丰度表,来自16S高通量测序。我们想要得知6个样本中共有/特有OTU的类型数量。由于大于了5个样本,不便以传统的Venn图展示,在这里,我们将通过UpSet图展示出。接下来就通过示例初步简介UpSetR包的使用。library(UpSetR)

#读入作图文件,这里根据 OTU 丰度存在与否,转为 0-1 类型的数据矩阵使用
otu <- read.delim('otu_table.txt', header = TRUE, row.names = 1, sep = '\t')
otu1 <- otu
otu1[otu1 > 0] <- 1
UpSetR绘制UpSet图非常简单,通过upset()函数来完成。?upset()查看帮助文档,里面也有自带的丰富的示例演示。在这里就不和原示例重复了,使用自己的数据来。#作图
upset(otu1)如上文所述,UpSetR默认展示的是UpSet图的“distinct mode”。若该样本区域对应了实心点,则表示这些元素存在于该集合中;若未标注实心点,则表示这些元素不存在于该集合中。


#貌似并没有将所有集合类型完全展示出来?默认最多展示 5 组数据(nset = 5)的 40 种交集(nintersects = 40)
#我们期望将所有子集展示出来,nintersects 设置大一些
upset(otu1, nset = 6, nintersects = 100)
#也可自定义指定数据集名称
upset(otu1, sets = c('c1', 'c2', 'c3', 'c4', 'c5', 'c6'), nintersects = 100)

一般来讲,也不建议绘制很多的分组,当分组过多时,即使UpSetR能画出来,给人的感觉也乱糟糟的。


#添加排序
upset(otu1, nset = 6, nintersects = 100, order.by = c('freq', 'degree'), decreasing = c(TRUE, TRUE))


#关注特定的交集,或者某特定元素的分布,通过 queries 参数指定
#例如我们关注所有分组的交集、c1 分组的特有集,以及 Proteobacteria 在各交集中所含 OTUs 的种类数量
upset(otu1, nset = 6, nintersects = 100, order.by = c('freq', 'degree'), decreasing = c(TRUE, TRUE),
queries = list(list(query = intersects, params = 'c1', color = 'red'),
list(query = intersects, params = c('c1', 'c2', 'c3', 'c4', 'c5', 'c6'), color = 'blue'),
list(query = elements, params = c('taxonomy', 'Proteobacteria'), color = 'orange', active = TRUE)))


以上是常规的简单图作法,UpSet图的基本可视化及小调整等。同时,UpSetR允许我们自定义作图模式,如结合其它作图包的结果,统一展示在图中,丰富展示的信息。因此,UpSetR包因其功能强大已得到了广泛的应用。接下来将展示一个稍微复杂一点的示例。在示例数据“otu_table.txt”中,最后一列对应了这些OTU的物种分类(门水平),在这里,我们期望在得到UpSet图观测OTU种类分布的同时,将这些OTU所属门类群的原始相对丰度一并展示出。##复杂样式示例
#我们选择 6 组数据的共有 OTUs,并根据这些 OTUs 的所属分类统计相对丰度,绘制饼图和柱状图
#之后通过 UpSetR 将它们和韦恩图组合在一起
library(reshape2)
library(doBy)
library(ggplot2)

#获取 6 组共有 OTUs
select_otu <- rownames(otu1[rowSums(otu1[1:6]) == 6, ])
otu_select <- otu[select_otu, ]

#根据 taxonomy,计算这些共有 OTUs 的总丰度
phylum <- summaryBy(c1+c2+c3+c4+c5+c6~taxonomy, otu_select, FUN = sum)
names(phylum) <- c('taxonomy', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6')

phylum_melt <- melt(phylum, id = 'taxonomy')
phylum_melt$value <- phylum_melt$value * 100
phylum_melt_stat <- summaryBy(value~taxonomy, phylum_melt, FUN = mean)

#按 taxonomy 丰度大小降序排序,便于作图
phylum_melt_stat <- phylum_melt_stat[order(phylum_melt_stat$value.mean), ]
phylum_melt_stat$taxonomy <- factor(phylum_melt_stat$taxonomy, levels = c('Others', as.vector(phylum_melt_stat$taxonomy[-which(phylum_melt_stat$taxonomy == 'Others')])))

#taxonomy 丰度饼图
color = c('gray', '#8DD3C7', '#FFFFB3', '#BEBADA', '#FB8072', '#80B1D3', '#FDB462', '#B3DE69', '#FCCDE5', '#BC80BD', '#CCEBC5')

plot1 <- function(mydata, x, y) {
ggplot(phylum_melt_stat, aes(x = '', y = value.mean, fill = taxonomy)) +
geom_bar(stat = 'identity', show.legend = FALSE) +
coord_polar(theta = 'y') +
scale_fill_manual(values = color) +
theme(panel.grid = element_blank(), panel.background = element_blank(), axis.text.x = element_blank(), plot.background = element_blank()) +
labs(x = NULL, y = 'Number of all shared OTUs: 1628\nAverage abundance of main phylum')
}

#taxonomy 丰度柱状图
phylum_melt$taxonomy <- factor(phylum_melt$taxonomy, levels = levels(phylum_melt_stat$taxonomy))

plot2 <- function(mydata, x, y) {
ggplot(phylum_melt, aes(x = variable, y = value, fill = taxonomy)) +
geom_col(position = 'stack', width = 0.6) +
scale_fill_manual(values = color) +
theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent')) +
labs(x = '', y = 'Relative abundance (%)', fill = NULL)
}

#组合样式,通过 attribute.plots 参数指定额外的图形
upset(otu1, nset = 6, nintersects = 100, order.by = c('freq', 'degree'), decreasing = c(TRUE, TRUE),
queries = list(list(query = intersects, params = c('c1', 'c2', 'c3', 'c4', 'c5', 'c6'), color = 'blue', active = TRUE)),
attribute.plots = list(gridrows = 80, ncols = 2,
plots = list(list(plot = plot1, mydata = NA, x = NA, y = NA, queries = FALSE),
list(plot = plot2, mydata = NA, x = NA, y = NA, queries = FALSE))))

#注:
#这里额外添加的柱状图和饼图,使用了原始的 OTU 丰度数据,独立于 UpSet 图的 0-1 类型的 OTU 数据本身
#构建外部 ggplot2 命令时直接打包在 plot1、plot2 函数内部
#尽管如此,plot1、plot2 仍需要添加“mydata, x, y”三个参数,不能空着,否则无法被 upset() 识别
#但可以通过将参数传递为空值解决


今天的分享就先到这里了,UpSetR包功能强大已无需多言,后面的,就需要我们慢慢地熟练它的使用了。


链接

差异分析及显著性“abc”标记的R操作示例

R语言绘制提琴图

R语言绘制箱线图

R语言绘制双向柱状图

R语言绘制堆叠面积图

R语言绘制堆叠柱状图

R语言绘制星形图

R语言绘制圆环图

R语言绘制饼图(扇形图)

R语言绘制花瓣图

R语言绘制韦恩图

韦恩图在线绘制网站



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

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