跳转至

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中的SVSVTYPE字段标注类型,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类型,是最灵活但最复杂的表示方式。

易错点

  1. 忽略SV的基因型:SV也有杂合/纯合之分,影响临床解读
  2. Circos图坐标不匹配:确保Circos的karyotype文件与参考基因组版本一致
  3. Samplot未排序BAM:Samplot需要排序和索引的BAM文件
  4. SV大小分布用线性轴:SV大小跨越多个数量级,应使用对数轴
  5. 混淆CNV和SV:CNV是SV的子集(主要是DEL和DUP),不是独立概念

补充知识

SV可视化工具对比

工具类型适用场景交互性
IGV基因组浏览器单位点检查高(图形界面)
Samplot命令行批量单位点检查低(静态图)
Circos全基因组全局SV概览低(静态图)
RibbonWeb工具交互式探索高(浏览器)
SVPV命令行肿瘤SV可视化

常见SV图解

缺失(DEL):  ---ABCDEFGH---  →  ---AH---
插入(INS):  ---ABCDEFGH---  →  ---ABCxyzDEFGH---
倒位(INV):  ---ABCDEFGH---  →  ---ABFEDCGH---
重复(DUP):  ---ABCDEFGH---  →  ---ABCDEFDEFGH---
易位(TRA):  chr1: ---ABC---  chr2: ---XYZ---  →  chr1: ---ABZ---  chr2: ---XYC---