做基因组相关分析的人,迟早会遇到Circos图。不管你是在做基因家族鉴定、比较基因组分析,还是单纯想把染色体分布、基因密度、共线性关系放在一张图里展示,Circos几乎是从审稿人审美到文章故事线都绕不开的一个坎。我以前第一次用原版Circos的时候,光调那个perl脚本和conf文件就折腾了两三天,最后效果还歪歪扭扭。后来换了TBtools的Advanced Circos功能,说实话,这才是真正让人能把精力放在数据本身而不是画图工具上的方案。
这篇攻略我打算从一个实际做基因家族分析的场景出发,完整拆解怎么用TBtools把Circos图画出来。包括三个核心数据文件怎么准备、前景配置和背景配置到底怎么理解、不同轨道类型怎么选参数,以及我在实际跑数据时踩过的一堆坑。想用TBtools画Circos图但一直没摸清门道的朋友,这篇可以直接照着操作,能少走不少弯路。
1. 绘图前的认知准备:Circos能做什么,TBtools怎么实现
1.1 一张Circos图能承载什么信息
Circos图本质上是一个环形布局的多轨道可视化方案。它把基因组比作一个圆环,环上按位置排列各种信息,从外到内层层叠加。最常见的用法是:最外圈放染色体刻度,往里依次放基因密度、GC含量、基因家族成员分布、共线性区块、结构变异等。
与传统的线性基因组图相比,Circos图的优势在于信息密度极高。一个圆环图可以同时展示基因组不同层面的特征,而且环形布局天然适合展示长距离的染色体内和染色体间关系,比如共线性片段、易位事件。在基因家族分析文章里,Circos图几乎是标配:既能把基因家族的染色体分布呈现给读者,又能把串联重复、共线性的结果整合在同一条视觉链路里。
不过也要说句实话,Circos图的短板同样明显——如果轨道堆叠太多、配色没有规划,整个图会变成一团五颜六色的毛线球,审稿人看得头皮发麻。所以画Circos图之前,想清楚“这张图到底要回答什么问题”,比急于上手重要得多。
1.2 为什么我用TBtools而不是原版Circos
原版Circos由Martin Krzywinski开发,基于Perl脚本运行,功能极其强大,但上手曲线也极其劝退。它要求你手工编写大量conf配置文件,包括karyotype文件、track配置、ideogram配置、link配置,颜色系统、字体系统、刻度格式都要逐一调教。而且Perl环境本身在Windows上安装就不太友好,我当年配环境配到怀疑人生。
TBtools的Advanced Circos功能则把这些繁琐配置做成了可视化界面加简化文本配置的组合。核心思路并没有变——依然是你提供一个配置文件和一个或多个数据文件——但语法简化、报错提示更清晰、图形界面能直接预览结果,修改参数重跑也就是几秒钟的事情。对于绝大多数科研场景,TBtools已经完全够用,甚至效果比原版更省心。
选择TBtools还有一个现实理由:国内的生信圈子几乎人人都有一个TBtools,陈程杰老师的这个软件已经把很多高频操作标准化了。你的合作者、师弟师妹、审稿人大概率都熟悉TBtools输出的图片风格,沟通成本低。所以说,TBtools不是用来“替代”Circos的,它是让你更快、更稳地达到Circos表达效果的一条捷径。
2. 三个数据文件的组织逻辑
用TBtools画Circos图之前,你先要理解它的数据组织方式。它不像Excel画个图选个区域就行,需要你准备一套结构清晰的数据文件,再写一个文本配置文件告诉TBtools“这些文件该怎么排布、画成什么样式”。很多人卡在这一步,不是软件难,而是没搞明白这几种文件之间的关系。
2.1 染色体长度文件(基因组骨架文件)
染色体长度文件是整个Circos图的地基。它定义了圆环上有哪些染色体(或scaffold)、每一条的长度是多少。TBtools对它的格式要求很宽松,常见的是两列或三列:第一列是染色体ID,第二列是长度,第三列可选,一般写染色体的显示颜色。
我自己习惯保留三列,方便在配置文件里直接用颜色名控制默认骨架色。比如:
Chr1 30427671 green Chr2 19698289 green Chr3 23459830 green Chr4 18585056 green Chr5 26975502 green注意一点:染色体ID必须和数据文件里的染色体ID严格一致,连大小写、空格都不能差。实际分析中,如果参考基因组来自不同版本或不同命名体系,非常容易在这里翻车。我的习惯是把所有文件的染色体ID统一用grep或Excel清洗一遍,确认没有隐藏空格、没有大小写混用,再开始画图。
2.2 数据轨道文件
数据轨道文件是画在染色体圈外的那些“图层”的数据来源。TBtools支持多种数据格式,但最常用的是区间型数据和散点/柱状型数据。
区间型数据一般四列:染色体ID、起始位置、终止位置、数值。比如基因密度:
Chr1 0 100000 3.2 Chr1 100001 200000 5.1 Chr1 200001 300000 2.0散点/柱状型数据则可能是三列:染色体ID、位置、数值。比如基因家族成员位置:
Chr1 14523 1 Chr1 67892 1 Chr3 2345678 1对于同一个数据集,你可以通过配置文件里的type参数把它画成柱状图(bar)、折线图(line)或散点图(scatter)。我觉得这是TBtools Advanced Circos非常灵活的一点:数据不用变,换一个type就能呈现完全不同的视觉效果,适合在组会上快速比较哪种表达方式更清晰。
2.3 配置文件的两个层次——背景配置与前景配置
这是TBtools绘制Circos图最关键、也最容易搞混的概念。在Advanced Circos界面中,要求你提供“配置文件”,实质上需要区分两种配置:背景配置(background)和前景配置(foreground)。
背景配置描述的是圆环最基础的显示内容,包括ideogram(染色体骨架)、刻度、以及里圈/外圈的背景填充。前景配置则描述画在骨架上方的高亮轨道、数据轨道、连接线、文本标签等。你可以只写一个背景配置文件,让它单独出图,得到一个只有染色体骨架和刻度的基础Circos;也可以背景配置和前景配置同时填写,让图层叠加在一起。
初次上手时,我建议先只写背景配置,确认染色体骨架正常显示,再逐步添加上下文。这样排查问题会轻松很多。等熟悉了语法,再一次性把背景、数据轨道、连接线全部写上,效率就高很多。
3. 实例拆解:一个基因家族的Circos图是怎么画出来的
3.1 场景设定与文件准备
假设我现在手里有一个物种的基因组和一套NBS-LRR抗病基因家族的鉴定结果。我要画一张Circos图来展示:这个基因家族的成员在各染色体上的分布位置、每条染色体的基因密度、以及家族内发生过共线性事件的基因之间的连接关系。
需要的文件有:
- 基因组染色体长度文件:
genome.len.txt - 全基因组基因密度文件:
gene.density.txt(按滑动窗口计算,窗口100kb,步长50kb) - NBS-LRR基因位置文件:
nbs.gene.bed(四列,染色体、起始、终止、标记值) - 共线性关系文件:
nbs.collinearity.txt(六列,连接线的端点坐标)
这里特别说一下共线性文件。TBtools支持两种常见格式:一种是四列(染色体A、位置A、染色体B、位置B),另一种是六列(染色体A、起A、止A、染色体B、起B、止B)。如果要做基因级别的共线性连线,我一般用六列格式,这样连线的两个端点是准确的基因区间,展示出来的连接更有信息量。如果只是展示大的共线性block,四列或更粗粒度的区间也够用了。
3.2 配置文件逐行拆解
我这里的配置文件是完整的、可直接运行的。为了防止阅读时被长文本吓到,我先把它分成背景配置和前景配置两块来讲。
背景配置文件(命名为background.conf):
<<include> chr_units = 1000 </include> <ideogram> <spacing> default = 0.01r </spacing> radius = 0.90r thickness = 20p fill = yes stroke_color = black stroke_thickness = 1p label_default = yes label_size = 30p label_color = black </ideogram> <ticks> radius_delimiter = 0.96r color = black spacing = 5u </ticks>这段配置里,chr_units = 1000指染色体长度文件里的长度单位是bp,这里设为1000后,刻度显示会以kb为单位。ideogram部分定义了染色体骨架的粗细(thickness = 20p)、是否填充(fill = yes)、标签大小(label_size = 30p)。ticks部分定义刻度线的间距,spacing = 5u意思是每隔5个chr_units(也就是5kb)画一个刻度。
前景配置文件(命名为foreground.conf):
<<include> </include> <links> <link> file = nbs.collinearity.txt radius = 0.99r bezier_radius = 0.1r color = red stroke_thickness = 2p </link> </links> <highlight> <highlight> file = gene.density.txt y0 = 0.80r y1 = 0.92r color = blue </highlight> <highlight> file = nbs.gene.bed y0 = 0.70r y1 = 0.75r color = orange </highlight> </highlight>这段配置里,links段落控制连接线,radius控制连接线与圆心的距离,bezier_radius控制连线的弯曲程度。越接近0,连线越接近直线;越大,连线拱得越高。highlight段落用来画数据轨道,每个数据文件对应一个轨道,y0和y1决定了轨道在径向上的位置范围。比如0.80r到0.92r就是在半径80%到92%的环形区域里画蓝色条带。
注意,highlight、link这些标签在TBtools里实际对应的可能是link、scatter、bar等不同的功能区,具体取决于版本。我写的这套语法更接近我常用的版本风格,如果你的TBtools版本界面稍有不同,去对应版本的帮助文档里核对一下标签名即可。
3.3 运行与参数调整
打开TBtools,进入Circos->Advanced Circos,界面上有两个输入框,一个让你填背景配置,一个让你填前景配置。把上面的配置文件分别粘贴进去,再在参数区设置输出文件的位置,点击Start,等待运行完成,就能在输出目录找到生成的PNG/SVG文件。
第一次出图后,几乎一定会遇到几个问题:轨道位置不合适、连接线弧度不对、标签字号太小。这些不需要改数据,只改配置文件里的参数就行。比如连接线太拱,就把bezier_radius从0.1r调小;标签太小,就把label_size从30p调到40p;染色体骨架太粗挡了数据轨道,就把thickness从20p改成12p。
我的习惯是先在TBtools界面里反复调参,调到满意之后把最终的配置文件保存下来,写进文章方法部分作为补充材料。这样既方便复现,也方便后面换数据集直接套用。
4. 常见问题与排查技巧实录
4.1 文件路径和命名问题
Advanced Circos在读取数据文件时,对相对路径的支持非常有限。我遇到过不止一次,明明文件就在当前目录,却报open file failed。解决办法很朴素:配置文件里涉及数据文件的地方,一律写绝对路径。
比如:
file = /home/user/circos/nbs.collinearity.txt另外,数据文件的文件名尽量不要带空格和中文,这看似很基础,但很多直接从Windows桌面拖进来的文件,名字里带着空格和括号,跑到一半才报错,浪费不少时间。我通常会把所有circos相关文件统一放在一个专门目录里,命名尽量简短,像len.txt、density.txt、nbs.txt、link.txt这样,省心不易错。
4.2 图层顺序不对怎么办
Circos的图层顺序是有优先级的。在TBtools的配置语法中,用<<、<<<、<<<<表示从外到内(或按优先级从低到高)的层叠关系。优先级越高,图层越靠内(或者说越压在别的图层上面)。很多时候你写了多个track,但显示出来互相覆盖,大概率就是优先级写错了。
我用一个土办法理解:把圆环想象成一个洋葱,优先级1是最外层,优先级2在优先级1的里面,依此类推。如果你想让某个数据轨道显示在最外圈,那就把它放在优先级1的层里。反之,想让它靠近中心,就放在优先级更高(数字更大)的层里。
实际操作中,我给基因密度和基因家族位置定义不同的优先级,让它们分别显示在不同的环形区域,避免重叠。比如基因密度放在外层,基因家族位置放在稍内层,这样视觉上层次分明,信息不打架。
4.3 轨道显示不全、标签太挤、配色不合适
如果某个轨道只有一小段显示出来,大概率是配置文件里数据文件的坐标范围超出了染色体长度文件定义的范围。比如你有条染色体长3000万bp,但数据文件里有一条记录写到了3500万,那超出部分就会被截掉,看起来像“少了一段”。解决办法是回头检查数据文件的坐标范围,必要时用awk筛掉越界记录。
标签太挤的问题在染色体数目多的时候特别明显。比如你画的是一个有几十条scaffold的基因组,名字全部堆在一起,根本没法看。这种情况下可以缩短显示的染色体范围(在配置里过滤掉长度小于某个阈值的scaffold),或者调小label_size并增大spacing。实在不行,还可以只显示主染色体,scaffold的信息换用附表呈现。
配色方面,我的经验是:不要一开始就追求花哨。先用灰度或单一色系把布局跑通,确认信息结构没问题,再上多色方案。这样一方面是调试方便,另一方面也是避免“五彩斑斓但没人看得懂”的失败作品。TBtools支持直接写颜色名,也支持#RRGGBB格式的hex色值,建议先用主色+辅助色两种颜色,最多不要超过四个主色。
4.4 数据预处理中的ID匹配坑
这是最隐蔽也最耗时的坑。基因家族分析做完,你手里的位置文件常常是从BED文件里提取出来的,而BED文件的染色体ID可能是Chr1、chr1、1多种写法混着来。如果没统一,TBtools会把它们当作完全不同的染色体,各自成一条轨道,结果就是你原本想画5条染色体,出来的图却多了好几条奇怪的“染色体”。
另外,如果你的分析流程里使用了Ensembl或NCBI来源的数据,它们的染色体命名体系(比如NC_003070.9)和基因组注释文件里的命名(Chr1)经常对不上,这一步要提前做映射。我自己一般用Python或awk做一个ID替换,把所有文件统一成同一套命名后再导入。
提示:ID匹配问题在基因家族Circos图里尤其常见,因为你要同时用到注释文件里的基因ID、BED文件的坐标、共线性分析工具输出的block关系。这些文件的来源不同,命名规则也不同。动手画图之前,先把所有文件的染色体ID列提取出来,
sort -u去重,肉眼扫一遍,确认没有多余命名。
5. 我的几点实操心得
写到最后,说几个我自己的习惯,算不上什么标准做法,但对提升Circos图的产出效率确实有帮助。
第一,画图前先画“丑图”。第一次跑通流程后,不要急着调颜色、调字体,先看清整体布局。丑图的价值在于暴露问题——轨道重叠、数据缺失、连接线错位,这些问题在丑图上反而比美化后的图更显眼。我一般会先出一版默认参数图,再沿着问题一个个改。
第二,把最终能用的配置文件当实验记录保存。Circos图调参非常琐碎,今天调一个参数,明天调一个参数,很容易忘记哪个组合是“能出图且好看”的状态。每当你调出满意效果,就把配置文件归档,命名带日期或版本号。后面再做另一个物种或者另一类基因家族分析时,直接复制配置文件,只换数据文件,几乎不需要从头摸索。
第三,TBtools版本更新后,Advanced Circos的参数名可能微调,不要死记我上面写的参数名。真正要掌握的是配置逻辑:结构(用哪个标签定义哪个图层)、数据(文件格式对不对、ID是否匹配)、美学(轨道位置、颜色、字体)。这三层想清楚,版本怎么变你都能快速适应。
Circos图说到底只是展示工具,但它能把基因组里那些藏在坐标和序列背后的关系,用肉眼可感知的方式讲出来。掌握TBtools的这套画法之后,你会发现做图这件事不再卡住你讲故事的手脚,更多的精力可以放在分析本身。希望你也能画出一张清晰、美观、经得起推敲的Circos图。