Circos系列教程(二)染色体示意图ideograms 30

本节的目标就是画出如下的图

circos绘制简单的ideogram

基础:circos作业流程

circos流程图

定义:
The symbolic representation of chromosomes are called ideograms.

circos为了能准确地画出染色体示意图,染色体的定义,位置,大小,以及显示的形式都是circos需要考虑的。这些要素需要在数据文件当中定义出来。

数据结构
染色体组型(karyotypes)是一类特殊的数据。一般的,它保存在名为xx.karyotype.txt文件当中。它将定义染色体的大小,ID,名称和颜色。每一行一条染色体,格式如下:

chr - ID LABEL START END COLOR

最开始的chr表示,这一行将定义一个染色体。然后是一个短线占位符。这个占位符通常用来定义所属关系,对于染色体来说,没有所属。
ID是染色体唯一且不能重复的标识。之后的LABEL是将来用于显示在图上的文本。如果一个染色体组型文件里面包含多个不同来源的染色体组,设置ID最好的办法就是使用前缀。比如hs=homo sapiens, mm=mus musculus等等。有时候你可以使用hs19做为前缀来明示数据来源版本。其实,即使是只有一个来源的染色体组,也最好使用前缀,以规范文件格式。
START和END值定义了染色体的大小。对于染色体组型文件,需要指明的是,这里的START和END应该是染色体本身的大小,而不是你想绘制部分的起止位置。指定绘制部分将由其它文件来定义。
COLOR是于定义显示的颜色。如果染色体组不以条纹(cytogenetic bands)图谱覆盖的话,那么就会以这里设置的颜色显示。对于人类基因组而言,circos预设了与染色体相同的名字做为颜色名,比如chr1, chr2, … chrX, chrY, chrUn.
下面就是hg19的例子:

chr - hs1 hs1 0 249250621 chr1
chr - hs2 hs2 0 243199373 chr2
chr - hs3 hs3 0 198022430 chr3
chr - hs4 hs4 0 191154276 chr4
chr - hs5 hs5 0 180915260 chr5
chr - hs6 hs6 0 171115067 chr6
chr - hs7 hs7 0 159138663 chr7
chr - hs8 hs8 0 146364022 chr8
chr - hs9 hs9 0 141213431 chr9
chr - hs10 hs10 0 135534747 chr10
chr - hs11 hs11 0 135006516 chr11
chr - hs12 hs12 0 133851895 chr12
chr - hs13 hs13 0 115169878 chr13
chr - hs14 hs14 0 107349540 chr14
chr - hs15 hs15 0 102531392 chr15
chr - hs16 hs16 0 90354753 chr16
chr - hs17 hs17 0 81195210 chr17
chr - hs18 hs18 0 78077248 chr18
chr - hs19 hs19 0 59128983 chr19
chr - hs20 hs20 0 63025520 chr20
chr - hs21 hs21 0 48129895 chr21
chr - hs22 hs22 0 51304566 chr22
chr - hsx hsx 0 155270560 chrx
chr - hsy hsy 0 59373566 chry

一般的,我们都会在染色体组型文件当中加上条纹图谱的信息,这样才会让染色体图谱看上去有被染色的效果。文件格式与之前的一致,也只有七列。

band DOMAIN ID LABEL START END COLOR

这里的DOMAIN就是染色体组型当中的ID就好了,其它的定义与前面的一致。下面就是一个例子。

