前阵子帮一个师弟做基因家族分析,流程跑到最后一步卡住了:基因家族成员在全基因组上的分布情况需要用一张图展示给审稿人。他翻了半天教程,不是让写R代码,就是让配Perl脚本,折腾了一整晚也没出图。后来我用了TBtools自带的Advanced Circos模块,前前后后不到十分钟就把他要的图搞定。这篇文章就把这套“TBtools绘制Circos图”的方法完整写出来,从原理、数据准备到参数调节,再到我自己踩过的一些坑,希望能让后面做基因组可视化的朋友少走弯路。
先说清楚这篇内容适合谁看。如果你正在做基因家族分析、比较基因组、或者单纯想把基因在染色体上的密度分布画出来,且不太想碰代码,那这篇攻略就是给你准备的。哪怕你之前完全没用过TBtools,只要会基础的Excel操作,跟着下面的步骤走,也能在半小时内跑出一张能放进论文的Circos图。
1. Circos图是什么,为什么基因家族分析离不开它
1.1 一张图解决“基因在染色体上怎么排”的问题
Circos图本质上是一种环形布局的可视化图表,最早主要用于基因组学数据展示。它的核心优势在于:把线性染色体弯成一个圆,外层放上染色体编号和刻度,内层就可以叠加各种数据轨道。在做基因家族分析时,最常见的一种需求就是展示“这个家族的成员在每条染色体上分布了多少、有没有成簇现象”。
我见过很多研究生的第一版基因家族染色体分布图,是用Excel画成长条形的。长条图当然也能表达,但如果你有12条甚至更多染色体,长条排在一起占版面不说,还不直观。Circos图把所有染色体放在一圈里,基因密度高的区域一眼就能看出来,而且不占地方,放到论文里又省空间又好看,所以很多主流期刊都愿意接受这种呈现方式。
1.2 除了基因密度,Circos图还能展示什么
Circos图能承载的信息量远不止基因密度一项。我经常用到的组合是:外层显示染色体编号和长度刻度,内层第一条轨道显示基因密度,第二条轨道显示SNP密度,中间如果再拉几条连线表示基因之间的共线性关系,整个图就非常立体了。
做基因家族分析的时候,Circos图还有另一个用处——展示“基因复制事件”。比如全基因组复制产生的共线性区块,在Circos图里用色带连起来,远比用文字描述“某号染色体与某号染色体存在大片段共线性”有说服力。这也是为什么比较基因组学论文里,Circos图几乎成了标配。
1.3 为什么选择TBtools而不是R包或Perl
画Circos图有三个常见路线:官方Perl版本的Circos、R语言的circlize包、TBtools图形化界面。官方Circos的功能最强大,但配置文件的写法比较繁琐,说实话新手光调一个颜色就能搞一小时。R语言的circlize也很灵活,但需要写代码,而且不同版本包更新时语法可能会有变化。
TBtools的优势在于完全图形化,鼠标点一点就能出图。虽然它的Circos模块灵活度不如前两者,但对于“画一张标准的基因密度Circos图”这个需求来说,已经绰绰有余了。特别是做基因家族分析这种重复性比较高的任务,TBtools可以让流程标准化,换一个家族、换一组数据,重新跑一遍即可,基本不需要调参成本。
2. 画图前必须准备好的两个数据文件
2.1 先搞懂TBtools的Circos需要什么格式的数据
很多人在第一步就出问题,是因为没搞明白TBtools的Advanced Circos到底需要什么样的输入数据。它本质上是把染色体长度和基因位置叠在一起,然后按窗口统计基因数量,所以至少要准备两份文件:
第一份是染色体长度信息,告诉软件一共有几条染色体、每条染色体有多长。第二份是基因位置信息,告诉软件每个基因在哪条染色体的哪个区间上。两个文件准备好了,剩下的就是参数微调。
这一点理解了,后面所有操作其实都很顺。因为软件本身不负责帮你整理数据,你的GFF文件、注释文件里内容再多,只要没提取成它要求的格式,它就一概不认。我见过有人直接把GFF3原始文件拖进去,结果出来的图一片空白,还以为是软件装错了。
2.2 从GFF文件快速提取染色体长度和基因位置
绝大多数真核生物基因组注释文件都是GFF3或GTF格式。提取基因位置最直接的办法是用awk命令。假如你的基因组注释文件叫genome.gff3,基因结构注释里的第三列会有CDS、exon、gene、mRNA这些记录,我们要的是第三列为gene的那行。
awk -F '\t' '$3=="gene" {print $1"\t"$4"\t"$5"\t"$9}' genome.gff3 > gene_position.txt这条命令的意思是:以Tab为分隔符,找出第三列是gene的行,输出染色体编号、起始位置、终止位置以及第九列的注释信息。生成的gene_position.txt就是一张最基础的三到四列位置表。
染色体长度文件更简单,如果你有参考基因组的.fai索引文件,直接切前两列就行:
cut -f1,2 genome.fasta.fai > chr_length.txt如果没有.fai文件,也可以用samtools faidx先生成索引,或者直接去NCBI把每条染色体的长度抄下来,整理成两列也完全没问题。
2.3 只提取特定基因家族成员的位置信息
前面说的是提取全部基因,但基因家族分析经常只需要关注某一个家族几十个基因的位置。这时候可以先把家族成员ID整理好,再去GFF文件里匹配位置。
比如你已经从Pfam或InterPro扫描结果里拿到了基因家族成员列表family_member_ids.txt,一行一个基因ID,想从全基因组注释中挑出它们的位置:
grep -w -f family_member_ids.txt genome.gff3 | awk -F '\t' '$3=="gene" {print $1"\t"$4"\t"$5"\t"$9}' > family_position.txt但直接grep容易出现一个问题:基因ID和mRNA ID、转录本ID会相互干扰。比如你先在HMMER结果里拿到的是蛋白ID(如XP_001234567.1),而GFF文件里记录的是基因ID(gene-12345),这就对不上号了。我一般会先写个小脚本,把基因名的对应关系整理好,再提取坐标。实际操作中,可以先在Excel里把每个家族成员的基因ID从注释文件中vlookup出来,然后再用这些ID去匹配,这样虽然操作多两步,但不容易出错。
2.4 数据格式检查的三个细节
文件准备好了,但格式不对照样出不了图。我总结了三个最容易踩的坑:
第一,分隔符必须是制表符Tab,不能用空格。Excel打开能看、能用,但如果你在Windows里用记事本或者某些编辑器编辑过文件,行尾可能会有隐藏字符,建议用VS Code或Notepad++这类工具转换一下。第二,染色体编号必须完全一致。GFF文件里如果写的是Chr1,长度文件里写的是chr1,多一个小写字母c,TBtools就会认为它们是两条不同的染色体,结果图里会多出一条空圈或者干脆空白。第三,坐标正负链无所谓,但起始和终止位置最好统一,小的在前大的在后,虽然TBtools一般能自动识别,但文件干净一点总归没坏处。
我自己习惯在做完文件之后先快速看一眼预览:
head gene_position.txt head chr_length.txt确认前几行格式没问题再导入TBtools,这一步能省下后面大量的排查时间。
3. TBtools绘制Circos图的完整实操过程
3.1 定位到Advanced Circos模块并完成数据导入
打开TBtools后,窗口顶部菜单栏选择Graphics,在下拉菜单里找到Advanced Circos,点击即可进入绘图界面。不同版本的TBtools菜单位置可能略有差异,如果你下载的是用Java重写的新版,入口可能叫Advanced Circos,也可能在子菜单里,名字变来变去但关键词里都有Circos,搜索一下就能找到。
进入界面后,第一步填入染色体长度文件,也就是之前整理的chr_length.txt。第二步填入基因位置文件,也就是gene_position.txt。注意TBtools的Advanced Circos并不一定要求你提供严格的BED格式,它允许有表头,但最好保持简洁。如果位置文件有3列以上,TBtools会自动识别前几列分别对应染色体、起始、终止。
填好之后,可以看到面板上有几个默认参数。这里先不要着急点Start,检查一下有没有“利用选择的文件类型”之类的选项。如果它问你是基因密度作图还是基因覆盖度作图,通常选基因密度(Gene Density)就好,待会出来的图比较顺眼。
3.2 参数调节:窗口大小、颜色渐变和阈值
我第一次用这个模块时,直接用了默认参数,图是出来了,但整个圈上基因密度几乎全是均匀的一片色,看不出任何集中趋势。后来才明白是窗口大小的锅。
Advanced Circos会把每条染色体切成一个个窗口,然后统计每个窗口内的基因数量,用颜色深浅表示数量高低。如果窗口设置得太大,每段包含的基因都差不多,颜色就没有区分度;如果窗口设置得太小,又会有很多窗口的基因数为0,图看起来很碎。这个参数名称在不同版本里可能叫Window Size或者Bin Size,一般默认为100kb或200kb。实际画基因家族密度时,我会根据基因组大小调整:
- 基因组500Mb左右,窗口100kb,出图效果比较平滑;
- 基因组小于200Mb,窗口降到50kb;
- 做单个基因家族成员分布时,窗口甚至可以不开密度统计,直接用点状标记处理。
颜色设置也很重要,默认的绿色渐变其实在打印成黑白论文时会被完全抹平。为了保险起见,我一般会用蓝色到红色的渐变,也就是低密度浅蓝、高密度深红。这种配色在彩打和黑白打印条件下都有不错的辨识度。阈值项(Threshold或Maximum Value)影响的是颜色映射的标尺,如果基因密度集中于某一条染色体,其他染色体颜色都很浅甚至空白,可以试着降低阈值,让色阶的区分度更大。
3.3 运行出图和图片导出
参数设置完成后,直接点击Start按钮。TBtools会弹出一个新的展示窗口,图像会以矢量的形式渲染。如果你在数据文件准备阶段没有明显错误,这一步几秒就能出结果。
看到图之后先别急着导出,花十几秒检查一下三条信息:最外圈染色体编号是否正确、有没有哪条染色体很短却显示成一大段、内圈密度轨道的深浅层次是否合理。
如果没问题,就可以点击Export导出图片。TBtools支持导出PNG、SVG、TIFF等格式。我个人的习惯是:如果只是给导师或组会看,导300dpi的PNG就够了;如果要投论文,一定导出SVG矢量图,之后放到Illustrator或Inkscape里面补充基因名、缩放条,输出600dpi的TIFF,这样就算补几轮审稿意见,图也经得起放大。
3.4 实操中我常用的出图前检查流程
这里补充一个我自己的经验流程,不一定适合所有人,但确实帮我省了不少时间:导入文件后,先不管颜色和阈值,直接用小尺寸窗口快速出一次图,看染色体的外形和编号对不对;确认无误后,再调整颜色参数,重新出图。这就像写代码先跑通再优化一样,可以避免为了调色等可视化参数浪费太久。
另外,不要忽略输出窗口的日志信息。TBtools在运行时会在界面上打印类似“reading input file…”“generating plot…”这样的提示,如果输入文件格式错误,日志里通常会有明确的报错行号,那里会直接告诉你是哪一行格式不对。很多人忽略这个信息,其实它比去论坛提问还靠谱。
4. 画图失败和效果不佳时的排查经验
4.1 完整画出来了,但里面是空的或只有一圈线条
这种情况80%是基因位置文件没被正确读取。先打开你的gene_position.txt,用head看一下,确认里面确实有数据且每列用Tab分隔。如果文件是空的,那检查一下GFF文件自身有没有问题,有的物种注释文件第三列不写gene,而是写mRNA或者CDS,这时把awk的条件改成$3=="mRNA",提取mRNA的坐标作为基因位置信息,也可以兼容。
另一种可能是染色体名称不匹配。TBtools在绘制时会先用染色体长度文件建立坐标系统,然后去位置文件里找匹配项,找到不到就会跳过。所以我会用下面这个命令快速对比两边染色体编号有没有差异:
awk -F '\t' '{print $1}' chr_length.txt | sort -u > chr_len_list.txt awk -F '\t' '{print $1}' gene_position.txt | sort -u > chr_gene_list.txt diff chr_len_list.txt chr_gene_list.txt如果diff输出有内容,就说明两边命名有出入,去Excel里批量改一下名称即可。
4.2 整个圈颜色很均匀,看不出基因密度差异
这不一定是你数据的锅,更可能是参数没调对。我建议先把窗口大小调小一半重跑一次,比如是200kb就改成100kb,再看看颜色分布是否有层次。如果还是没有,就检查一下阈值设置,把这个值调低,让高密度区域更快达到颜色深度的上限。
还有一点值得提的是,如果你的物种基因组本身基因密度就特别高,比如一些微生物基因组整圈基因密度都很高,那Circos图的基因密度轨道意义就不大。这种情况更适合展示基因家族的分布位置而不是所有基因的密度,或者说你把阈值调到一个较高的值,但出图效果依然不理想,就可以考虑用后面讲的JCircos做更灵活的定制。
4.3 出图后染色体长度比例奇怪或个别染色体显示不全
这个问题通常出在染色体长度文件上。有的参考基因组会包含scaffold、contig,如果你把几百条scaffold全部加进去,图会被切得密密麻麻,比例也不对。我一般只保留主染色体上的序列,过滤时可以用染色体名称列表做白名单,或者用awk过滤掉含有scaffold或contig的行。
另外检查一下长度文件排序,如果染色体顺序是随机的,图上的染色体排列也会是无规律的。建议按照染色体编号1、2、3的顺序排列,TBtools会从上到下按你的文件顺序一圈一圈排布。
4.4 常见问题速查表
我把这几年在不同机器、不同版本TBtools里遇到的问题整理成一个表,方便大家快速定位:
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 图出来但内部无数据 | 位置文件格式错误或染色体名不一致 | 检查Tab分隔、head预览、diff比对名称 |
| 只有部分染色体有数据 | 染色体命名部分不匹配 | 统一大小写和前缀,如Chr与chr |
| 颜色一片平 | 窗口过大或阈值过高 | 调小窗口Size、降低Maximum Value |
| 通道画得很碎 | 窗口过小 | 适当调大窗口Size |
| 染色体数量过多 | 包含了scaffold/contig | 过滤非主染色体序列 |
| 导出后文字模糊 | 导出了PNG但分辨率低 | 导出SVG再转600dpi TIFF |
4.5 几个独家避坑技巧
除了上面这些,我再分享三个常规教程里不会写到的经验。
第一个,TBtools的Circos模块对中文路径极其敏感。如果你的项目文件夹路径里带有中文,或者文件名是中文,很容易在出图时报各种奇怪的错。解决办法很简单,建一个纯英文路径的文件夹,把数据文件放进去再跑。
第二个,如果你需要在图上显示基因名称标签,Advanced Circos的标签排列有时会互相重叠、遮住轨道。我的做法是,在位置文件中保存的基因ID尽量短,比如只保留前缀“G00001”而不是一长串带版本号的完整ID。标签越短,重叠概率越低,可读性越高。
第三个,出图用的字体在Windows和Linux系统上有差异,如果你把SVG拿到别的电脑上编辑,字体可能会被替换成系统默认字体,导致位置偏移。稳妥的做法是导出SVG后直接转成PDF嵌入字体,再在AI中编辑。如果你是Mac用户,建议统一用Arial或Helvetica这类跨平台字体。
5. 进阶玩法:让Circos图在基因家族分析里更有说服力
5.1 用JCircos实现自定义轨道和图内标记
Advanced Circos适合快速出图,但它默认以密度轨道为主。如果我想突出显示基因家族中的20个成员在染色体上的具体位置,单靠密度图不够直观,因为周围还有其他基因,密度高不一定代表家族成员集中在那里。
这时候我会改用TBtools里的另一个模块JCircos。它的操作思路和Advanced Circos不同,更像是“让用户手动配置多个数据轨道”。你可以添加一个轨道专门用来放基因家族成员的位置点,每一个基因标一个小色点,颜色与密度图区分开,整张图的信息量就会丰富很多。
JCircos的数据文件格式要求也不复杂,本质上还是染色体、起始、终止三列,如果有需要可以再加第四列作为轨道数值。用法上多点几次鼠标就能摸清,但参数多,所以第一次上手建议边看预览边调整。
5.2 结合MCScanX共线性数据画内部连线
基因家族分析做到后期,大家都会关心家族成员之间的复制关系。这时候单纯一张基因密度Circos图就不够了,最好能把共线性区块也画进去。TBtools提供了一些与MCScanX结果联动的工具,比如可以利用MCScanX输出的collinearity文件,在Circos图中绘制基因间的连线,表示哪些基因是旁系同源或直系同源。
连线图比密度图更容易被审稿人认可,因为它直接展示了进化事件。我的做法是:先用MCScanX跑出共线性基因对,把基因对的染色体和位置提取出来,整理成“每行一对坐标”的格式,再在JCircos里添加一个Link轨道,选择这个文件,就能画出漂亮的内部连线。实际操作时要注意,连线轨道的颜色尽量选半透明的色系,不然连线多了会遮住底层的密度轨道。
5.3 用“密度图+散点标记+连线”三合一的完整套路
在一次完整的基因家族分析展示里,我使用的组合是:底层用Advanced Circos或JCircos出全基因组基因密度底色,中间层叠加家族成员位置散点,最内层再拉出共线性连线。这样一张图同时回答了三个问题:全基因组基因是怎么分布的、目标家族成员集中在哪里、它们之间有哪些同源关系。审稿人看完基本不用再看额外补充材料。
出图顺序上,我不会从头到尾都在TBtools里完成。TBtools负责出基础图,后来的散点高亮、添加图例、加文字注释,我会导出SVG后到Illustrator里面做微调。这样既能利用TBtools的快速出图优势,又能在最终排版上做到精细控制。
画完图之后有个小细节很多人不注意——图例。Circos图如果连图例都没有,读者根本不知道外围颜色深浅代表什么。TBtools导出的图不一定带图例,建议在排版软件里自己加一个渐变图例,标注清楚“低密度到高密度”的对应关系。这个细节缺失导致返修的几率,远远超过你的想象。
5.4 这套技能能用到哪些研究场景
学完这个操作以后,你会发现它的应用场景比预想的多。做全基因组复制分析可以画;比较基因组学中不同物种间的共线性可以画;转录组中差异表达基因在染色体上的分布也可以画。甚至不需要基因家族分析,只要手上有染色体坐标信息,就能用同一套流程快速出图。
我自己后来做的一个项目,需要把某个代谢通路的全部基因在不同物种中的分布展示出来。当时就是用TBtools批量跑了十来个物种的数据,每个物种生成一张Circos图,然后统一处理排版,整个过程不到一天就完成了。如果是用R代码,光想怎么循环出图可能就要写一上午。
写在最后
从实际操作体验来说,TBtools的Circos功能并不追求像官方Circos那样无所不能,它更像是给生物信息学分析链条里补上了“最后一公里”的拼图。你前面费很大力气跑完基因家族筛选、构建系统发育树、算完选择压力,到了展示这一步如果卡住了,那就太亏了。用这套攻略,熟练之后正常人十分钟之内画出一张Circos图是完全不夸张的。
最后再分享一个小经验:每次画图前,把输入文件、参数截图、结果图存到同一个文件夹里,命名加上日期。因为这个东西画起来太顺手,很多研究会反复修改数据重新出图,有一个规范的项目管理习惯,找起旧图来会感谢自己。