做基因组相关分析的朋友应该都有过这种经历:手里一份全基因组 SNP 的 VCF 文件、一份自己关心的候选基因或分子标记列表,想快速出一张既能看变异密度分布、又能把标记位置叠加上去的染色体图。这个需求听起来不难,网上相关的 R 包和工具也一大堆,但真到了动手环节,缓存、环境依赖、坐标对齐、图例排版,哪一步都可能卡上小半天。这篇文章我就把平时我自己最常用的一套在线绘制流程完整拆开讲一遍,从数据准备到脚本实现再到常见坑位,争取你看完就能直接照着跑出一张能投稿的图。
我现在的首选方案是:用 Google Colab 这类在线环境跑一个基于 Python matplotlib 的脚本,输入三份文本文件——染色体长度表、变异位置表、标记位置表——输出一张多染色体并列的“密度柱状图 + 标记竖线”叠加图。整套流程不需要在本地安装任何生物信息学软件,只要能打开浏览器就能复现。下面直接进入正题。
1. 先想清楚再动手:这类图到底在画什么
1.1 密度图层和标记图层叠加后能读出什么信息
很多人第一次接触这类图,觉得它不就是“把 SNP 数画成柱子”吗?实际用途比想象中大得多。密度图最基础的功能是全基因组变异的可视化质控:如果一个样本或一组样本的变异密度在某条染色体上出现明显异常的尖峰,往往是测序覆盖度不均、比对错误或者参考基因组中混入冗余序列造成的,这在正式分析之前就能帮你筛掉一批数据问题。
叠加标记层之后,图的解读价值会再上一个台阶。假设你手里有 20 个与抗病性相关的候选基因,你想知道它们是不是集中在某个重组热点区域,或者是不是恰好落在 SNP 密度很低的选择清除区间。把标记的位置用竖线标到密度图上,一眼就能看出规律,这种直观性是表格怎么列都比不了的。
我一般还会在这种图上同时标上染色体骨架和 Mb 刻度,方便读者对齐物理位置。做群体遗传学的同事通常还会再加一层窗内平均 Fst 或 π 的信号,不过那是进阶玩法,我们先把密度和标记这两个常规图层做扎实。
1.2 为什么我选在线绘制而不是本地软件
本地画这类图的常见选项有 R 的 karyoploteR、ggbio,或者直接用 karyoploteR 画染色体分布,也有专门做全基因组可视化的 Circos。这些工具确实都能出图,但问题在于环境配置。很多做生物学的朋友,课题做到一半要临时画图,本地环境可能 Python 版本不对、R 包依赖冲突、Java 版本不兼容,折腾安装的时间比画图本身还长。
在线方案的核心优势就是零配置。只要打开浏览器进入 Colab,所有的 Python 环境、生物信息学常用库基本都是预装好的,缺什么直接 pip install,不需要动本地系统。而且代码和参数全部写在同一个文件里,发给合作者的时候别人打开就能复现,数据更新后重跑一遍就行,不存在“我这能跑你那就报错”的尴尬。
当然在线方案也有自己的局限。Colab 免费版对上传到临时目录的文件大小和会话时长有限制,如果处理超大 VCF 文件,可能得先做一次轻量提取,把几 GB 的 VCF 压缩成几十 MB 的两列位置文件再传上去。另外涉及隐私或敏感数据时,也要注意不要盲目上传到任何在线平台,这是底线。
1.3 密度的本质:从一堆点事件到一条可读的信号
从算法角度讲,变异位点本身是一组在染色体上的离散坐标点,这些点本身没法直接画成柱状图,必须先完成一步“分箱聚合”。最常见的方法就是滑动窗口计数:把一条染色体切成长度相等的窗口,比如每 1 Mb 一段,然后统计每个窗口里面落进了多少个 SNP,这个计数值就是该窗口的密度。
窗口大小怎么选很关键。窗口太大,细节会被平均掉,小范围的峰值看不出来;窗口太小,噪音又太强,相邻窗口的数值忽高忽低。我自己的经验公式是:先看变异总数和基因组大小,估算平均每 Mb 的变异数,然后让每个窗口至少能落到 50~200 个 SNP,这样既平滑又不丢结构。
更进阶的做法是重叠滑动窗口,也就是窗口之间有不少重叠区域,这种方式画出来的曲线更平滑,但计算量会翻好几倍,对于常规示意图来说,非重叠窗口完全够用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据准备:三份输入文件都要什么格式
2.1 染色体长度表(chrs.txt)
画图第一件事是告诉程序“这个物种有几条染色体、每条多长”。我把这个文件叫做 chrs.txt,Tab 分隔,三列:染色体名、起始坐标、终止坐标。起始坐标我习惯写 0,终止坐标就是染色体长度,这个约定和后续画图时横轴从 0 开始的逻辑一致。
获取方式也简单,如果你有参考基因组的 fasta 文件,用 `sam