band hs1 p36.33 p36.33 0 2300000 gneg
band hs1 p36.32 p36.32 2300000 5400000 gpos25
band hs1 p36.31 p36.31 5400000 7200000 gneg
band hs1 p36.23 p36.23 7200000 9200000 gpos25
band hs1 p36.22 p36.22 9200000 12700000 gneg
band hs1 p36.21 p36.21 12700000 16200000 gpos50
band hs1 p36.13 p36.13 16200000 20400000 gneg
band hs1 p36.12 p36.12 20400000 23900000 gpos25
band hs1 p36.11 p36.11 23900000 28000000 gneg
band hs1 p35.3 p35.3 28000000 30200000 gpos25
band hs1 p35.2 p35.2 30200000 32400000 gneg
band hs1 p35.1 p35.1 32400000 34600000 gpos25
band hs1 p34.3 p34.3 34600000 40100000 gneg
band hs1 p34.2 p34.2 40100000 44100000 gpos25
band hs1 p34.1 p34.1 44100000 46800000 gneg
band hs1 p33 p33 46800000 50700000 gpos75
band hs1 p32.3 p32.3 50700000 56100000 gneg
band hs1 p32.2 p32.2 56100000 59000000 gpos50
band hs1 p32.1 p32.1 59000000 61300000 gneg
band hs1 p31.3 p31.3 61300000 68900000 gpos50
band hs1 p31.2 p31.2 68900000 69700000 gneg
band hs1 p31.1 p31.1 69700000 84900000 gpos100
band hs1 p22.3 p22.3 84900000 88400000 gneg
band hs1 p22.2 p22.2 88400000 92000000 gpos75
...

cytogenetic bands的名称例子:1p36.33 其命名规则是之前的数字、字母为染色体代号,一般是数字或者X,Y。而之后会有字母p或者q。p代表短臂,q代表长臂。而每个band都会有颜色深浅的不同,这里主要以gpos和gneg来区别。为了和真实值更接近,circos还定义了一系列的灰度。

染色体组型定义

设置文件
circos的设置文件可以分为多个文件,也可以只写在一个文件里。一般地,为了人们阅读方便,都会写在多个文件,每个文件描述不同的部分,最后由一个主文件来调用就可以了。
这一节,需要设置三个方面,一,数据源,二如何画染色体,三如何画坐标,所以我们也将它分为三个文件,分别名为circos.conf, ideogram.conf,和ticks.conf。由circos.conf来定义数据源,并调用ideogram.conf和ticks.conf。

circos.conf的内容

<colors>
white     = 255,255,255
black     = 0,0,0
blue      = 0,0,255
<<include etc/colors.ucsc.conf>>
</colors>
 
<fonts>
<<include etc/fonts.conf>>
</fonts>
 
<<include ideogram.conf>>
<<include ticks.conf>>
 
<image>
<<include etc/image.conf>>
</image>
 
# specify the karyotype file here
karyotype = karyotype.human.hg19.txt
 
chromosomes_units           = 1000000
chromosomes_display_default = yes
 
<<include etc/housekeeping.conf>>

这里可以注意到它引入其它文件时使用的是<>的方式。注意,这里include会从circos所在的目录开始寻找,而不是当前目录。我们可以在circos的安装目录当中找到一个名为etc的目录,可以点击查看其中的colors.ucsc.conf,image.conf,以及housekeeping.conf的内容。

在circos当中使用karyotype=xxx语句来定义了karyotype的数据来源。chromosomes_units=1000000定义了基准单位。可以试着把这个值扩大10倍。

接下来我们看ideogram.conf。在ideogram.conf文件中,定义了如何显示染色体组型。

<ideogram>
 
<spacing>
default = 0.005r
break   = 5u
</spacing>
 
#position configuration
radius           = 0.90r
thickness        = 100p
fill             = yes
fill_color       = black
stroke_thickness = 2
stroke_color     = black
 
#label configuration
show_label       = yes
label_font       = bold
label_radius     = dims(ideogram,radius) + 0.07r
label_with_tag   = yes
label_size       = 36
label_parallel   = no
 
#band configuration
show_bands            = yes
fill_bands            = yes
band_stroke_thickness = 2
band_stroke_color     = white
band_transparency     = 0
 
</ideogram>

在ticks.conf当中定义了如何来绘制刻度。

show_ticks          = yes
show_tick_labels    = yes
 
<ticks>
skip_first_label = no
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
show_label     = no
thickness      = 2p
color          = dgrey
</tick>
 
<tick>
spacing        = 5u
show_label     = no
thickness      = 3p
color          = vdgrey
</tick>
 
<tick>
spacing        = 10u
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>

好了,有了这些文件,我们就可以让程序跑起来了。

