進階版Venn plot:Upset plot入門實戰代碼詳解——UpSetR包介紹

        網上已有一些帖子講解了Upset plot的背景知識和實現方法,本文旨在從實戰角度出發,解讀Upset plot實現的一些途徑及其優劣勢以及如何通過upsetR包實現Upset plot的繪製,並提供代碼和input格式示例。另博主在使用中發現一處報錯,尚不清楚原因,一併提出,以拋磚引玉。

Q1:Upset plot和Venn plot的關係?

        提到集合的可視化,傳統的方法以Venn plot爲主。然而當集合的數量過多(超過五個),Venn plot會變得非常雜亂(Fig.1)。Upset plot可以很好地展示多個集合之間的關係(Fig.2)。兩種圖的樣子雖然差別較大,但是其本質都是反映了集合的關係。簡而言之有三點:

  1. 集合數<5使用Venn plot更加清晰。
  2. 集合數>5使用Upset plot更加清晰。
  3. Upset plot具有更多的展示方式。

​​(Fig.1)

(Fig.2)

Q2:如何解讀Upset plot?

        熟悉Venn plot的朋友只需稍作變換即可很好地理解Upset plot。Fig.2是一個簡單的Upset plot,圖像可以分爲上部分(條形圖)和下部分(左側的條形圖,中間的集合名稱和右側的點陣)。左下方的橫行條形圖展示了每個集合的元素數(此處元素數由input文件直接得到),左中方的集合名稱由input文件中命名的集合名得到,左下方的點陣應與上方的條形圖一起解讀。有顏色的點代表涉及到相關集合,即有顏色的點對應的左中的集合一起取交集。以紅點爲例,代表Drama與Drama集合取交集,即自身取交集。藍點代表Action集合與Drama取交集,對應的條形圖數值爲68,即有68個元素既在Action中又在Drama中。以此類推便可理解黃點。上方的條形圖代表着每個交集對應的元素數。

Q3:如何繪製Upset plot?

        Upset plot的繪製方法大致有三種:

1.通過網站繪製

有一些網站支持繪製各種統計圖,此處推薦一個:易漢博生物信息在線作圖(http://www.ehbio.com/ImageGP/index.php/Home/Index/UpsetView.html)。該網站囊括了生物信息學領域所需要的多種基礎圖像。

優點:簡單易用;缺點:可編輯性低,不能滿足複雜的顯示要求,大樣本量時不穩定

2. 通過軟件實現

TBtools是一款旨在幫助生命科學領域科研人員實現無代碼數據分析及繪圖的軟件。關於這個軟件的使用詳情可見:https://mp.weixin.qq.com/s/MPlN2LtsCn3FqEM2ZkLa5A

優缺點同上。

3.使用UpSetR包繪圖

UpSetR包是基於R語言開發的一款程序包,可以用於多領域的集合可視化。

優點:可編輯性好,可以滿足大樣本分析需求;缺點:R語言使用門檻高於前兩種方式

        網友(ID:嚴濤)和網友(ID:hoptop)分別在51CTO平臺(http://bigdata.51cto.com/art/201710/554293.htm)和簡書(https://www.jianshu.com/p/324aae3d5ea4)發表了以UpSetR包提供的樣本爲基礎的程序講解,文章詳細闡述了各種參數的意義。然而對於初學者來說,其中涉及到的一些操作屬於錦上添花,增加了文章的理解難度。本文將盡可能的減少代碼量,使用通俗易懂的語言,以便於理解和重複。

一、數據準備

(Fig.3)

製作如Fig.3所示的矩陣,列名稱爲集合名稱,行名稱爲元素名稱,0表示不在該集合,1表示在該集合,爲了便於後續操作,將文件保存爲csv格式。

二、安裝UpSetR包

source("http://bioconductor.org/biocLite.R")
biocLite("UpSetR")

三、導入矩陣

library(UpSetR)
setwd("E:/example")
example = read.csv("example.csv",header=TRUE,row.names=1,check.names = FALSE)
knitr::kable(head(example[,1:7]))

第一行:載入程序包

第二行:定義矩陣所在路徑

第三行:將example.csv文件中的矩陣讀取並存儲到example變量中

第四行:預覽矩陣的前7列

四、繪製Upset plot

upset(example, sets = c("AA", "BB", "CC", "DD", "EE",  
                       "FF", "GG"), mb.ratio = c(0.55, 0.45), order.by = "freq", 
      queries = list(list(query=intersects, params=list("CC", "EE"), color="red", active=T), 
        list(query=intersects, params=list("CC", "DD", "EE"), color="green", active=T), 
        list(query=intersects, params=list("CC", "DD", "EE", "AA"), color="blue", active=T)), 
      nsets = 7, number.angles = 0, point.size = 6, line.size = 1, mainbar.y.label = "title",
      sets.x.label = "title", text.scale = c(2, 2, 2, 2, 2, 2))

 

 (Fig.4)

example:存放矩陣的變量名稱

set:所需要的集合名稱

mb.ratio:調整上下兩部分的比例

order.by:排序方式,freq爲按頻率排序

queries:查詢函數,用於對指定列添加顏色,結合代碼可知分別爲CC&EE/CC&DD&EE/AA&CC&DD&EE列添加了紅色、綠色和藍色

active:如果爲F,則在每一列上方顯示一個三角(Fig.5)

(Fig.5) 

nset:集合數量,也可用set參數指定具體集合

number.angles:上方條形圖數字角度,0爲橫向,90爲豎向,但90時不在正上方

point.size:下方點陣中點的大小

line.size:下方點陣中每個線的粗細

mainbar.y.label:上方條形圖Y軸名稱

sets.x.label:左下方條形圖X軸名稱

text.scale:六個數字控制關係見Fig.6

 

        UpSetR包的介紹就到此爲止了,還有更加豐富的功能可參考網友(ID:嚴濤)和網友(ID:hoptop)的文章。

        在實際使用中,博主發現:

 (Fig.7)

(Fig.8) 

        Fig.7是報錯的,Fig.8代碼中刪掉了Fig.7中的只有單個集合的那一行,就不會提醒列不匹配了。換句話說只要是params的list包括兩個或兩個以上就不報錯。換了一個版本的R仍然存在這個問題。尚不清楚原因,歡迎留言討論。