本人最近在做比较基因组学分析的时候,发现用韦恩图来表示共有、特有的基因家族虽然直观,但一旦物种数目增多,就会变得不好看。于是,我师兄提议可以用Upset图来代替,我仿佛打开了新世界的大门,因为这种upset图确实在物种数多的情况下比韦恩图好看太多了。
这个图主要由三部分组成,让我们通过一个简化的日常生活场景来解释这个图。
假设你有多个不同的水果篮,每个篮子都有不同的水果。
左边的条形图(集合大小柱状图):
这就像每个篮子旁边都有一个标签,告诉你这个篮子里有多少个水果。所以,如果一个篮子里有10个苹果,那么它的标签上就写着10。
上面的条形图(交集大小柱状图):
这个部分告诉你,如果你从不同的篮子里同时拿出水果,你会得到多少个水果。比如,你可能同时从篮子A和篮子B中拿出3个苹果和2个香蕉。那么这个上面的条形图就会显示5,表示你总共拿了5个水果。
下面的点(矩阵视图):
这就像一个清单,告诉你哪些篮子被同时考虑了。如果你看到一个点在篮子A和篮子B下面,那就意味着你同时从这两个篮子里拿出了水果。
所以,总的来说,这个图就是一个高级的“水果拿取记录”。左边告诉你每个篮子里有多少水果,上面告诉你你一次从多个篮子里拿了多少水果,而下面的点则告诉你每次你是从哪些篮子里拿的。
那么,了解完Upset图后,现在我们就来看看如何基于这个R包绘制Upset图。
首先,我之前绘制韦恩图用的是venn包以及VennDiagram包,其实UpSetR包的输入文件处理成和Venn包所需的输入文件一致就可以了。
很简单,最基础的代码基本上就是:
library(UpSetR)
upset(fromList(sets),nsets = 10)
很多细节都是可以调整的,大家可以通过?upset查看所有支持的参数,下面介绍一些常用的。
upset(fromList(sets),
order.by = "freq", # 排序方式
nsets = 5, # 展示几个集合,按照数量从大到小排列,或者使用sets参数指定集合名字
mb.ratio = c(0.55,0.45), # 条形图和矩阵的相对比例
number.angles = 30, # 条形图上面数字角度
point.size = 3, # 点的大小
line.size = 1.2, # 线条粗细
mainbar.y.label = "size of intersection", # 上面条形图的标题
sets.x.label = "the number of each sets", # 坐标条形图的标题
text.scale = c(1.3, 1.3, 1, 1, 2, 1.2) # 元素大小
)
排序方式: 使用order.by = "freq"可以确保交集的大小从大到小进行排序。
展示集合数量:nsets = 5将只显示前五个最大的集合。
条形图与矩阵比例:mb.ratio = c(0.55,0.45)决定了主条形图和矩阵的比例。
角度与大小调整: 通过number.angles = 30和point.size = 3及line.size = 1.2来调整条形图数字的角度、点的大小和线条的粗细。
标题和标签: 为上面的条形图和坐标条形图增加描述性标题。
元素大小: 使用text.scale来调整文本和标签的大小。
颜色调整: 选择一种和谐的颜色方案,比如深蓝色、火砖红和灰色。
特定列的个性化: 使用queries参数来突出显示指定的交集,并给它们赋予独特的颜色。
text.scale参数在 UpSet 图中控制不同文本元素的大小。以下是每一个元素的详细解释:
intersection size title:
这是上方条形图的标题。它描述了交集的大小,即两个或多个集合共有的元素数量。
intersection size tick labels:
这是上方条形图y轴的刻度标签。它们通常是数字,表示交集中元素的数量。
set size title:
这是左边(或右边)条形图的标题。它描述了每个单独集合中的元素数量。
set size tick labels:
这是左边(或右边)条形图y轴的刻度标签。这些标签表示每个单独集合中的元素数量。
set names:
这些是集合的名称。在矩阵视图中,这些名称与每行相对应,表示不同的集合。
numbers above bars:
这是上方条形图上的数字。它们表示每个交集中元素的实际数量,直接放置在每个柱子上方。
基于以上参数,我们就可以自由地调整Upset图了。