/path/to/circos/bin/circos -conf ./circos.conf

circos绘制简单的ideogram

嗯,图型是出来了。可是这些参数设置具体指的是什么呢?如何改变它才能达到我们需要的效果呢?

第一个问题,如何显示部分染色体,如何显示染色体的一部分,如何截段显示染色体,如何按自定义的顺序来显示?

显示部分染色体
前面我讲过,在染色体组型文件中需要写入染色体的正确大小,而不是自己想画的那一部分。而设置画哪些染色体,画染色体的哪部分,都应该在设置文件中来阐明。
在circos.conf文件中有一句chromosomes_display_default = yes,它的意思就是显示所有的染色体。如果只需要显示部分染色体,我们先注释掉这一行,而后使用
chromosomes = hs1;hs2;hs3这样的语句来指定需要显示的染色体。hs1,hs2,sh3都是染色体组型文件当中的id。
原语句

chromosomes_display_default = yes

替换成

chromosomes = hs1;hs2;hs3

使用 chromosomes = hs1;hs2;hs3这样的语句来指定需要显示的染色体

如果只想去掉其中的一两条染色体,上面的写法又太麻烦了。circos提供了”-“运算符。
原语句

chromosomes_display_default = yes

替换成

chromosomes = -hs1;-hs2;-hs3
chromosomes_display_default = yes

这样的就是不显示hs1,hs2,hs3。

不显示hs1,hs2,hs3

显示染色体的一部分
一条染色体,只想显示它的一小截,需要使用chromosomes = …;ID:START-END;…这样的定义。比如只希望显示hs1的0~100Mb, hs2的50~150Mb,h3的50~100Mb应该是
原语句

chromosomes_display_default = yes

替换成

chromosomes = hs1:0-100;hs2:50-150;hs3:50-100;hs4;hs5;hs6;hs7;hs8

显示hs1的0~100Mb, hs2的50~150Mb,h3的50~100Mb

奇怪的是这里的起止数字并没有单位,难道是默认的以Mb为单位吗?并不是这样的。因为我们在circos.conf文件中定义有chromosomes_units = 1000000,它才会以Mb为单位显示。在circos的绘图单位中,有一个u单位,这个u就是指的chromosomes_units了。如果你将chromosomes_units设置成10M,那么上面的语句就需要改成hs1:0-10…这样子。

嗯,有没有象前面一样的”-“运算符呢?有的。
原语句

chromosomes_display_default = yes

替换成

chromosomes = hs1;hs2;hs3;hs4;hs5;hs6;hs7;hs8
chromosomes_breaks = -hs1:100-200;-hs2:0-50;-hs2:150-);-hs3:0-50

chromosomes_breaks = -hs1:100-200;-hs2:0-50;-hs2:150-);-hs3:0-50


其中”)”表示染色体的末端。

段点显示不明显啊。这需要我们来定义一个段点显示的方式。在ideogram.conf文件中<spacing>…</spacing>加入下面的语句

axis_break         = yes
axis_break_style   = 1
axis_break_at_edge = yes
 
<break_style 1>
    stroke_color = black
    fill_color   = blue
    thickness    = 0.25r
    stroke_thickness = 2
</break_style>

就可以定义出蓝色的轴线了。其中,axis_break_style后面设置的数值就是自己定义的<break_style ..>当中的数值。

定义一个段点显示的方式

我们也可以结合着”chromosomes”和”chromosomes_breaks”来显示,这样可以更方便的控制复杂的段点。比如

chromosomes = hs1:0-100;hs2:0-100;hs3:0-100;hs4:0-100;hs5;hs6;hs7;hs8
chromosomes_breaks = -hs1:25-75;-hs2:25-75;-hs3:25-75;-hs4:25-75;-hs5:75-);-hs6:75-);-hs7:75-);-hs8:75-)

控制复杂的段点

自定义顺序显示
自定义顺序使用chromosomes_order来定义。假设我们设置chromosomes=hs1;hs2;hs3;hs4;hs5;hs6;hs7;hs8。我们使用

