對(duì)于集合的可視化,第一時(shí)間想到的都是韋恩圖(venn diagram)爹袁,一般集合不超過5個(gè)的時(shí)候,可視化效果還是不錯(cuò)的
但是一旦數(shù)據(jù)集增加矮固,比如說五個(gè)的時(shí)候失息,你就很難從圖中解讀出想要的信息了譬淳。
即便你把它畫的很美觀,如下圖那樣盹兢,還是還是很難直觀找到自己需要的信息邻梆。可視化的目的不是炫技绎秒,而是快速理解數(shù)據(jù)浦妄。
還好R語(yǔ)言里新增了一個(gè)集合可視化神包--UpSetR。它可視化的結(jié)果的基礎(chǔ)版本長(zhǎng)下面這個(gè)樣子:
上述是分析了不同電影的所屬類型得到的結(jié)果见芹。在我不告訴你任何圖示信息的情況下剂娄,請(qǐng)思考下那種電影類型拍的最多,然后哪兩種電影電影類型拍的最少玄呛。
基本上我不用過多和你解釋圖示阅懦,你也能很快的找到答案。圖中黑色表示該位置有數(shù)據(jù)徘铝,灰色的點(diǎn)表示沒有耳胎。不同點(diǎn)連線表示存在交集。具體數(shù)據(jù)可以看上面的條形圖惕它。不同類型的數(shù)據(jù)的總量看左邊的條形圖怕午。
如何畫圖
UpSetR是一個(gè)R包,這意味著你可以簡(jiǎn)單通過一行命令就能安裝
install.packages(UpSetR)
UpsetR接受三種類型的數(shù)據(jù)輸入:
- 表格形式怠缸,在R語(yǔ)言里就是數(shù)據(jù)框了诗轻。行表示元素,列表示數(shù)據(jù)集分配和額外信息揭北。
- 元素名的集合(沒見過扳炬,不知道。搔体。)
fromList
- venneuler包引入的用于描述集合交集的向量
fromExpression
恨樟。
光看文字肯定是不懂的,所以直接實(shí)戰(zhàn)把
輸入方式一: table
我們用UpSetR提供的測(cè)試數(shù)據(jù)作為演示
require(ggplot2); require(plyr); require(gridExtra); require(grid);
movies <- read.csv(system.file("extdata","movies.csv",package = "UpSetR"), header = TRUE, sep=";")
看下數(shù)據(jù)長(zhǎng)什么樣子
View(movies)
Name是不同的電影疚俱,然后不同發(fā)布時(shí)間劝术,后面接著電影跟隨的類型。
繪圖用的upset
函數(shù):
upset(movies, nsets = 7, nintersects = 30, mb.ratio = c(0.5, 0.5),
order.by = c("freq", "degree"), decreasing = c(TRUE,FALSE))
稍微解釋一下參數(shù)
nsets: 最多展示多少個(gè)集合數(shù)據(jù)呆奕。畢竟原來有20多種電影類型养晋,放不完的
nintersects: 展示多少交集。
mb.ratio: 點(diǎn)點(diǎn)圖和條形圖的比例梁钾。
order.by: 交集如何排序绳泉。這里先根據(jù)freq,然后根據(jù)degree
decreasing: 變量如何排序姆泻。這里表示freq降序零酪,degree升序
更有意思的是冒嫡,我們還能在圖中描述出1970-1980年恐怖片和劇情片的情況
# 用于query的函數(shù)
between <- function(row, min, max){
newData <- (row["ReleaseDate"] < max) & (row["ReleaseDate"] > min)
}
upset(movies, sets=c("Drama","Comedy","Action","Thriller","Western","Documentary"),
queries = list(list(query = intersects, params = list("Drama", "Thriller")),
list(query = between, params=list(1970,1980), color="red", active=TRUE)))
這里必須介紹一個(gè)神奇的參數(shù)queries
:
queries接受query所組成的list。然后不同query也是一個(gè)list四苇,這個(gè)list由查詢函數(shù)孝凌,和參數(shù)組成,參數(shù)也是一個(gè)list月腋。查詢函數(shù)可以用系統(tǒng)自帶的蟀架,也可以自己寫一個(gè)。比如說這里的between
此外還有一個(gè)參數(shù)叫做attribute.plots
能夠添加在upset的結(jié)果圖中加入屬性圖榆骚。
upset(movies,attribute.plots=list(gridrows=60,plots=list(list(plot=scatter_plot, x="ReleaseDate", y="AvgRating"),
list(plot=scatter_plot, x="ReleaseDate", y="Watches"),list(plot=scatter_plot, x="Watches", y="AvgRating"),
list(plot=histogram, x="ReleaseDate")), ncols = 2))
這個(gè)attribute.plots
接受各個(gè)plot函數(shù)組成的作圖函數(shù)辜窑,可以用自帶的,也可以自己寫寨躁,只要保證里面的參數(shù)設(shè)置正確了穆碎。
其他參數(shù)就不繼續(xù)演示了,因?yàn)槲覒小?/p>
輸入方式二:集合交集向量
集合交集向量長(zhǎng)下面這個(gè)樣子
input <- c(
"MAQ"=144600,
"FaSD"=16532,
"Bcftools"=283,
"GATK"=15160,
"MAQ&FaSD"=16323,
"MAQ&Bcftools"=636,
"Bcftools&GATK"=65435,
"FaSD&GATK"=33874,
"MAQ&FaSD&Bcftools"=114,
"MAQ&FaSD&GATK"=41858,
"MAQ&Bcftools&GATK"=4,
"FaSD&Bcftools&GATK"=6603,
"MAQ&FaSD&Bcftools&GATK"=8357
)
輸入格式一目了然职恳,然后數(shù)據(jù)可以用fromExpression
進(jìn)行轉(zhuǎn)換
data <- fromExperssion(input)
轉(zhuǎn)換后的數(shù)據(jù)就可以拿去用upset作圖了
upset(data)
福利:Y叔的upsetplot()
我們可以對(duì)ChIP-Seq分析得到的peak進(jìn)行注釋
require(TxDb.Hsapiens.UCSC.hg19.knownGene)
txdb <- TxDb.Hsapiens.UCSC.hg19.knownGene
peakfile <- system.file("extdata", "sample_peaks.txt", package="ChIPseeker")
peakAnno <- annotatePeak(peakfile, tssRegion=c(-3000, 3000), TxDb=txdb)
peakAnno
然后就可以用upsetplot畫畫了所禀,太簡(jiǎn)單了。
upsetplot(peakAnno, vennpie=TRUE)
下一期寫一篇Y叔的upsetplot
是如何寫的放钦。