做基因组学的同行应该都有过这种经历:手里拿着一堆变异位点、测序深度、peak 区域或者基因注释信息,想看看它们在染色体上的分布规律,结果卡在画图这一步。R 包装了又报错,IGV 加载大文件卡到怀疑人生,发给合作者还要让他也装一套软件。这篇就聊聊怎么用在线工具完成“染色体叠加密度和标记图”,不用一行代码,打开浏览器就能出图,而且支持把自己的数据 track 和参考基因组上的注释信息叠在同一张图上。
这类图在项目里太常用了。测序深度覆盖度检查、ChIP-seq peak 的分布核验、变异位点在染色体上的聚集趋势、QTL 区间和候选基因的位置关系,都是靠这种图来直观呈现的。对于生信工程师、育种方向的研究生、临床检测实验室的同事,甚至只需要看结果的实验台搭档,在线方案都能解决大部分需求,关键是不用维护本地环境,打开网址传文件就能开工。
1. 需求拆解与在线方案选型
1.1 为什么在线画图能保命:本地绘图的四个经典痛点
先说本地画图。用 R 里最常见的 circlize、RIdeogram 或者 ggplot2 画染色体分布,本身不难,难点全在环境上。我最早给学生做培训时发现,光是把 R 版本从 3.x 升到 4.x 就能让一批旧脚本跑不起来,rtracklayer 对 R 版本和 Bioconductor 版本有严格的匹配要求,BIOCONDUCTOR 又对 R 版本有要求,连锁反应直接劝退新手。如果是本地写 Python 脚本用 matplotlib 画,则要自己处理染色体长度表、位置归一化、刻度映射这些底层逻辑,稍不留意坐标轴就是错的。
另一个痛点是数据交换。实验室里有人用 Windows,有人用 macOS,还有人用服务器,每个人环境都不一样。一份写好的绘图脚本,换台机器可能要改路径、改包名、改编码格式。我实测过,同样的 BED 文件在 Windows 下读入,因为行尾符问题,偶尔会出现染色体名带 \r 导致匹配不上,这种问题排查起来特别消耗时间。
第三是性能问题。全基因组 SNV 的 VCF 文件动辄几个 G,本地画密度图的时候内存经常被吃满。就算用 bedtools coverage 先做分箱统计,得到的分箱文件还是可能很大,画出来的图锯齿感严重,要调平滑参数又要重新跑一遍。
第四是协作展示的问题。本地生成的静态 PNG,想叠加不同数据来源的轨道,需要反复重新生成。如果是和合作者远程讨论,对方想要看某个区间的放大细节,你只能再切 IGV 截图发过去,沟通效率很低。在线工具天然具备交互能力,拖拽、缩放、开关 track 都在浏览器里完成,这正好补上本地方案的短板。
1.2 在线工具怎么选:从 UCSC 到 Galaxy 的取舍思路
目前主流在线绘图方案集中在三类。第一类是基因组浏览器,典型代表是 UCSC Genome Browser,以及 Ensembl 的 Region in Detail 视图。这类工具的核心能力是展示参考基因组上的各种注释轨道,同时允许上传自定义数据作为额外轨道,非常适合把“自己的标记数据”和“参考注释”叠加显示。第二类是 Galaxy 平台,它是一个在线生信工作流平台,里面集成了一系列数据整理、分析和可视化工具,适合先做数据处理再出图的完整流程。第三类是快速出图的小型在线应用,比如各种基于 R Shiny 的绘图站点,但稳定性和可定制性通常不如前两者。
我在实际项目中常用的选型规则是:如果是做哺乳动物、植物等有完善参考基因组注释的物种,首选 UCSC Genome Browser。它的参考基因组覆盖全,常见物种的基因注释、重复序列、GC 含量、保守性等轨道都是现成的,上传自己的 BED 或 VCF 后,直接就能叠加查看。如果是做尚未有公开发布基因组的非模式物种,或者需要先对原始数据做比对、peak calling、变异检测等处理再出图,就选 Galaxy,它能把上游分析到下游可视化连成一条流水线。
如果只需要一张简单的静态图用于论文补充材料,也可以用一些专为发表设计的工具,比如之前很多人用的 Rideogram 在线版,生成的是矢量图,风格很适合文章插图。不过这类在线服务有时不稳定,我的建议是重要图件还是保留本地脚本和输入文件,在线工具当快速探索和初步沟通的手段。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心原理与数据准备:搞懂格式才不会被工具卡住
2.1 密度图和标记图在生物信息学里到底画的是什么
“密度图”指的是某种特征在染色体不同位置上的覆盖度或频度高低。最常见的是测序 read 覆盖度(coverage),横轴是染色体坐标,纵轴是覆盖深度;还有 ChIP-seq peak 密度、甲基化水平、变异密度等。这类图的本质是把数量特征沿着基因组坐标展开,形成一条连续的信号曲线,或者分箱后的直方图。因为二倍体基因组的覆盖度天然有波动,画密度图时通常会做平滑处理,才能看出真实的分布趋势。
“标记图”则是在染色体上标注特定的位置点或区间。比如 SNP/INDEL 位点、限制性酶切位点、SSR 标记、基因模型、QTL 区间、外显子区域等。标记图通常用竖线、三角形、矩形等形状标在染色体的特定坐标上,也可以分为多个水平行来区分不同类别的标记。标记图的价值在于直观反映“这些位点分散还是集中”,比如 GWAS 显著性 SNP 是否集中在一个 LD block,或者分子标记在染色体上的覆盖是否均匀。
这两种图叠加在一起,就是先在染色体骨架上方画一条或多条密度信号曲线,再在同样坐标系下把标记位点铺上去。这样既能看出信号强度分布,又能看出具体标记落在信号峰的位置是否吻合。实际项目管理中,我经常用这种方式同时检查“覆盖度均匀性”和“标记物是否覆盖到候选区段”,一眼就能锁定问题区域。
2.2 必须会用的四个文件格式:BED、bedGraph、bigWig、VCF
在线工具接受的文件格式是标准化的,不按格式来就会被直接拒绝。最基础的是 BED 格式,每一行代表一个区间或一个点,至少包含三列:染色体名、起始坐标、终止坐标。坐标是 0-based,左闭右开,这一点很多人第一次接触会算错。比如要标记 1 号染色体第 10,000 个碱基处的 SNP,BED 里写的是 chr1 9999 10000,而不是 10000 10001。我见过太多人在这一步踩坑,导致画出来的标记位置总是偏一个碱基。
bedGraph 格式用于表示连续信号值,比 BED 多了第四列数值,比如甲基化水平、覆盖度分数等。由于是文本格式,大数据量时加载慢,在线工具一般建议转换成 bigWig。bigWig 是二进制的索引格式,浏览器可以快速随机访问任意区间的信号,无需一次性读入全文件。转换可以用 UCSC 的 bedGraphToBigWig 命令行工具,也可以上传 bedGraph 到 Galaxy 里转,前提是必须先有对应基因组版本的染色体大小文件(chrom.sizes)。
VCF 是变异位点格式,存 SNP、INDEL、SV 等。在线浏览器大多直接支持 VCF 上传并自动渲染为标记轨道,但会要求 VCF 头部包含准确的 ##contig=<ID=chr1,length=...> 信息,如果缺少这一行,排序和坐标匹配就会出问题。Galaxy 里做变异检测时默认输出的 VCF 通常比较规范,但有时候从外部工具拿到的 VCF 可能缺少 contig 声明,需要手动补上。
除了这四个,还有一个容易被忽视的是 GFF/GTF 注释文件。虽然在线工具自带参考注释,但如果你做的物种是最近新组装的,注释信息不在数据库里,就需要自己上传 GFF 文件来显示基因结构。GFF 的列含义和 BED 不同,第 3 列是特征类型(CDS、exon、gene 等),第 9 列是属性字段,在线工具解析时对这些有严格要求,上传前可以用 gffread 验证一下格式完整性。
2.3 坐标版本和染色体命名:出图不对最常见的根源
出图对不上位置,九成原因是基因组版本不一致。同一个物种的参考基因组有多种版本,比如人类有 hg19 和 hg38,小鼠有 mm10 和 mm39,差异不小。在线工具几乎都是固定关联到特定版本,上传数据前必须确认自己的数据是用哪个参考基因组比对或坐标注释的。混淆版本会导致标记全部出现在错误位置,甚至染色体长度都对不上。
染色体命名是另一个容易栽的跟头。UCSC 风格的命名是 chr1、chrX,Ensembl 风格是 1、X,如果文件里用的是 1 而浏览器轨道注释用的是 chr1,就会出现“明明上传了数据但一条标记都不显示”的情况。规范做法是统一转换为在线工具使用的命名风格:如果浏览器显示 chr1,就把 BED/VCF 里的染色体名统一加上 chr 前缀;反之则去掉。
在实际操作中,我建议所有数据进入在线工具之前,先用一条简单的 bash 命令检查坐标和命名:
bash复制# 检查 BED/VCF 的染色体名风格
cut -f 1 input.bed | sort | uniq -c | head
grep -v "^#" input.vcf | cut -f 1 | sort | uniq -c | head
# 检查染色体长度是否和参考基因组对应
# 比如人类 hg38 的 chr1 长度是 248956422
awk '$1=="chr1" {print $2}' hg38.chrom.sizes
这两步检查虽然简单,但能挡掉大部分“图出来了但全是对不上”的尴尬。
3. 实操过程与核心环节实现
3.1 方案一:UCSC Genome Browser 上传自定义轨道
UCSC 的在线绘图是最容易上手的,不需要注册即可使用,但上传数据后生成的会话链接有效期较短,正式项目建议注册免费账号保存 session。打开 UCSC Genome Browser 主站,选择对应的基因组版本,比如 Human GRCh38/hg38,点击 “Genome Browser” 进入浏览视图,然后点击菜单栏里的 “My Data” -> “Custom Tracks”。
上传的文本内容可以是 BED、VCF、bedGraph 或者 GFF 格式,直接粘贴文本或上传文件均可。之前几次我帮合作者远程处理数据的时候,最喜欢用直接粘贴的方式,小文件几秒钟就能出轨道。以下是一段 BED 格式的示例,标记三个候选区间:
code复制track type=bed name="Candidate_Regions" description="GWAS significant intervals" visibility=2 color=255,0,0
chr1 10000 20000
chr1 150000 160000
chr2 50000 60000
第一行是 track 配置行,name 是轨道名,visibility=2 表示全图挤压显示窗口,color 用 RGB 值定义轨道颜色。如果不写 track 配置行,UCSC 也会自动用默认颜色显示,但区分度差很多。贴进去后点 “Submit”,浏览器会自动跳转到第一条区间所在位置,右侧会出现新的自定义轨道。
要叠加密度数据,就用 bedGraph 或 bigWig。bedGraph 示例如下:
code复制track type=bedGraph name="Coverage" description="read depth" visibility=full color=0,0,255 altColor=128,128,128
chr1 0 10000 12.5
chr1 10000 20000 35.8
chr1 20000 30000 22.1
visibility=full 让轨道展示为完整的连续曲线,便于观察信号高低起伏。如果数据点非常多,在线直接上传文本 bedGraph 会导致加载慢,建议先用 UCSC 提供的 bedGraphToBigWig 工具转换成本地 bigWig 文件,再上传到网页、网页服务器或 ftp 服务器获取 URL,在 Custom Tracks 里输入 URL 加载。这一步很多人都忽略了,其实大文件在线绘图卡顿,十有八九是没转 bigWig。
轨道叠加好后,点击顶部 “Configure” 可以调整页面显示范围,比如显示整条染色体的话,可以在位置输入框直接输入 chr1:1-248956422,或者点击染色体 ideogram 图上的条带跳转。UCSC 的 ideogram 支持点击条带放大缩小,比手动输入坐标直观得多。最终图的导出在 “View” -> “PDF/PS” 下拉菜单里完成,一般选 PDF 格式,矢量图插入论文不会糊。
3.2 方案二:Galaxy 工作流绘制密度信号图
如果手上没有现成的 BED 或 bigWig,只有原始测序 fastq 文件,那就绕不开比对和定量这个环节。Galaxy 的优势在于全流程在线完成,不需要本地跑 bwa 或 bowtie2。注册 usegalaxy 账号后,先在左侧工具栏上传数据,把 fastq 文件拖进去,再选择参考基因组索引建立比对任务,输出 BAM 文件,然后通过 “深覆盖度” (Depth) 工具生成 bedGraph,再转 bigWig 用于可视化。
以 RNA-seq 或 DNA-seq 覆盖度为例,在 Galaxy 搜索并运行 bedtools genomecov,参数一般设置成 -ibam 输入 BAM,-bg 输出 bedGraph,同时建议使用 -scale 参数将覆盖度归一化到每百万测序 read 数(RPMM),否则不同样本间的深度图没有可比性。归一化的逻辑是测序深度本身受文库大小影响,直接比绝对数值容易误导,转成相对值才能放在同一尺度下看差异。
运行完成后得到一个 bedGraph 数据集,再运行 wigToBigWig 工具,需要同时准备染色体大小文件。Galaxy 里部分参考基因组会自带 .chrom.sizes 数据集,但如果是非模式物种,需要自己上传。生成 bigWig 后,就可以使用 Galaxy 右侧的“可视化”按钮,选择 “IGV” 或 “JBrowse” 进行在线查看,也可以在“大数据”中导入 UCSC 进行叠加。
Galaxy 的轨道叠加逻辑不如 UCSC 直观,但它更贴近真实分析流程:数据从原始测序到最终图像都在同一个平台,中间每一步都能追溯和重跑。我在处理育种项目时经常采用这个链路,因为不同样本的 BAM 很多,统一在 Galaxy 里做归一化和转换,比各自电脑上转完再传 UCSC 更规范。
3.3 染色体水平全景图:把密度和标记铺满整条染色体
如果你的目标是看“信号在整个染色体上的分布趋势”,用 UCSC 默认浏览器窗口一个个区段翻是不现实的。这时候需要生成一张染色体全长视图。UCSC 的 “Summary/Statistics” 功能可以画全基因组信号分布,但更常用的是在位置框输入完整染色体范围,然后将页面宽度尽量拉大,配合 “Hide all” 关掉不必要的大注释轨道,只保留自己的密度轨和标记轨,最后导出 PDF。
如果需要更精细的染色体全景图,比如带染色体的 acrocentric 形态、多个样本密度比较、标记用不同颜色标在多种水平线,我建议用 R 语言 RIdeogram 或 circlize 本地画。虽然本篇主题是在线工具,但现实场景里“在线快速看 + 本地精细出图”是黄金搭档。RIdeogram 的输入是两个表格:karyotype 表(染色体 ID、长度、颜色)和 label 表(标记名、染色体、坐标、颜色),学习成本很低,网上有大量现成教程。
不过话说回来,如果只是技术验证或进展汇报,UCSC 的截图完全够用。我帮不少合作者出的结果图,其实就是 UCSC 导出 PDF 后在 AI 里加了几行注释,编辑体验也很友好。真正需要发表的图件,考虑到期刊对矢量图和字体统一的要求,再转移到本地工具也不迟。
4. 常见问题与排查技巧实录
4.1 上传文件后轨道不显示,怎么办
这个问题排在所有在线绘图问题中的第一位。排查步骤按照从简到繁的顺序来。先检查染色体命名是否一致,打开上传文件的第一列,看看是否有 chr 前缀,和在线工具选用基因组的 Track 命名规则对照。其次是检查坐标版本,确认文件和在线基因组用的是同一个版本,这里最可靠的办法是随便抽一个标记,在本地比对文件里查看比对位置,再和在线浏览器的同区域基因注释对照。
第三是检查文件格式细节。BED 的第 2 第 3 列必须是整数,不能是浮点数,不能有逗号分隔符,不能用科学计数法表示;VCF 文件必须保证是单行制表符分隔,不能是空格。我曾经遇到过一个从 Excel 另存为的 BED,染色体列变成了 chr1 10000 20000,肉眼看着正常,但第 2 列实际带了不可见字符,上传后全部标记丢失,清洗后恢复正常。
第四是看浏览器底部的错误提示。UCSC 上传后会在页面顶部或底部给出解析警告,比如 line 3: expected 3 fields, got 4,这个提示直接指出问题行,按行号排查最快。Galaxy 的错误信息也会写在数据集详情里的“错误”部分,注意查看 stderr 输出,很多格式问题会在这里暴露。
注意:UCSC 不接受没有 track 行定义的纯 BED 粘贴内容。虽然它有默认设置,但正式使用时一定要写 track 配置行,否则后续想调整颜色和显示模式只能重新上传。
4.2 密度曲线显示为柱状条而不是平滑曲线
上传 bedGraph 后,UCSC 默认可能把轨道显示为条形图,每一格一个颜色,看着像热图,而不是想要的连续曲线。这个问题的根源是 track 配置里 visibility 和 type 设置不对。bedGraph 轨道要显示为波形图,应该用 type=bedGraph 加 visibility=full,如果还不行,检查是否上传的是 bigWig 格式,bigWig 轨道同样支持 visibility=full。
如果是 Galaxy 上 JBrowse 显示,JBrowse 对 coverage track 有自己的类型判断,通常输入 bigWig 会自动识别为密度轨道,显示为波形。如果显示不正确,可以在 JBrowse 的 track 设置里手动选择“密度”类型。这里还涉及一个平滑问题,在线工具默认不显示平滑曲线,如果数据点稀少,折线会很难看,解决办法是回到上游分箱统计,把窗口扩大。
我在实际使用中喜欢把窗口设为 100 kb 或 200 kb,再统计每个窗口的覆盖度均值或变异个数。这样数据量小,曲线平滑,在线加载零压力。分箱可以用 bedtools makewindows 生成窗口,再配合 bedtools intersect -c 统计窗口内标记数,整个过程在 Galaxy 或本地命令行都不到一分钟。
4.3 VCF 标记在浏览器里位置偏移或缺失
VCF 坐标是 1-based,而 BED 是 0-based,UCSC 对 VCF 有内部转换逻辑,一般不需要手动改。但如果你的 VCF 是从某个工具生成后手动修改过,很容易引入问题。最典型的是 REF 和 ALT 等位基因和参考基因组不一致,浏览器会把这种位点视为“变异调用失败”,不显示标记。解决办法是用 bcftools norm 统一归一化 VCF,清除不规范的记录。
另一个常见问题是 VCF 没有排序或缺少索引。UCSC 在线模式下对 VCF 的解析要求按坐标排序,否则后面的位点可能全部被忽略。Galaxy 同样要求排序后再做下游处理。排序命令是:
bash复制# 按染色体和位置排序 VCF
bcftools sort input.vcf -Oz -o sorted.vcf.gz
bcftools index sorted.vcf.gz
对 GRCh38 之类的版本,还要格外注意 line 上的 chr 前缀。有些 T2T 版本虽然也用 chr 前缀,但线粒体是 chrM 而有些工具输出 MT,这一步也要统一。
4.4 输出图的清晰度与配色调整经验
在线工具默认颜色不一定适合发表。UCSC 的 track 配置行中,color 参数可以自定义每个轨道的颜色,比如密度信号用 color=0,80,255 看着比较专业,标记点用亮红 255,50,50 更容易聚焦。如果是多个标记类别,建议通过 track 行的 itemRgb 参数启用 BED 第 9 列的 RGB 颜色,这样同一轨道内部可以区分不同类型,比拆成多个轨道清爽得多。
导出图片时,注意 UCSC 的 PDF 导出会包含整页轨道布局,如果只想导出某个区域,先用鼠标拖选区域再导出。PDF 是矢量格式,字号、线条可以后期继续编辑,建议专门保留一个“只含自己轨道 + 必要参考注释”的 UCSC 视图配置,作为标准出图模板。这样项目里无论哪个物种、哪个区间,出图风格都统一,写报告时省去大量调整时间。
5. 在线绘图的边界与我的使用心得
在线绘制染色体叠加密度和标记图,最大的价值不是替代专业绘图工具,而是把“快速查看数据全貌”的门槛降到了最低。我日常的生物信息工作流里,拿到一个 BAM 或 VCF 后,第一时间往往是先传到 UCSC 或 Galaxy 里去看整体分布,确认建库质量、比对正确性、显著信号的染色体偏好,再决定下一步分析方案。这个过程如果放在本地,往往要先装库、写脚本、调参数,光准备工作就能花掉半天。
当然在线工具也有它的边界。数据量极大的项目,比如数百个样本的 WGS 覆盖度,全部在线展示不现实,还是要靠本地脚本批量出图;高度定制化的图形,比如带系统进化树的圈图、与 LD 热图联动的图版,也需要 R/Python 来画。但如果目标就是“叠加密度+标记”,在线方案是我给所有入门者和合作者的第一推荐。
最后分享一个小技巧:养成本地文件命名规范的习惯。我通常把 BED 文件命名为 物种_版本_数据类型_日期.bed,比如 human_hg38_snp_20250115.bed,这样上传在线工具时不会搞混版本,也能让合作者一眼看出数据来源。在线工具生成的配置截图也建议随数据一起归档,写文章的时候能直接找到对应的可视化参数,不用重新摸索一遍。
