karyoploteR: 画一个测序深度分布图

  测序深度的分布图是很常见的一类图,可用于发现染色体片段或整条染色体的缺失或是重复。如果是缺失,测序时捕获的概率就小,最终比对呈现出来的就是有一段区域深度明显偏低;如果是重复,捕获概率就大,测的reads就多,比对得到的深度自然就高。临床上做CNV检测原理也和这差不多。
  上一次介绍这个R包的时候,在文末提了一个小问题,非人物种可以用这个R包吗?(见karyoploteR: 将基因组信息在染色体上“画”出来
  答案是可以!比如今天我想画一个植物的测序深度分布图,最终的效果图如下。

下面简单写一下过程

1. 求出每一个碱基上的深度

这一步用到的是samtools的一个模块depth。

samtools depth -b ref.fa.bed xxx.smr.bam > bedbase_depth.txt

这里的bed是含有每一条染色体位置信息的bed文件,左闭右开,从0开始,得到的结果是每一个碱基上的深度,如下。

head -n 4 bedbase_depth.txt
NC_027757.2 32  1
NC_027757.2 33  1
NC_027757.2 34  2
NC_027757.2 35  2

注意:该文件的第二列是0开始还是1开始
怎么看?samtools tview xxx.smr.bam查看一下第一个碱基是在哪个位置即可。结果是第一个碱基就在32位处,故是以1开始的。建议转换为bed坐标,即减1。

以0开始还是以1开始这个地方容易搞错

2. 划定窗口,计算总碱基数和平均深度

接下来的思路是,先分染色体,再对第二列除以50kb结果取整,当作窗口的NO.编号(这时应该想一想每条染色体能分为多少个窗口,窗口起止位置和窗口编号的对应关系,下面的脚本得到的final.all_chr_to_50kb.bed是bed坐标的)。在bedbase_depth.txt文件中,当窗口号相同时,第三列相加,当作该窗口的总碱基数。
划定窗口

$ cat picture.all_chr_to_50kb.pl 
#! /ifs1/Software/miniconda3/bin/perl
use warnings;
use strict;

my $parm_name = $ARGV[0];
open my $file_fh, "<", "$parm_name";
open my $file_fh2, ">", "all_chr_to_50kb.bed";

while (<$file_fh>) {
    chomp $_;
    my @one_line = (split("\t", $_));
    my $num = int($one_line[2]/50000);
    for(my $i=1; $i <= $num; $i++) {
        my $left = 50000*($i-1);
        my $right = 50000*($i);
        print $file_fh2 "$one_line[0]\t$left\t$right\n";
    }
    my $left2 = $num*50000;
    my $right2 = $one_line[2];
    print $file_fh2 "$one_line[0]\t$left2\t$right2\n";
}
close $file_fh;
close $file_fh2;

$ perl picture.all_chr_to_50kb.pl ref.fa.bed
$ head -n 2 all_chr_to_50kb.bed 
NC_027757.2 0   50000
NC_027757.2 50000   100000

$ less all_chr_to_50kb.bed | awk '{print $1"\t"$2"\t"$3"\t"$2/50000+1}' > final.all_chr_to_50kb.bed

$ head -n 2 final.all_chr_to_50kb.bed #第四列表示第几个窗口
NC_027757.2 0   50000   1
NC_027757.2 50000   100000  2

计算总碱基数

$ awk '{print $1"_"int(($2-1)/50000)"\t"$3}' bedbase_depth.txt > tmp1 #上面也提到了,建议将位置转成bed坐标,所以减一。
$ head tmp1
NC_027757.2_0   1
NC_027757.2_0   1
NC_027757.2_0   2
NC_027757.2_0   2

接下来用perl脚本结合哈希表可求出窗口和窗口上总的碱基数(除以50000就是平均测序深度了)。

$ cat 1.pl 
#! /ifs1/Software/miniconda3/bin/perl
use warnings;
use strict;

my %chuangkou_jianji=();
open my $file_fh, "<", "tmp1";
while (<$file_fh>) {
    chomp $_;
    my @one_line = (split("\t",$_));
    if (exists $chuangkou_jianji{$one_line[0]}) {
        $chuangkou_jianji{$one_line[0]} = $chuangkou_jianji{$one_line[0]} + $one_line[1];
    } else {
        $chuangkou_jianji{$one_line[0]} = $one_line[1];
    }
}
close $file_fh;

open my $file_fh2, ">", "tmp2";
foreach my $i ( sort keys %chuangkou_jianji) {
    print $file_fh2 "$i\t$chuangkou_jianji{$i}\n";
}
close $file_fh2;

结果如下,每一行表示某条染色体的某个窗口有多少个碱基。

$ head -n 2 tmp2
NC_027757.2_0   592839
NC_027757.2_1   510848

计算平均深度
稍微调整一下,就能得到某条染色体第几个窗口的平均测序深度了。

$ awk -F "_| " '{print $1"_"$2"\t"$3"\t"$4}' tmp2 | awk '{print $1"\t"$2+1"\t"$3/50000}' | sort -k1,1 -k2,2n > tmp3
$ head -n 5 tmp3 
NC_027757.2 1   11.8568
NC_027757.2 2   10.217
NC_027757.2 3   12.202
NC_027757.2 4   21.4317
NC_027757.2 5   26.7172

接下来为了画图,需要知道窗口的物理位置。可以用上面tmp3的窗口编号直接计算得到,但这样的话,每一条染色体的最后一个窗口的坐标是错的,尽管对整体画图没有什么影响。为了准确起见,采用哈希表匹配。

#根据上文的final.all_chr_to_50kb.bed得到的哈希表
NC_027757.2-1   0-50000
NC_027757.2-2   50000-100000
#然后再用脚本匹配,在tmp3的基础上得到如下结果
NC_027757.2 0   50000   11.8568
NC_027757.2 50000   100000  10.217

再替换染色体名称就可以了。

由于高度同源序列和重复序列的存在,某些区域的深度会非常高,建议人为调整以便于呈现。如,将平均深度大于100的区域深度全重新定义为100。

awk '{if($4 > 100) print $1"\t"$2"\t"$3"\t100"}{if($4 <= 100) print $0}' depth_distribution.bed > final_depth_distribution.bed

接下来才是本文的主角。

3. 画图
#安装,加载R包
if (!requireNamespace("BiocManager", quietly = TRUE))
  install.packages("BiocManager")
BiocManager::install("karyoploteR", version = "3.8")
library(karyoploteR)

Bn.genome <- toGRanges("ref.fa.rename.bed") #染色体名称都改成了chr1A、chr2A......
kp <- plotKaryotype(genome=Bn.genome,labels.plotter = NULL,plot.type=1,main="sample") #labels.plotter = NULL不显示染色体名称,下一行命令是添加染色体名称,这样做的好处是名称的文字大小可以自己设置
kpAddChromosomeNames(kp, cex = 1.2)
sample_bar <- toGRanges("final_depth_distribution.bed") #前面脚本得到的结果文件
kpBars(kp, sample_bar,border="#377EB8",data.panel = 1,r0 = 0,r1 = 1,ymin = 0,ymax = 100)

#下面两行是在染色体的两边加上y轴,左边还是右边由参数side区分,1表示右边,2表示左边,默认是1
#tick.len = 700000, label.margin = -600000这两个值具体多少合适与染色体的长度有关,多试几次就可以了,它们的单位是bp,序列长度的那个bp
kpAxis(kp, data.panel = 1, ymin = 0, ymax=100, tick.pos = c(20,40,60,80), labels = c("20","40","60","80"),tick.len = 700000, label.margin = -600000, side = 2, cex = 0.4, col="#777777")
kpAxis(kp, data.panel = 1, ymin = 0, ymax=100, tick.pos = c(20,40,60,80), labels = c("20","40","60","80"),tick.len = 700000, label.margin = -600000, cex = 0.4,col="#777777")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348