182_基因组结构变异可视化¶
一句话概述¶
基因组结构变异(SV)包括缺失、插入、倒位、易位和重复等大规模基因组改变,其可视化通过Circos图、IGV手动检查、SvABA/SURVIVOR输出解析和专用工具(如Ribbon、Samplot)将复杂的结构变异直观呈现。
核心知识点表格¶
| 知识点 | 说明 |
|---|---|
| SV类型 | DEL(缺失)、INS(插入)、INV(倒位)、DUP(重复)、TRA(易位)、BND(断裂点) |
| SV大小 | 通常≥50bp,与SNV/InDel区分 |
| 检测工具 | Manta、DELLY、LUMPY、Sniffles(长读长)、SVIM |
| 可视化工具 | IGV、Circos、Samplot、Ribbon、NanoPlot |
| VCF中的SV | SVTYPE字段标注类型,SVLEN标注长度 |
| Circos图 | 环形基因组图,适合展示染色体间易位 |
| Samplot | 基于BAM的SV区域快速可视化 |
| Ribbon | 交互式SV可视化Web工具 |
步骤详解¶
第一步:理解结构变异类型¶
白话解释:结构变异是基因组中大块DNA的改变。想象基因组是一本书,SV就是撕掉几页(缺失)、插入几页(插入)、把一段倒着粘(倒位)、或把一本书的一页移到另一本书里(易位)。
技术细节:SV在VCF文件中通过INFO字段的SVTYPE和SVLEN标记。断裂点(BND)用特殊的ALT字段表示法描述连接关系。复杂SV可能包含多个简单SV的组合。
# SV VCF格式示例
# CHROM POS ID REF ALT QUAL FILTER INFO
# chr1 1000 sv1 N <DEL> 60 PASS SVTYPE=DEL;SVLEN=-5000;END=6000
# chr1 8000 sv2 N <DUP> 45 PASS SVTYPE=DUP;SVLEN=3000;END=11000
# chr3 5000 sv3 N <INV> 50 PASS SVTYPE=INV;SVLEN=10000;END=15000
# chr5 2000 sv4 N ]chr8:9000]N 40 PASS SVTYPE=BND;MATEID=sv4b
# 查看SV VCF的基本统计
bcftools query -f '%CHROM\t%POS\t%INFO/SVTYPE\t%INFO/SVLEN\n' sv_calls.vcf.gz | head -20
# 统计各类型SV数量
bcftools query -f '%INFO/SVTYPE\n' sv_calls.vcf.gz | sort | uniq -c | sort -rn
第二步:使用Samplot进行SV可视化¶
白话解释:Samplot从BAM文件中提取SV区域的reads排列情况,生成一张图,让你一眼看出SV是否真实存在。不同读长类型(PE、split reads、discordant pairs)用不同颜色标记。
技术细节:Samplot对每个SV位点提取该区域的比对信息,展示正常reads(灰色)、split reads(蓝色)、discordant pairs(红色)以及覆盖深度曲线。支持同时展示肿瘤和配对正常样本。
# 安装Samplot
pip install samplot
# 单个SV可视化
samplot plot \
-n tumor normal \
-b tumor.bam normal.bam \
-o del_chr1_1000.png \
-c chr1 \
-s 1000 \
-e 6000 \
-t DEL \
-d 500
# 批量可视化VCF中所有SV
samplot vcf \
--vcf sv_calls.vcf.gz \
-d output_dir/ \
-b tumor.bam normal.bam \
--sample_ids tumor normal \
--max_entries 500
# 使用samplot+机器学习自动过滤
# SvABA或DeepSV可以学习区分真假SV
第三步:使用IGV手动检查SV¶
白话解释:IGV是最直观的基因组浏览器,可以直接看到reads的比对情况。对于关键的SV,手动在IGV中检查是金标准验证方法。
技术细节:在IGV中检查SV时,需要关注:(1)覆盖度变化(缺失区域深度降低一半);(2)split reads(跨SV断裂点的reads被分成两段比对);(3)discordant read pairs(两端比对距离异常或方向异常)。
# 启动IGV(命令行方式)
igv.sh -g hg38
# 创建IGV batch脚本批量截图
cat << 'EOF' > igv_batch.txt
new
genome hg38
load tumor.bam
load normal.bam
snapshotDirectory sv_screenshots/
goto chr1:900-6100
sort position
collapse
snapshot del_chr1_1000.png
goto chr3:4900-15100
snapshot inv_chr3_5000.png
exit
EOF
# 运行batch脚本
igv.sh -b igv_batch.txt
# Python生成IGV batch脚本
python3 << 'PYEOF'
import pandas as pd
sv = pd.read_csv("sv_sites.tsv", sep="\t")
with open("igv_batch.txt", "w") as f:
f.write("new\ngenome hg38\nload tumor.bam\nload normal.bam\n")
f.write("snapshotDirectory sv_screenshots/\n")
for _, row in sv.iterrows():
start = max(0, row['start'] - 500)
end = row['end'] + 500
f.write(f"goto {row['chrom']}:{start}-{end}\n")
f.write("sort position\ncollapse\n")
f.write(f"snapshot {row['chrom']}_{row['start']}_{row['svtype']}.png\n")
f.write("exit\n")
PYEOF
第四步:使用Circos绘制全基因组SV图¶
白话解释:Circos图是一种圆形图,把所有染色体排成一个圈,SV用线条连接相关的基因组位置。特别适合展示染色体间的易位和全基因组范围的SV分布。
# 使用pyCircos绘制SV圆形图
# pip install pyCircos
from pycircos import Gcircle
import matplotlib.pyplot as plt
# 创建Circos图
circle = Gcircle()
# 添加染色体
import pandas as pd
chrom_sizes = {
'chr1': 248956422, 'chr2': 242193529, 'chr3': 198295559,
'chr4': 190214555, 'chr5': 181538259, 'chr6': 170805979,
# ... 添加所有染色体
}
for chrom, size in chrom_sizes.items():
circle.add_locus(chrom, size, color='lightblue')
# 添加SV连接线
sv_data = pd.read_csv("sv_translocations.tsv", sep="\t")
for _, sv in sv_data.iterrows():
circle.chord_plot(
sv['chrom1'], sv['start1'], sv['end1'],
sv['chrom2'], sv['start2'], sv['end2'],
color='red', alpha=0.3
)
circle.save("circos_sv.png", dpi=300)
# 使用Circos(原版Perl工具)
# 配置文件示例
cat << 'EOF' > circos.conf
# circos.conf
karyotype = data/karyotype/karyotype.human.hg38.txt
<ideogram>
<spacing>
default = 0.005r
</spacing>
radius = 0.9r
thickness = 20p
fill = yes
</ideogram>
<links>
<link>
file = sv_links.txt
radius = 0.45r
bezier_radius = 0.2r
color = red_a3
thickness = 2
</link>
</links>
<image>
dir = .
file = circos_output.png
png = yes
svg = yes
radius = 1500p
</image>
<<include etc/colors_fonts_patterns.conf>>
<<include etc/housekeeping.conf>>
EOF
# 准备SV连接数据
# 格式:chr1 start1 end1 chr2 start2 end2
python3 << 'PYEOF'
import pysam
vcf = pysam.VariantFile("sv_calls.vcf.gz")
with open("sv_links.txt", "w") as f:
for rec in vcf:
if rec.info.get("SVTYPE") == "BND":
# 解析BND的mate位置
alt = str(rec.alts[0])
# 简化处理
f.write(f"hs{rec.chrom.replace('chr','')} {rec.pos} {rec.pos+1} ")
f.write(f"hs{mate_chrom} {mate_pos} {mate_pos+1}\n")
PYEOF
circos -conf circos.conf
第五步:R语言可视化SV¶
library(StructuralVariantAnnotation)
library(ggbio)
library(GenomicRanges)
# 读取SV VCF
vcf <- readVcf("sv_calls.vcf.gz", "hg38")
sv_gr <- breakpointRanges(vcf)
# 使用ggbio绘制
library(BSgenome.Hsapiens.UCSC.hg38)
p <- autoplot(sv_gr, layout = "karyogram") +
theme_minimal() +
ggtitle("Structural Variants Overview")
print(p)
# 按类型分别统计
library(ggplot2)
sv_df <- data.frame(
chrom = as.character(seqnames(sv_gr)),
start = start(sv_gr),
end = end(sv_gr),
svtype = sv_gr$svtype
)
# SV类型分布
ggplot(sv_df, aes(x = svtype, fill = svtype)) +
geom_bar() +
theme_minimal() +
labs(x = "SV Type", y = "Count", title = "SV Type Distribution")
# SV大小分布
sv_df$size <- abs(sv_df$end - sv_df$start)
ggplot(sv_df[sv_df$size > 0 & sv_df$size < 1e6, ],
aes(x = size, fill = svtype)) +
geom_histogram(bins = 50, alpha = 0.7) +
scale_x_log10() +
theme_minimal() +
labs(x = "SV Size (bp, log scale)", y = "Count")
实战命令速查¶
# Samplot快速可视化
samplot plot -n sample -b sample.bam -o sv.png -c chr1 -s 1000 -e 5000 -t DEL
# 批量从VCF生成
samplot vcf --vcf sv.vcf.gz -d plots/ -b sample.bam
# SV统计
bcftools query -f '%INFO/SVTYPE\n' sv.vcf.gz | sort | uniq -c
# SURVIVOR合并多工具SV结果
SURVIVOR merge sv_files.txt 1000 2 1 1 0 50 merged_sv.vcf
# SV注释
AnnotSV -SVinputFile sv.vcf -outputFile annotated_sv.tsv -genomeBuild GRCh38
面试常问点¶
Q1: 结构变异的主要检测方法有哪些? A: 四大类方法:(1)Read depth(覆盖深度变化检测CNV/DEL/DUP);(2)Read pair(异常配对距离/方向检测DEL/INV/DUP/TRA);(3)Split read(断裂reads精确定位断裂点);(4)Assembly(局部或全基因组组装后比较)。大多数SV caller整合多种方法。
Q2: 短读长和长读长在SV检测上的差异? A: 短读长(Illumina)依赖间接信号(配对距离、split reads),对<50bp和重复区域的SV检测能力有限。长读长(PacBio/Nanopore)可以直接跨越SV,检测率更高,特别是对复杂SV和重复区域内的SV。
Q3: Circos图在SV可视化中的优势是什么? A: Circos图将所有染色体排成环形,可以用弧线直观展示染色体间的易位和复杂重排。适合全基因组范围的SV概览,特别是在肿瘤基因组学中展示chromothripsis等复杂重排。
Q4: 如何验证一个SV calling的结果是真实的? A: (1)IGV/Samplot手动检查reads证据;(2)PCR跨断裂点验证;(3)多个SV caller的一致性(如SURVIVOR取交集);(4)长读长数据独立验证;(5)群体数据中的频率(常见SV更可信)。
Q5: SV VCF中的BND记录怎么理解? A: BND(breakend)用特殊的ALT字段表示断裂点连接。如]chr8:9000]N表示当前位置的右侧连接到chr8:9000的左侧。BND可以表示任何SV类型,是最灵活但最复杂的表示方式。
易错点¶
- 忽略SV的基因型:SV也有杂合/纯合之分,影响临床解读
- Circos图坐标不匹配:确保Circos的karyotype文件与参考基因组版本一致
- Samplot未排序BAM:Samplot需要排序和索引的BAM文件
- SV大小分布用线性轴:SV大小跨越多个数量级,应使用对数轴
- 混淆CNV和SV:CNV是SV的子集(主要是DEL和DUP),不是独立概念
补充知识¶
SV可视化工具对比¶
| 工具 | 类型 | 适用场景 | 交互性 |
|---|---|---|---|
| IGV | 基因组浏览器 | 单位点检查 | 高(图形界面) |
| Samplot | 命令行 | 批量单位点检查 | 低(静态图) |
| Circos | 全基因组 | 全局SV概览 | 低(静态图) |
| Ribbon | Web工具 | 交互式探索 | 高(浏览器) |
| SVPV | 命令行 | 肿瘤SV可视化 | 低 |