chromosomes_order = hs2,hs3,hs1,hs5,hs4,hs8,hs7,hs6

可以得到2,3,1,5,4,8,7,6的顺序。

得到2,3,1,5,4,8,7,6的顺序

有的人可能觉着这种方法太麻烦了,如果我们希望hs4显示在hs5之后,这种相对顺序的设置可以使用

chromosomes_order = hs5,hs4

hs4显示在hs5之后

但是我们发现,这显示出来的顺序是1 2 3 6 5 4 7 8,也就是说,5后面的6先被拿出来,将4放入,4的位置空了,于是把6放到4的位置上去了。如果我们需要的是1 2 3 5 4 6 7 8这样子的顺序,也就是说只是换一下4和5的顺序的话,就需要把3也设置进来。思考的方式是先将4空出来,把5放在4的位置,然后把4放进5的位置,可以使用

chromosomes_order = hs3,hs5,hs4

顺序是1 2 3 6 5 4 7 8

如果我们想将某个,或者某几个染色体放在最前面或者最后面,可以使用^或者$定位符。比如

chromosomes_order = ^,hs5

就是让hs5显示在第一位。
使用^定位符

chromosomes_order = hs5,$

就是让hs5显示在最后一位。

使用$定位符

如果我们想将hs3和hs2间隔一位显示,可以使用chromosomes_order = hs3,-,hs2。但是这样显示的结果是4 5 3 1 2 6 7 8。排序过程是把hs3做为锚定点,先将它后面的两位空出来,然后将hs2和它前面的一位放入,再把空出来的两个位置补满。如果想分组显示,可以使用chromosomes_order = hs3,hs2,|,hs8,hs1这样的行式。但是我个人认为这些排序方式作用并不是很大,因为它的排序过程并不是那么直观,反而不是直接依次写入来得直接。

第二个问题,如何设置间隔?

设置间隔

我们前面已经了解到了一些,在ideogram.conf文件中<spacing>…</spacing>就是用于设置间隔的,也了解到什么是u单位。在circos中,除了u单位,还有一个r单位。r是relative的首字母,它是指相对于全图的大小。比如本文中使用的deault = 0.005r就是使用的r单位。我们可以将u视作绝对单位,把r视作相对单位。

10u单位


0.1r单位

如何设置某两个之间的间隔与其它的不同呢?我们可以使用<pairwise>标签来定义。比如

<spacing>
	default = 0.005r
	#default = 10u
	<pairwise hs1;hs2>
		spacing = 0.25r
	</pairwise>
	<pairwise hs3>
		spacing = 15u
	</pairwise>
</spacing>

就会让hs1和hs2之间变得很小,而hs3两端固定为15u。

让hs1和hs2之间变得很小,而hs3两端固定为15u

第三个问题,如何修改染色体名字和显示位置?

染色体的名称及名称位置
染色体的名称,实际上是由染色体组型文件设定的。在设置文件中,我们可以更改的是它的后缀,并不能修改名称本身。如果需要变换名称本身,需要直接修改染色体组型文件的ID值。

在前面的例子中,有分段显示染色体的,如果染色体有多段的话,它们的标签都是一样的,这样并不容易识别,如果顺序再打乱的话,就更加能以分别。我们可以使用更改后缀的方式来让显示的区分变得明显。比如

chromosomes = hs1[a]:0-50;hs1[b]:150-);hs2[c]:0-50;hs2[d]:150-);hs3[e]
chromosomes_order = ^,a,c,e,|,b,$

更改后缀的方式来让显示的区分变得明显

我们可以使用

<ideogram>
label_with_tag = no
</ideogram>

来关闭染色体名称的显示。

如果我们希望变换名称显示的位置,可以通过label_radius,label_center以及label_parallel等参数来设置。其中label_radius使用到了一个函数dims(),它的意思就是尺度(Dimension),它有两个参数,一个是计算谁的尺寸,一个是计算哪一部分的尺寸。比如dims(ideogram,radius_inner),就是指ideogram设置当中radius_inner的值。而dims(ideogram,radius_outer)就是指ideogram设置当中radius_outer的值。通常的label_center都是no,也就是外对齐的,如果设置它为yes,就是居中对齐了。
假设我们将ideogram.conf当中的

