UpSetR:集合可視化神包

對(duì)于集合的可視化,第一時(shí)間想到的都是韋恩圖(venn diagram),一般集合不超過(guò)5個(gè)的時(shí)候,可視化效果還是不錯(cuò)的

但是一旦數(shù)據(jù)集增加,比如說(shuō)五個(gè)的時(shí)候,你就很難從圖中解讀出想要的信息了。


即便你把它畫(huà)的很美觀,如下圖那樣,還是還是很難直觀找到自己需要的信息。可視化的目的不是炫技,而是快速理解數(shù)據(jù)。

還好R語(yǔ)言里新增了一個(gè)集合可視化神包--UpSetR。它可視化的結(jié)果的基礎(chǔ)版本長(zhǎng)下面這個(gè)樣子:

UpSetR

上述是分析了不同電影的所屬類(lèi)型得到的結(jié)果。在我不告訴你任何圖示信息的情況下,請(qǐng)思考下那種電影類(lèi)型拍的最多,然后哪兩種電影電影類(lèi)型拍的最少。

基本上我不用過(guò)多和你解釋圖示,你也能很快的找到答案。圖中黑色表示該位置有數(shù)據(jù),灰色的點(diǎn)表示沒(méi)有。不同點(diǎn)連線表示存在交集。具體數(shù)據(jù)可以看上面的條形圖。不同類(lèi)型的數(shù)據(jù)的總量看左邊的條形圖。

如何畫(huà)圖

UpSetR是一個(gè)R包,這意味著你可以簡(jiǎn)單通過(guò)一行命令就能安裝

install.packages(UpSetR)

UpsetR接受三種類(lèi)型的數(shù)據(jù)輸入:

  1. 表格形式,在R語(yǔ)言里就是數(shù)據(jù)框了。行表示元素,列表示數(shù)據(jù)集分配和額外信息。
  2. 元素名的集合(沒(méi)見(jiàn)過(guò),不知道。。)fromList
  3. 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)
Movies

Name是不同的電影,然后不同發(fā)布時(shí)間,后面接著電影跟隨的類(lèi)型。
繪圖用的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ù)。畢竟原來(lái)有20多種電影類(lèi)型,放不完的
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由查詢(xún)函數(shù),和參數(shù)組成,參數(shù)也是一個(gè)list。查詢(xún)函數(shù)可以用系統(tǒng)自帶的,也可以自己寫(xiě)一個(gè)。比如說(shuō)這里的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ù),可以用自帶的,也可以自己寫(xiě),只要保證里面的參數(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畫(huà)畫(huà)了,太簡(jiǎn)單了。

upsetplot(peakAnno, vennpie=TRUE)

下一期寫(xiě)一篇Y叔的upsetplot是如何寫(xiě)的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容