upset数据集合的表示
Upset:集合交集的可视化
1集合和交集
在科学的数据分析中,集合是一个普遍性的概念。土壤样本中发现的细菌,生物通路中发现的酶,染色体中发现的变异,通过光谱测定法在血清样本中发现的蛋白质,或者在癌症病人中发现的基因变异,都可以被当作集合处理。即使有很多的研究仅限于不同集合的识别,但是我们通常仍需要通过集合之间的交集研究多种集合的相同与不同之处。
集合和他们之间的交集如果直接的表示出来,最多只能有3到4种集合,一旦超过可这个阈值,可视化集合之间的关系就很困难了,比如说3个集合可能有8种交集,10个集合可能有1024种交集,n 个集合最多有2n 交集。
本篇文章用例为:多形性成胶质细胞瘤癌症病人群体,此数据集代表了100个在多形性成胶质细胞瘤最容易突变的基因,283个癌症样本。其中:第一行为基因标识符(基因名称),第一列为样本编号,数字1:表示此样本中对应的基因发生突变,数字0: 表示此样本中对应的基因不发生突变。此样本中,集合:是一列样本,这些样本中这种基因都发生突变,集合的交集:表示这些样本中都有这几种相同的突变。
2文氏图和欧拉图
我们最常用的表示集合交集的方法就是文氏图和欧拉图,欧拉图和文氏图都有由圆形或椭圆型组成,面积可表示为集合的大小,两种图区别很小,(文氏图和欧拉图的区别)不同的是文氏图包含所有可能的集合,包括空集,但是在欧拉图上不会表示出空集。
B 3 A 4
4 1 3 1 3
A B C
0 1 1 C 3
欧拉图 文氏图
欧拉图(文氏图)很适合表示两个或三个集合的交集的大小,集合的大小与图形的面积成正比,重合部分的面积就是表示交集,虽然面积的表示方式没有长度和位置表示来的精确,但是小数量集合很受大家欢迎,我们可以用R 包:venneuler package 来画欧拉图。
Venneuler 包:
根据集合的参数画出文氏图
用法:venneuler(combinations, weights, ...)
参数:
combinations :可以是以下的任何一个:
∙
∙
∙
∙ 一组字符向量,集合连接部分用&号 – e.g. c("A","B","A&B")) 已命名的数字向量,说明了交集部分的权重, – e.g.c(A=1, B=2, `A&B`=0.5) 一个字符矩阵包含两列,元素对应集合的表示方式,第一列是元素,第二列集合的名字,weights 忽略权重。 逻辑或数字矩阵,每一列代表一个集合,而每一行的非0部分表示集
合共同出现的部分值,每一行用非0值(或TRUE )表示共同出现;
权重,逻辑矩阵:存在为1,数值矩阵:每一行的加和。
为了方便起见,一般用data frames数据框代替矩阵模型,之后强制转化为矩
阵: as.matrix().
weights
... 如果 combinations 是一个字符向量,那么这个参数就表示交集部分的权重。其他情况的时候可以忽略不写。 额外参数,通常不同
Value :
centers
colors
labels 圆的中心位置,列x,y 的坐标 diameters 圆的直径 圆的颜色值,在0.1之间 圆的标签
个人认为:上面的四项比较具有实际意义,可以调整图像,下面
的四个部分一般是对图像效果和精确度的评估,实际意义不大。
residuals 残差,输入的交集面积和最后调整的交集面积区别的的百分比
stress 应力值
stress01 基于随机数据的0.01的临界应力值
stress05 基于随机数据的0.05的临界应力值
例:
library(rJava)
> library("venneuler", lib.loc="D:/Program Files/R/R-3.2.1/library") #下面的例子是第二种情况,已命名的数字向量:以A,B,C 命名的三个集合,A#B交集为0.1,AC 交集为0.2,BC 交集为0.1,ABC 交集为0.1,
> vd
#作图 > plot(vd)
#
下面是第三种情况,字符矩阵,第一列为元素,第二列为元素所在的字符
m
sets=c("A","A","B","C","C"))
v
plot(v)
#下面的例子是第四种情况,数字矩阵,先用数据框表示,后转换为矩阵。注意,个人认为,矩阵中的数字不是集合中的元素。第一行表示A 集合(不包含任何其他集合)为1.5, 第二行只有AB 非0,表示AB 的交集,
#由下面的例子可以看出,矩阵每一行表示图的一个部分,非0的集合参与其中,每一行分别表示:A,A&B,A&C,B,C,每一行加和为权重。
m
+ B=c(0 , 0.2, 0 , 1, 0),
+ C=c(0 , 0 , 0.3, 0, 1)))
> v
> plot(v)
#新增了B&C
m
B=c(0 , 0.2, 0 ,0.1,1,0),
C=c(0 , 0 , 0.3,0.1,0,1)))
v
plot(v)
#改变图像的属性
str(v)
v$diameters=c(1,1,1)
v$colors=c(0.2,0.3,0.4)
plot(v)
我认为,一般情况下我们经常会用到第三种情况,和第四种情况的逻辑矩阵。一般我们会知道集合,和集合中的元素,并画出他们的文氏图。
举例:多形性成胶质细胞瘤最容易突变的基因中的TP53,PTEN,TTN
library("venneuler", lib.loc="D:/Program Files/R/R-3.2.1/library") > mutations venn
> venn
> venneuler(venn)
$centers
x y
PTEN 0.5524349 0.5864998
TP53 0.3695089 0.4903111
TTN 0.5780562 0.4231891
$diameters
PTEN TP53 TTN
0.5003373 0.4678013 0.5003373
$colors
PTEN TP53 TTN
0.25 0.50 0.75
$labels
[1] "PTEN" "TP53" "TTN"
$residuals
TTN TP53 TP53&TTN PTEN
2.999709 3.468399 -5.183191 2.683469
PTEN&TTN PTEN&TP53 PTEN&TP53&TTN
-4.161779 -4.866951 3.867067
$stress
[1] 0.06769964
$stress01
[1] 0.05612327
$stress05
[1] 0.1282971
attr(,"class")
[1] "VennDiagram"
> muta_venn
> plot(muta_venn)
此文氏图表示了三个基因集合的交集。
二、热图
如果要一次性画出10个或者更多集合的交集是很难的,然而我们也可以借助热图表示两两集合的交集,可以用条形图在热图旁标注出集合的大小,但是热图只能显示出交集的程度,无法知道具体的大小,而且,仅限于两两集合交集的情况。
文献中的热图:
例:多形性成胶质细胞瘤突变基因(本人做的热图,但是heatmap 函数无法表示条形图,且图例不完善,可以用HeatMap 包)
library(graphics)
library(grDevices)
#导入数据,选用数据的前15个基因。
mutations
mutation
mut_matrix
#创建一个交集数目的矩阵,行列名字为基因的名字
muta_heat
rownames(muta_heat)
colnames(mutat_heat)
#计算距离矩阵,矩阵行名和列名都为基因集合
for(i in 1:15){
for(j in 1:15){
if(i==j){
muta_heat[i,j]
}else
muta_heat[i,j]
}}
#画热图,对称热图
rc
cc
muta_heatmap
scale="column",
RowSideColors = rc, ColSideColors = cc,
margins=c(10,10),revC=T,
symm=T,Rowv=NA,Colv=NA)
此热图表示出了15个基因集合的配对交集情况。颜色越深,越偏向粉色,证明交集越大,此基因上发生突变的样本越多。
三、UpSet :: Visualization of Intersecting Sets
1.1 Set Visualization Tasks集合可视化的任务
集合可视化的任务可以分为元素的相关信息,集合与集合之间的关系相关,还有元素属性相关。
Set-related tasks are concerned with the relationships between sets, e.g., to find out about intersections (A ∩B ), the relative complement (A \B), or the unions (A ∪B ) between two sets. This class also
contains those related to cardinality: identifying sets, intersections, or complements that contain many, few, or a disproportional amount of elements
集合相关任务:寻找集合之间的关系,例如交集A ∩B ,补集A \B,并集A ∪B ,
Element-related tasks describe tasks that focus on elements, e.g., to identify the elements of a set or intersection, or to identify the sets and intersections of an element. Another task is finding out which elements are contained in intersections of a certain degree, e.g., identifying all elements that are in exactly or at least k sets. Attribute-related tasks are concerned with the attributes of the elements, such as reading the attribute value of an element, or
analyzing
the distribution of attribute values in a set or intersection, or
comparing attribute values between multiple sets. It is important to note that
there is a strong duality between attributes and set membership. Sets membership is interpretable as an attribute of an element, and many attributes can be converted into set assignments.
UpSet was designed to address these tasks and supports 23 out of 26 tasks identified by Alsallakh et al [3]. The remaining three pertain to interactive set creation (A7 and C5) and comparing sets according
to a similarity measure (B11). Conceptually, UpSet can support these
tasks as well.
各种集合之间会有相交和不相交的部分,当集合很多时问题就变得复杂了。为了便于大家观察,对集合进行可视化的作图是很好的方法,少量集合之间就采用了文氏图。但集合多了要想画出易分辨的图实在是一件很费脑筋的事。
方便起见,我们一般用基因名表示集合名,每一集合样本数量不同,如何表示集合的大小呢,可以这样想到,用一相应长度的灰色长条可视化集合的大小,同样集合交集的大小也可以这样表示,受到数据中1,0逻辑意义的影响,样本中基因数目相同,没一样本中基因有突变和不突变之分,那么我们完全可以假设用一组与样本基因数目相同的圆点代表样本,实心表示此基因发生,空心表示不发生突变,
这时UpSet 可以处理这个问题。
UpSet 用来分析以集合为基础的数据。它不仅可视化集合的交集(intersection ),还有它们的属性(attributes),以及数据集中的元素(elements)。 他的解决方法是把所有的交集进行二进制编码,在编码矩阵上方用条形表示每一个交集的大小,条形表示的数字如果很大也可以进行log 转换,交集可以按集合大小排序(sort ),也可以按交集之间共有的集合进行分类成组,空集可以隐藏起来。以此我们有一个可视化网页工具:UpSet
网址: =
例:下面是一个交集可视化的平台,用例为,一组基因突变数据集,此数据集代表了100个在多形性成胶质细胞瘤最容易突变的基因
Fig:此图表示出基因集合之间的关系,集合交集的可视化,和交集的分组,有变得元素视图表示出了元素数量和属性的统计。
在数据分析中,了解多重集合之间的关系是一个基础工作,就像下图一个例子:
Fig :name 列包含唯一的标识符,age 列描述的是一个属性,characteristics 包含集合的信息。
(a):按照集合的度聚类
(b):按照共同包含的集合聚类
(c):按照集合之间的关联关系聚类
(d):嵌套聚类
上图表示各个符号所代表的意义,实心圆代表must 存在,带点的圆代表maybe 可以存在,一般是交集的部分。空心圆代表一定不存在。
灵活的范围滑动杆,使文件内容与范围互相调整,断裂证明实际的范围比图中显示的要大。
1、得到高分辨率的图像:
如果你想用以网站为基础的交互式版本,可以打印PDF 格式的图像,或者图像软件像,Adobe Illustrator。 或者选用UpSetR 包。
2、导入本地化样本:
UpSet 除了可以用自带演示样本集,我们也可以提供自己的数据文件,把数
据文件和描述文件打包,发送到一个公共的网络服务器(如Dropbox 云盘和谷歌云盘)。如果数据不便公开,也可以本地化配置UpSet.
数据文件的格式:
UpSet 对于集合用一个二进制编码的方式表示,集合A,B,C 和三个元素,每个元素一行。
对于UpSet 来说主要的特点就是可视化与集合和交集相关的属性,例子:movie dataset
Name;ReleaseDate;Action;Adventure;Children;Comedy;Crime;Documentary;D rama;Fantasy;Noir;Horror;Musical;Mystery;Romance;SciFi;Thriller;War;W estern;AvgRating;Watches
Toy Story (1995);1995;0;0;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;4.15;2077
Jumanji (1995);1995;0;1;1;0;0;0;0;1;0;0;0;0;0;0;0;0;0;3.2;701
Grumpier Old Men(1995);1995;0;0;0;1;0;0;0;0;0;0;0;0;1;0;0;0;0;3.02;478 WaitingtoExhale(1995);1995;0;0;0;1;0;0;1;0;0;0;0;0;0;0;0;0;0;2.73;170 FatheroftheBridePartII(1995);1995;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;3.01;296
上例中,第一列(index 0)是电影的名字(元素的标识符ID ),第二列(index
1) 是上映年份,也是电影的属性,index 2-18是集合列,剩下都是属性。
为了让UpSet 理解这种数据文件,需要提供一个简单的JSON 数据描述文件,针对上述数据文件,描述文档格式如下:
{
"file":
"https://dl.dropboxusercontent.com/u/36962787/UpSet/movies.csv",
(File :描述数据文件的路径,一般是URL 路径,除非运行本地文件,是本地路径。 )
"name": "Online Movies Genres ",(Name :文件名。)
"header": 0, (header :定义行和列的号从0开始计数。)
"separator": ";",(separator :定义矩阵分割符。)
"skip": 0, (skip :很少用,但是具有跳过开头行的功能,例如,评论文字)
"meta": [
{ "type": "id", "index": 0, "name": "Name" },
{ "type": "integer", "index": 1, "name": "Release Date" }, { "type": "float", "index": 19, "name": "Average Rating", "min": 1, "max": 5 },
{ "type": "integer", "index": 20, "name": "Times Watched" }
],
(meta :是一列矩阵,用[]括起来,矩阵的每一列用{}括起来。每一行矩阵描述了除集合列之外的所有列的类型,序号,名字,等信息。
上面的例子中,"index": 0表示定义的是第一列,类型为标识符,标识符的名字是"Name" 。 )
"sets": [
{ "format": "binary", "start": 2, "end": 18 }
]
(sets :用[]括起来,定义集合列。{}内包含集合格式(一般是二进制),集合在数据中所属的列。上述例子中, "start": 1, "end": 3 表示集合是从第二列到第四列。UpSet 目前支持二进制形式,将来会添加其他的格式 。)
}
Meta Information:
我们也可以对上述的描述文件进行扩展。
{
"file": "data/movies/movies.csv",
"name": "Movies Genres",
"header": 0,
"separator": ";",
"skip": 0,
"meta": [
{ "type": "id", "index": 0, "name": "Name" },
{ "type": "integer", "index": 1, "name": "Release Date" }, { "type": "float", "index": 19, "name": "Average Rating", "min": 1, "max": 5 },
{ "type": "integer", "index": 20, "name": "Times Watched" }
],
"sets": [
{ "format": "binary", "start": 2, "end": 18 }
],
"author": "grouplens",
"description": "MovieLens ratings dataset, curated and filtered by Alsallakh.",
"source": "http://grouplens.org/datasets/movielens/"
}
后三行表示了数据集的作者信息,简要描述信息,文件链接或介绍。
Data Import:
数据导入到服务器上,只有两种云存储可以使用,一种是 Dropbox 的公共文件夹, 一种是 Google Drive.
Google Drive Hosting
通过Google Drive进行导入数据的例子:
1. 创建文件,存放数据文件。
2. 把文件夹变成网络上的公共文件夹。可以与他人分享链接。
3. 文件夹的链接地址如下:
复制文件的地址, id=之后 &usp之前 。
4. 把ID 加入到当中 ,例如:https://googledrive.com/host/0B15A4Ald70ZjfmlxV3QzTUJDSUhfaXRWa3RkY2x2N0tQejhpbjl6ODVycnI3ZVEzYXg5R00
5. 把此文件分享链接地址更新到JSON 文件中。Remember to update the path to your CSV
file.
可以从网上获取数据用来分析。
3、也可以把UpSet 源文件下载下来用于本地化处理保密的数
四、UpSetR 包:
除了动态网页版的UpSet,R 中提供了UpSet 的静态包,用此包我们可用它来获得高分辨率的图像,用在发表的文章上。UpSetR 提供了UpSet 的大多数功能,但只能静态的表示。
指标:
Elements:元素的查询参数,可视化感兴趣的查询项。
用法 :elements(func, query, ...)
Func :内部提供的函数。
Query :针对func 输入的查询参数。
... :内部提供的额外的参数
histogram :直方图
用法:histogram(mydata, x)
Mydata :内部提供的数据集,包含交集数据
x :直方图的x 轴
Intersects :交集的查询参数
可视化特定交集中的元素的查询参数
用法 :intersects(func, query, ...)
func :内部提供的函数
query : 交集函数中输入的查询参数。
scatter_plot:散点图
用法:
scatter_plot(mydata, x, y)
mydata :内部提供的交集数据集
x :散点图的x 轴
y :y 轴
upset :upsetR 图
用新的UpSet 矩阵可视化交集
用法:
upset(data, nsets = 5, nintersects = 40, sets=NULL,matrix.color="gray23",main.bar.color="gray23",sets.bar.color=
"gray23", point.size = 4, line.size = 1,name.size = 10, mb.ratio = c(0.7, 0.3), expression = NULL,att.pos = NULL,
att.color = main.bar.color, order.matrix = c("degree","freq"),show.numbers = "yes", number.angles=0,aggregate.by ="degree",cutoff=NULL,queries=NULL,query.legend="none",shade.color="gray88",shade.alpha=0.25,empty.intersections = NULL, color.pal = 1, boxplot.summary = NULL,attribute.plots = NULL)
Arguments
data :数据集
nsets :想要查看的集合数目
nintersects :需要表示的交集点阵的数目
sets :需要特定查看的集合(用集合之和表示 : c("Name1", "Name2"))
matrix.color :交集点阵的颜色
main.bar.color :主直方图的颜色
sets.bar.color :集合大小直方图的颜色
point.size :点阵中点的大小
line.size :点阵中直线的宽度
name.size :在点阵中集合的名字型号
mb.ratio :主直方图和点阵之间宽度的比例
expression :交集或元素查询数据的子属性的表达式,可是是字符串例如: “ColName > 3”
att.pos :属性图的位置,如果是NULL 或者“bottom “, 此图就会在UpSert 的下方,如果时”top ”, 就会出现在UpSert 的上方。
att.color :未查询数据的属性直方图或者散点图的颜色,默认颜色与主直方图相同。
order.matrix :交集矩阵是如何排序的。可以选择”freq ”, ”degree ”, 或者两者都选。
show.numbers :在直方图上方表示交集数目的数字的的型号。
number.angles :在表示交集大小的直方图顶上的数字的角度。
aggregate.by :数据如何分组, ("degree" 或者 "sets") 。
cutoff : 当按照集合sets 分组时每组交集数目的阈值
queries :交集,元素,和函数的统一的查询,输入一个查询的列表, query 是一种查询方式,
params :. Color:代表查询的点的颜色;如果没有选择颜色,会自动提供。active:逻辑值 TRUE 或 FALSE, 如果是 TRUE, it will overlay the bars present with the results from the query. If FALSE a tick mark will indicate the intersection size. See examples section on how to do this.
query.legend :查询图例的位置,在UpSet plot的上方top ,还是下方bottom
shade.color : 矩阵阴影的颜色。
shade.alpha :矩阵阴影的透明度。
empty.intersections :交集中额外显示空集。
color.pal :属性图的调色板
boxplot.summary :箱式图表示每一个交集的选择的属性,参数选择,NULL, 或者on
attribute.plots :
Create custom ggplot using intersection data represented in the main bar plot.
Prior to adding custom plots, the UpSet plot is set up in a 100 by 100 grid. The
attribute.plots parameter takes a list that contains the number of rows that should
be allocated for the custom plot, and a list of plots with specified positions.
nrows is the number of rows the custom plots should take up. There is already
100 allocated for the custom plot. plots takes a list that contains a function that
returns a custom ggplots and the x and y aesthetics for the function. ncols is the
number of columns that your ggplots should take up. See examples for how to add custom ggplots.
例子:
library(UpSetR)
#mutations是UpSetR 中的一个案例样本
mutation
#Example 1 当没有特定的选择集合时,选择最大的集合
#nsets从数据中选择前n 个最大的集合。
#number.angles决定表示交集大小的数字的角度。
#point.size 表示矩阵中圆圈的大小。
#name.size改变集合名字的大小。
#line.size 改变连接圆圈连线的大小。
upset(mutation,nsets=8,number.angles=30, point.size = 5, name.size = 12,
line.size=2)
#Example 2: 选择特定的集合,和矩阵的顺序。
#sets:包含一组特定集合名字的向量。
#mb.ratio:圆点的高度和宽度的比例分配。
#order.by:按... 排序。如果没有特定指明,那么默认是先按度(degree 集合的排序,由多到少) 分配,然后是频率(frequency ,集合的大小)。
upset(mutation,sets=c("TTN","PTEN","TP53","EGFR","MUC16","FLG","RYR2","PCLO"),mb.ratio=c(0.55,0.45),order.by="freq")
upset(mutation,sets=c("TTN","PTEN","TP53","EGFR","MUC16","FLG","RYR2","P
CLO"),mb.ratio=c(0.55,0.45),order.by="degree")
upset(mutation,sets=c("TTN","PTEN","TP53","EGFR","MUC16","FLG","RYR2","PCLO"),mb.ratio=c(0.55,0.45),order.by=c("degree","freq"))
#Example 3:集合分组
#nintersects:图中显示的交集的数量
#groupe.by:按set 集合的方式。
#cutoff:设定每组交集数量的阈值。
upset(mutation,nintersects=70,group.by="sets",cutoff=7)
#Example 4 :显示空交集
#有时我们找不到想要的交集,可以改变nintersects 的大小,也可以把empty.intersections 设为on ,因为空的交集不显示
upset(mutation,empty.intersections="on",order.by="freq")