label_radius     = dims(ideogram,radius) + 0.07r

改变为

label_radius     = dims(ideogram,radius_inner) - 0.07r

变换名称显示的位置

如果我们设置

label_parallel   = yes

label_parallel = yes

我们打开etc/image.conf会发现它链接了etc/image.generic.conf设置文件,在后者当中,它设置了angle_offset = -90。这就是为什么排在第一位的染色体总是从图像的最上方开始显示。circos对角度的解释是这样的:

      -90
       |
 180 --+-- 0
       |
       90

该文件还可能设置有angle_orientation = counterclockwise,它的意思是反时针方向排布。默认值为”clockwise”。

染色体的位置
我们可能会觉得,染色体画得是不是太靠边了,有没有办法让它往中间靠靠呢?只需要修改<ideogram>中的radius参数就可以了。试着将

radius           = 0.90r

修改为

radius           = 0.50r

染色体的位置

如果希望画逐一设置染色体的所画的半径呢?
修改

chromosomes_display_default = yes

chromosomes = hs1;hs2;hs3;hs4;hs5;hs6;hs7;hs8;hs9;hs10
chromosomes_radius = hs1:0.5r;hs2:0.55r;hs3:0.6r;hs4:0.65r;hs5:0.7r;hs6:0.75r;hs7:0.8r;hs8:0.85r;hs9:0.9r;hs10:0.95r

逐一设置染色体的所画的半径

如果觉着它画得太粗了,换细一点呢?修改

thickness        = 100p

thickness        = 50p

换细一点

第四个问题,如何只画染色体,不填充条纹呢?

只需要设置ideogram.conf当中show_bands=no就可以了。如果想显示条纹,但不填充,设置show_bands=yes, fill_bands=no就可以了。但实用性不大。

如果想设置填充条纹的不透明度呢?设置band_transparency为大于0的整数即可。比如设置为2。于是我们得到七彩的染色体图谱。

设置填充条纹的不透明度

第五个问题,如何设置坐标刻度?

这是一个比较复杂的问题。以后会专门介绍。这里就只解释一下结构。
show_ticks是否显示刻度
show_tick_labels是否显示刻度字符
然后使用<ticks>来定义每一种刻度。

本文内代码下载:
ideograms

