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)。兩種圖的樣子雖然差別較大,但是其本質都是反映了集合的關係。簡而言之有三點:
- 集合數<5使用Venn plot更加清晰。
- 集合數>5使用Upset plot更加清晰。
- 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. 通過軟體實現
優缺點同上。
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仍然存在這個問題。尚不清楚原因,歡迎留言討論。