做基因组相关分析的人迟早会遇到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步长50kbNBS-LRR基因位置文件nbs.gene.bed四列染色体、起始、终止、标记值共线性关系文件nbs.collinearity.txt六列连接线的端点坐标这里特别说一下共线性文件。TBtools支持两种常见格式一种是四列染色体A、位置A、染色体B、位置B另一种是六列染色体A、起A、止A、染色体B、起B、止B。如果要做基因级别的共线性连线我一般用六列格式这样连线的两个端点是准确的基因区间展示出来的连接更有信息量。如果只是展示大的共线性block四列或更粗粒度的区间也够用了。3.2 配置文件逐行拆解我这里的配置文件是完整的、可直接运行的。为了防止阅读时被长文本吓到我先把它分成背景配置和前景配置两块来讲。背景配置文件命名为background.confinclude 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.confinclude /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图。