30 thoughts on “Circos系列教程(二)染色体示意图ideograms

  1. Reply microtan 8月 14,2013 10:17 上午

    配置文件放在哪个目录下哪?
    win/linux/macox的配置文件是不是需要写的不一样哪?、

    easy in easy out.

    thanks

  2. Reply Mabing 7月 6,2014 5:28 上午

    博主,您好,请问能否具体告知《R语言与Bioconctor生物信息学应用》第一章例1-4基因列表文件gene_list1.txt的文件下载地址吗?还有,书中一些实例代码运行有错误,可否解答一下。

  3. Reply mike 8月 5,2014 8:13 上午

    博主,您好。为什么我将chromosomes_display_default = yes替换为chromosomes = hs1;hs2;hs3之后再运行一次得到的图形中仍然是显示12条染色体呢

  4. Reply mike 8月 5,2014 8:18 上午

    但是如果是用chromosomes = -hs1;-hs2;-hs3
    chromosomes_display_default = yes
    去替代
    chromosomes_display_default = yes
    就可以不显示染色体1-3了,请教是什么原因。

  5. Reply mike 8月 5,2014 9:20 下午

    chromosomes_display_default = yes
    这一语句好像有没有都不影响输出结果,是不是在其他地方有这个设置呢,但是我看了下ideogram.conf和ticks.conf中都没有相应的设置。
    比如我想不显示染色体1-3,使用chromosomes = -hs1;-hs2;-hs3
    chromosomes_display_default = yes,如果把chromosomes_display_default = yes标注掉,结果一样只显示不包含染色体1-3的结果。
    但是,如果我只用chromosomes = hs1;hs2;hs3,显示结果却仍然包含12条染色体,似乎在chromosomes=…这条语句之前就已经应用了chromosomes_display_default = yes,所以全部染色体都显示,但这样的推测又与上面的操作结果不相符。真是奇怪。。。

  6. Reply mike 8月 7,2014 10:01 下午

    博主,您好。
    我知道怎么解决了。
    chromosomes_display_default = yes是一个默认设置,即便不使用这一句,也会照此执行。所以,要改变这个设置必须显式地指定chromosomes_display_default = no。
    所以前面老是设置只显示三条染色体可以这样设置,将chromosomes_display_default = yes替换为chromosomes_display_default = no
    chromosomes = hs1;hs2;hs3
    这样就可以了。^_^

  7. Reply bioimformation worker 11月 26,2014 9:42 上午

    博主,请问我现在有fa和gff文件,我怎么根据这两个文件生成karyotype file文本文件呢?

    • Reply admin 11月 30,2014 4:00 下午

      fa和gff文件都不是生成karyotype file的必需的。你需要理解什么是karyotype,它是染色体组型,并不是基因注释文件,它只与物理染色有关。所有你需要找到染色体组型的正确文件。

  8. Reply seadog 12月 2,2014 10:01 下午

    博主您好!
    请教一下最后一张图《设置填充条纹的不透明度》,不同颜色的条带是否有什么含义?谢谢ing

  9. Reply 袁绍欣 7月 20,2015 8:52 下午

    博主您好
    您在博文中提到数据结构中的START和END应该是染色体本身的大小,而不是你想绘制部分的起止位置,指定绘制部分将由其它文件来定义,这其他文件是什么文件。已知在某条染色体上的起止位置,我想把这一段部分给描绘出来,要用什么样的格式

  10. Reply Mariel 10月 15,2015 10:28 下午

    博主您好
    请问外围label有点长,怎么设置倾斜30度呢?谢谢ing

  11. Reply feng 8月 30,2016 5:11 上午

    博主,你好,当修改了1到10号染色体的半径显示时,此时label还都是原来的位置,怎么修改让label自己适应当前染色体的半径呢

    • Reply admin 8月 30,2016 8:17 上午

      你的label_radius 是怎么设置的?

      • Reply feng 8月 30,2016 8:38 下午

        博主,你好,按照教程一点一点尝试的;abel_radius = dims(ideogram,radius) + 0.07r;就是想请问下:如果在circos.conf中修改了半径的长度的话chromosomes_radius = hs1:0.5r;hs2:0.55r;hs3:0.6r…;如何在ideom.conf修改label_radius?谢谢啦

  12. Reply zhangqingyang 4月 18,2017 4:26 上午

    老师:您好,按照您的步骤跑下来,但是出现了错误,检查过绝对路径都正常,就是不知道问题到底出在哪里,说是没有定义这个颜色,但是不应该啊
    COLOR HANDLING ERROR

    You’ve asked for color named [vdgrey] but this color has not been defined.

    • Reply admin 4月 20,2017 8:48 上午

      可能是circos版本升级了之后,很多我这里的教程都过时了。你先试着<<include etc/colors_fonts_patterns.conf>>一下,看能不能解决。

  13. Reply Wangjubin 11月 20,2017 2:19 上午

    老师,您好,请教一个问题:如果画出ideogram,但是其中几个label不显示

    • Reply admin 11月 20,2017 5:08 下午

      在http://circos.ca/documentation/tutorials/ideograms/labels/中提到的:
      # hide label for chromosome hs10
      label_format = eval( var(chr) eq “hs10” ? “” : var(label))
      是不是你想要的?

      • Reply Wangjubin 11月 23,2017 4:09 上午

        谢谢你及时回复我,最近有点忙没看到,我会好好看你给的建议,再次感谢!

      • Reply Wangjubin 11月 23,2017 8:11 上午

        老师,你说的方法可行,我已经解决了,再冒昧问一个问题:linker中的线可以按照颜色深浅来划么,用什么参数改变呢?

Leave a Reply

  

  

  

%d 博主赞过: