劉小澤上篇寫于18.10.3 ,中篇寫于18.10.4,下篇寫于18.10.6
學習障礙的規律往往是:不是因為它多難,而是因為你不知道它難不難!之前就見過各種文章中的復雜美觀的圓圈圖,被震撼到,這么多的信息是如何放到一個圖中的?后來遇到一個網站Circos專門做圓圈圖,很專業的樣子,于是有心學一下。雖然看似很難,但是美好的東西,不都是奮斗出來的嗎?
前言
背景知識
Circos并不直接用R做,而是一個Perl語言開發的可視化軟件,由加拿大生信科學家Martin Krzywinski開發,可以用于描述關系型數據和多維度的數據可視化
其次,什么樣的可視化軟件會受歡迎?一是輸入簡單,不需要太多的數據處理技巧就能調整到要求的輸入格式;二是輸出美觀、快捷。這兩點,Circos都做到了
Circos的設計初衷:展示線性位置關系(如染色體上的信息)、展示一個幾何中兩個對象的關系(如比對信息)。將線性折成封閉曲線可以減少數據分散性
重造了個輪子?
程序設計者最大的忌諱就是“重復造輪子”,目前有許多基因組瀏覽器:UCSC(http://genome-asia.ucsc.edu/cgi-bin/hgGateway?redirect=manual&source=genome.ucsc.edu)、Ensembl(https://asia.ensembl.org/index.html)、Vista(http://pipeline.lbl.gov/cgi-bin/gateway2?bg=cin1&selector=vista)、VEGA(http://vega.archive.ensembl.org/index.html)、
ARGO。
當然,這些基因組瀏覽器含有的數據量都非常大,但如何從隱晦的龐大數據中抽出具體的數據再展示出來是個問題。比如染色體包含的數據很多,我們要是想展示染色體上的位置特征如某些基因,用circos的圓圈圖就可以兼顧大數據與小信息
數據的關系
先說下數據類型,無非就是標量數據(scalor,有大小,沒方向)、向量數據(vector,有大小和方向),將數據可視化也就是標量化、向量化。基因組就是一個一維的數據結構,上面的位置就是標量
最常見的就是標量數據進行標量可視化,比如輸入數據是基因組位置,輸出是實值(如GC含量、保守度),就可以用直方圖(histogram)、折線圖、散點圖(scatter)畫出。當數據集比較小、關系比較簡單時還是可以看出變化趨勢的,但是當數據之間存在交叉、數據量比較大時,一致性就體現不出來啦
或者有的圖很好看,但是信息雜亂無章
又或者想表達相關性,一般使用曲線,但是在標量數據上展示曲線,數量一多就亂了
可能會想,把部分曲線抬高不就能區分開啦?但是抬高了顯示的信息量勢必會減少
為什么用圓圈?
圖形可視化這么多形狀,矩形、三角形、圓形...,其中圓形比矩形更對稱,視覺壓力不會那么大,看圓形會更圓潤;
-
圓形有效載荷(data payload)會更大:文章中在尺寸、位置等對圖片的限制還是蠻多的,如何體現數據有效載荷,這里有一個公式~軸的長度/圖片面積。
對于矩形來說,2a/4a2 = 1/2a (2a是x、y軸長度之和); 對于圓形來說,2πa/πa2 = 2/a。圓形是矩形體現的數據的4倍
軸長度多長會分散注意力,圓形更容易聚焦
看下面圖是不是更好點?
圓圈圖的一些元素
可以設置環形的數據軌道:如線形、散點、直方圖,可以設置點(線)顏色、粗細、線形狀。并且各個區域可以直接縮放,而不用截掉數據
-
環形坐標軸
需要帶有距離刻度的對象,比如:染色體、序列、基因圖譜、片段重疊群(contig)
配置文件,在內置的基礎上進行修改,比如thickness、size、label、labelsize、grid等
-
使用高亮highlight創建不同的顏色片段,置于所有圖層底部
4.png -
基因組間的mapping
設置links seqdup,也就是不同染色體中出現的同一個序列片段,在圓圈圖中進行展示,例如
-
設置格式規則
6.png
-
組合不同的圖片類型
左:散點+箱線+折線;右:瓦片+熱圖+直方圖
7.png
- 實際應用
輸入:GFF;輸出:PNG、SVG
安裝
基于Unix(推薦linux)和perl,需要熟悉命令行
先檢查Perl
Unix是默認安裝了perl,perl 5.8之前的都需要升級;windows用戶可以用dos或者git bash,先調出來命令行,然后安裝perl,安裝 Strawberry Perl 或者 ActiveState Perl
perl在linux下的存在目錄是/bin/env,在mac下的存在目錄是/bin/usr/env
下載
# 目前最新的版本還是17年7月31的
wget http://circos.ca/distribution/circos-0.69-6.tgz
tar zxvf circos-0.69-6.tgz
# 放入環境變量
echo 'export PATH=/Your_path/circos-0.69-6/bin:$PATH' >>~/.bashrc
source ~/.bashrc
初步配置
(服務器可能需要root權限,用mac或者windows的命令行也是可以的)
# 配置cpanm,并加入環境變量
wget https://raw.githubusercontent.com/miyagawa/cpanminus/master/cpanm
# 先看看需要用到的perl模塊,有一些缺失(提示:missing)的
circos -module
# 安裝缺失模塊
circos -module | grep 'missing' | awk '{a=a" "$2;}END{system("cpanm"a);}'
perl模塊缺失怎么辦?
例如缺少Clone模塊:
先在metacran網站查找:https://metacpan.org/pod/Clone
下載解壓
wget https://cpan.metacpan.org/authors/id/G/GA/GARU/Clone-0.39.tar.gz
tar zxvf Clone-0.39.tar.gz
cd Clone-0.39
# configure
perl Makefile.PL
#Checking if your kit is complete...
#Looks good
#Generating a Unix-style Makefile
#Writing Makefile for Clone
#Writing MYMETA.yml and MYMETA.json
make
make test
make install
# 如果有使用build的模塊,還是下載安裝,然后
perl Build.PL
./Build
./Build test
./Build install
# 又或者使用conda安裝
conda install -c bioconda perl-clone
安裝的目錄
bin:包含circos的可執行程序(已加入環境變量)
-
data:一個文件夾karyotype,包含幾個物種的染色體信息,繪圖必須
10.png
#chr - ID LABEL START END COLOR
chr - hs1 1 0 247249719 chr1
chr - hs2 2 0 242951149 chr2
chr - hs3 3 0 199501827 chr3
chr - hs4 4 0 191273063 chr4
chr - hs5 5 0 180857866 chr5
chr - hs6 6 0 170899992 chr6
#...省略部分
band hs1 p36.33 p36.33 0 2300000 gneg
band hs1 p36.32 p36.32 2300000 5300000 gpos25
band hs1 p36.31 p36.31 5300000 7100000 gneg
band hs1 p36.23 p36.23 7100000 9200000 gpos25
# ...
#karyotype.human.hg18.txt
前兩列:chr定義染色體,-
表示父區域,染色體沒有父區域,因此用-
,下面的band就有父區域了,比如這四行的band的父區域就是hs1,1號染色體;
ID是命令,同時繪制多個物種,可在ID中包含物種的代號;
LABEL:當前區域顯示的名字;
START END:整個的區域范圍,要顯示部分區域,可以后來修改;
COLOR:當前區域的顏色,定義好的顏色,存儲于etc/colors.conf
-
etc:配置文件,如
background.black.conf #只定義了背景是深色 background.white.conf colors.hsv.conf colors.ucsc.conf colors.conf #利用RGB組合設置了顏色變量、系列顏色和染色體的顏色 colors_fonts_patterns.conf #顏色、字體、預定義的圖形文件 image.conf image.generic.conf patterns.conf #定義特殊小圖形的信息 ...
劉小澤寫于18.10.4 看來兩篇還搞不定,內容不少
自己安裝最大的問題就是:perl模塊配置,不管自己的機器還是服務器,總是有模塊沒有配置好,需要一步步調試;而且模塊相互之間需要依賴,又是個麻煩事。
要圖方便,使用conda安裝circos也是可以的,省去不少麻煩,三步搞定
conda create -n circos source activate circos conda install circos -y # 最后用circos -modules檢查一下 # conda安裝的目錄在 miniconda3/pkgs/circos-0.69.6-2
使用
官方教程 http://circos.ca/documentation/tutorials/
使用過程并非可視化的,需要以下幾步:
想想數據要被怎么展示(最麻煩的部分);
將數據轉換成circos要求的格式;
構建配置文件,可以用默認的當作模版進行修改;
運行circos生成PNG或者SVG;
微調PNG/SVG,例如添加圖例、文本標題等
配置文件概況
circos生成的是靜態文件,這個過程是配置文件起主導作用,例如全局的字體、顏色設置,這個過程需要Config::General
這個模塊。其中的配置信息用空格作為分隔符,使用=
定義變量名 = 變量值
。有的一個相同的配置需要分成幾個小配置塊,是為了給不同的track(圓圈軌道)個性化定制,比如
<links>
# track 1
<link>
file = data/set1.txt
color = black
...
</link>
# track 2
<link>
file = data/set2.txt
color = red
...
</link>
</links>
開始符<>
與結束符</>
組合成一個配置塊(二者缺一不可),幾個重要的配置塊放在一個配置文件中
<ideogram> # 例如開始是這個板塊
...
</ideogram> # <-- 結尾沒有這個就報錯
配置文件中有4個地方可以自定義:(排序:優先級越來越高)
- 全局實例:所有圖形中的所有數據點(位于
<plots>或者<links>
配置塊) - 局部實例:某個圖形中所有數據點(位于
<plot>或者<link>
配置塊) - 數據:指定某個數據點(位于
data
文件) - 規則:位于
<rule>
配置塊【比如這里的設置可以覆蓋之前的數據的設置】
一個全局實例可以包括多個局部實例,比如下面配置文件中fill_color = gray
對全局和局部都有效,而fill_color = white
只對第一個局部實例內部有效。當許多局部實例組合在一起時,使用全局實例能提高效率
<plots> #全局plot
fill_color = gray
...
<plot> #plot1,比如這個可以負責畫環
fill_color = white
...
</plot>
<plot> #plot2,比如這個可以畫點
...
</plot>
</plots>
利用內置的配置文件
位于circos/etc
的目錄下,這些配置文件都是優化好的,基本不用修改直接寫入自己的配置文件。
常用的幾個不需要更改的:
-
housekeeping.conf
基本的框架配置,直接導入 -
fonts.conf
配置字體,與font目錄下的ttf或otf文件對應 -
pattern.conf
配置輸出格式,與tiles目錄下的png文件對應,然后用pattern.svg.conf
生成svg文件 -
colors.conf
:引入了colors.brewer.conf
、colors.hsv.conf
、colors.ucsc.conf
定義了顏色的不同絕對路徑,另外在本身的colors配置文件中,還支持使用像red、hs1、reds-9-seq-1
的方式
幾個重要的需要稍微調整的:
-
image.conf
調整圖片大小、背景顏色、輸出目錄、輸出文件格式、染色體在圓圈的起始位置 -
ideogram.conf
繪制基因組的核型數據——染色體,例如人,會把22條常染色體和X、Y繪制出來,而且在最外圈展示,每條染色體都是一段圓環。專門對染色體進行配置:染色體間距、標簽位置、是否展示bands -
ticks.conf
刻度形式顯示染色體大小,對刻度進行配置,可以導入ideogram.conf
配置文件導入:<<include xxx.conf>>
省去了主文件重復定義,可以直接引用其他的配置文件,層層引用嵌套,例如下面的配置文件邏輯關系就比較清楚:
karyotype = data/karyotype/karyotype.human.txt #指定物種是人
chromosomes_units = 10000000
chromosomes_display_default = yes
<<include ideogram.conf>> #引用:鏈接核心圖——染色體作為外圈
<<include ticks.conf>> #引用:加刻度
...
<image> #輸出圖片
<<include etc/image.conf>> #引用:圖片設置
</image>
<<include etc/colors_fonts_patterns.conf>> #引用:設置顏色
<<include etc/housekeeping.conf>>
畫出第一個輪廓圖/核型圖(沒有數據,只有染色體的idogram)
1. 先準備好被導入的配置文件:circos/etc目錄下文件可以直接用
2. 再創建ideogram.conf和ticks.conf配置文件
# ideogram.conf
<ideogram>
<spacing>
default = 0.005r # 1.設置兩條染色體間空隙,每個空隙大小為周長的 0.5%(這里的r表示ring圓環,而不是半徑)
</spacing>
radius = 0.9r # 2.1 染色體所在位置(即畫在多大的半徑上)在離圓心的 90% 處 (這里的r指的是半徑,而不是ring)
thickness = 20p # 2.2 染色體厚度
fill = yes
fill_color = black # 2.3 染色體顏色
stroke_thickness = 2 #2.4 染色體邊框厚度
strock-color = black
show_label = yes # 3.顯示染色體標號如CHR1
label_font = default
label_radius =1r + 75p # 1r對應ideogram對應的半徑,+75p表示在圓圈外側75p(像素pixel)的地方;如果要顯示在內側,可以1r - 75p或者0.9r類似這種
label_size = 30
label_parallel = yes #設定 label 的字體方向,yes 生成易于瀏覽的方向
label_case = upper #label大小寫顯示
show_bands = yes # 4.染色體上條帶bands是否顯示
fill_bands = yes
band_stroke_thickness = 2 # 邊框厚度
band_stroke_color = white #顏色
band_transparency = 4 #透明度
</ideogram>
關于單位設置:共有4種:p, r, u, b。
p表示像素,1p表示1像素;
r表示相對大小,0.005r表示0.5% ring 大小;
u表示相對chromosomes_unit的長度,如果chromosomes_unit = 1000,則1u就是千分之一的染色體長度;
b表示堿基,如果染色體長1M,那么1b就是百萬分之一的長度
# ticks.conf 刻度形式顯示染色體大小
show_ticks = yes # 1.是否顯示刻度
show_tick_labels = yes
<ticks>
skip_first_label = no # 2.刻度所在位置、顏色、厚度
skip_last_label = no
radius = dims(ideogram,radius_outer)
tick_separation = 3p
label_separation = 1p
multiplier = 1e-6
color = black
thickness = 4p
size = 20p
<tick>
spacing = 1u # 3.次刻度
show_label = no #不顯示次刻度標簽
thickness = 2p
color = dgrey
</tick>
<tick>
spacing = 10u # 4.主刻度
show_label = yes # 顯示主刻度標簽
label_size = 20p
label_offset = 10p
format = %d
grid = yes
grid_color = dgrey
grid_thickness = 1p
grid_start = 0.5r
grid_end = 0.999r
</tick>
</ticks>
3. 創建主配置文件,并導入之前設置的其他配置文件
保存為任意名稱(這里以circos.conf為例)可以直接復制粘貼后,用circos -conf circos.conf
得到circos.png、circos.svg文件
# 首先karyotype核型文件是必須的,定義了需要染色體的名稱、大小、顏色,并且可以根據自己的需要設定。不限于染色體,還可以是contigs、genes等可以在坐標上體現出來的。circos自帶的核型文件放在/data/karyotype下
karyotype = data/karyotype/karyotype.human.txt
chromosomes_units = 10000000 #指定距離單位u
# chromosomes = hs1;hs2;hs3這樣寫表示只顯示三條染色體(因此下面的??設置要寫成no)
chromosomes_display_default = yes #顯示所有的染色體(no的話需要自己指定)
<<include ideogram.conf>>
<<include ticks.conf>>
<image>
<<include etc/image.conf>>
</image>
<<include etc/colors_fonts_patterns.conf>>
<<include etc/housekeeping.conf>>
下篇 劉小澤寫于18.10.6
寫到這里,其實還差得遠,需要不斷的打磨摸索才能靈活運用
核型圖內側添加數據
數據圖包括許多種:散點圖、線形圖、柱狀圖、熱圖,R能畫的圖基本Circos都支持;另外還可以畫聯系圖Connectors、高亮圖Highlights、連接圖Links(比如某些融合基因存在于1區域和2區域,就可以連接這兩個)
散點圖、線形圖、柱狀圖、熱圖數據格式
# chr start end value option(可有可無)
...
hs1 0 66666 0.01314 #其中0-66666相當于x坐標,0.01314相當于y坐標
hs1 66667 166666 0.00520
hs1 166667 266666 0.00231 fill_color=red
#fill_color=red,z=66就是option部分,可有可無,表示設置這一塊區域顯示什么顏色等等,還有其他一些設置
...
散點圖
寫好散點圖的配置文件,加到主配置文件中即可
<plots>
type = scatter #在全局設置可以應用一下好幾個plot,就省去了一個個設置的麻煩。首先設置繪圖類型,可以是scatter、line、histogram、heatmap
stroke_thickness = 1
<plot>
file = data/6/snp.density.txt #指定數據文件
fill_color = grey
stroke_color = black
glyph = circle #點形狀及大小
glyph_size = 10
max = 0.013 #設置數據范圍,超出的不考慮
min = 0
r1 = 0.95r #繪制區域,r0是內半徑,r1是外半徑。plot1是從圓圈內部畫圖
r0 = 0.65r
<backgrounds> #設置plot1背景顏色(點密集區域一個顏色,此處用灰色;點稀疏區域用綠色區分)
<background>
color = vvlgreen #顏色設置:very very light green (vvlgreen)
y0 = 0.006 #y0設置背景色起始位點,可以使用絕對值比如這里的0.006,也可以使用相對值,如0.75r
</background>
<background>
color = vlgrey
y1 = 0.006 # y1設置背景色終止位點
y0 = 0.002
</background>
</backgrounds>
</plot>
<plot>
file = data/6/snp.density.txt
#需要的數據都在https://github.com/vigsterkr/circos/tree/master/data/6
# 或者git clone https://github.com/vigsterkr/circos.git
fill_color = green
stroke_color = dgreen
glyph = rectangle
glyph_size = 8
max = 0.013
min = 0.007
r1 = 1.175r #plot2是從圓圈外部畫圖;繪圖區域方面,不同的plot一般不會設置重疊
r0 = 1.075r
</plot>
</plots>
線形圖
線形圖和散點圖類似,只不過線形圖用線代表了點,縱坐標大的點在線形圖中就是一條細高的線
<plots>
type=line
thickness = 2
<plot> # plot1
max_gap = 1u
file = data/6/snp.density.250kb.txt
color = vdgrey
min = 0
max = 0.015
r0 = 0.5r
r1 = 0.8r
fill_color = vdgrey_a3
<backgrounds> # plot1背景色
<background> #
color = vvlgreen
y0 = 0.006 #y0設定最低閾值,將高于0.006的部分設成淡綠色
</background>
<background>
color = vvlred
y1 = 0.002 #y1設定最高閾值,將低于0.002的部分設成淡紅色
</background>
</backgrounds>
<axes> #設置坐標軸,這個軸是沿著圓圈一圈一圈繞的,就像老唱片的磁道一樣
<axis>
color = lgrey_a2
thickness = 1
spacing = 0.025r #設置坐標軸間距
</axis>
</axes>
<rules>
<rule>
condition = var(value) > 0.006 #畫出高于0.006的值,這部分值顯示在綠色區域中
color = dgreen
fill_color = dgreen_a1
</rule>
<rule>
condition = var(value) < 0.002 #畫出低于0.002的值,并且這些值顯示在紅色區域中
color = dred
fill_color = dred_a1
</rule>
</rules>
</plot>
<plot> # plot2
max_gap = 1u
file = data/6/snp.density.txt
color = black
min = 0
max = 0.015
r0 = 1.075r
r1 = 1.15r
thickness = 1
fill_color = black_a4
</plot>
</plots>
直方圖
它是線形圖的變體,線形圖中就是用直線把近似的點連接,直方圖中就是把點用一個個方塊表示
<plots>
<plot>
type = histogram
file = data/6/hist.random.txt
color = red
r1 = 0.9r
r0 = 0.7r
max = 1 #這個看數據具體范圍設定
min = -1
thickness = 10p
fill_under = yes
fill_color = red
orientation = out #控制方向(紅色向外)
</plot>
<plot>
<plot>
type = histogram
file = data/6/hist.random.txt
color = green
r1 = 0.6r
r0 = 0.4r
max = 1
min = -1
thickness = 10p
fill_under = yes
fill_color = green
orientation = in #同時展示下向內的直方圖(這個功能就是為了區別不同的數據集)
</plot>
</plots>
使用的測試數據只有3條染色體信息,所以先畫三條的,明白怎么畫最重要
熱圖
要求的數據依然是:
# chr, start, end, value, and a list of optional parameters
...
hs7 36975000 36999999 33
hs7 37000000 37024999 50
hs7 37025000 37049999 60 color=blue
hs7 37050000 37074999 44
...
熱圖最大的特色就是利用顏色來區分數據,因此設置了color這個選項;并且顏色都是可以多種多樣的,具體的可以參考官方關于顏色的說明
<plots>
type = heatmap
<plot>
file = data/6/snp.number.1mb.txt
color = spectral-9-div #產生11種顏色,并且根據從min到max的數據賦予不同顏色。這個色板的信息位于etc/brewer.conf
stroke_thickness = 1
stroke_color = black
min = 1000
max = 5000
r0 = 0.80r
r1 = 0.90r
</plot>
<plot>
file = data/6/variation.heatmap.txt
color = spectral-9-div
stroke_thickness = 1
stroke_color = black
min = 2000 #為了能使顏色區分開,這里的min和max的設置非常重要,如果設置的間距太小,就容易區分不明顯
max = 250000
r0 = 0.60r
r1 = 0.70r
</plot>
<plot>
file = data/6/variation.heatmap.txt
color = ylorrd-9-seq-rev
stroke_thickness = 1
stroke_color = black
min = 2000
max = 250000
r0 = 0.40r
r1 = 0.50r
</plot>
</plots>
聯系圖Connector
這種圖會把核型圖上位于同一個染色體的起始和終止位點連接,不能跨染色體
輸入數據格式是:染色體 起始 終止
另外有一個特定的參數:connector_dims
需要設定5個值,分別代表畫線起始點、直線、斜線、直線、畫線終止的比例,并且5個值的和是1
<plots>
<plot>
type = connector
file = data/6/connectors.txt #要注意不同的數據使用的染色體不同,適時調整ideogram中的染色體配置,比如是否要顯示全部染色體,要展示哪幾條染色體等
r0 = 0.70r
r1 = 0.90r
connector_dims = 0,0.3,0.4,0.3,0 #表示開始畫圖=》第一條直線比例是0.3=》斜線比例是0.4=》第二條直線比例是0.3=〉畫圖終止
thickness = 2
color = red
</plot>
<plot>
type = connector
file = data/6/connectors.txt
r0 = 0.40r
r1 = 0.60r
connector_dims = 0,0,0.7,0.3,0 #斜線占的比例越大,傾斜角度越小
thickness = 2
color = black
</plot>
</plots>
高亮圖Highlights
想強調某一個條帶的某一個位置
數據格式是:染色體 起始 終止 顏色(fill_color = colr)
可以用<plot> + <type = highlights>
的方式,也可以用<highlights>
的方式
連接圖Links
比如想看一個基因在一個染色體與另一個染色體上發生融合的現象,用弧線表示
數據格式:1stChr start end 2nd Chr start end
會將第一個染色體的終點和第二個染色體的起點連接起來
<links>
<link>
file = data/5/segdup.bundle3.colored.txt
color = red
radius = 0.95r # 設定弧線起始點的位置位于0.95r的位置
bezier_radius = 0.1r # 控制弧線弧度
thickness = 1
</link>
file = data/5/curves.repeated.txt
color = blue
radius = 0.95r
bezier_radius = 0.1r
thickness = 1
</links>
連接圖升級版—絲帶圖Ribbon
終極組合圖
代碼在http://circos.ca/documentation/tutorials/2d_tracks/stacking_tracks/configuration。當然需要細細品味其中的意義,但是類型就是這幾種
歡迎關注我們的公眾號~_~
我們是兩個農轉生信的小碩,打造生信星球,想讓它成為一個不拽術語、通俗易懂的生信知識平臺。需要幫助或提出意見請后臺留言或發送郵件到Bioplanet520@outlook.com