探针寻找之旅(8)——RIdeogram绘制染色体探针分布图

安装

linux服务器都装不上,净是问题,在自己win10的电脑上装的很是顺利!
> BiocManager::install("RIdeogram")

准备输入文件

  • karyotype文件:可以是五列(包含中心粒位置)或三列(不含中心粒位置)
    第一列:染色体号(Chr)
    第二列:起始(Start)
    第三列:终止(End)
    第四列:中心粒起始位置(CE_start)
    第五列:中心粒终止位置(CE_end)
    分隔符:"\t" 即Tab
D:\>type csi.karyotype
Chr     Start   End
1       0       28800734
2       0       30837053
3       0       28714068
4       0       19953105
5       0       36146064
6       0       21179577
7       0       32205053
8       0       22710839
9       0       18450726

有了基因组.fasta文件,如何得到karyotype文件?
基因组文件中有未组装基因组合并成的染色体的时候,要将其与基因组文件分离
awk 'BEGIN{f="csi.chromosome.nochrUn.fa"} {if($1==">chrUn"){f="csi.chrUn.fa"; print $0 >> f} else print $0 >> f}' csi.chromosome.fa

  • 方法一
    用samtools的faidx工具实现
$ samtools faidx xxx.fa
$ cat *.fai
chr1    28800734        6       60      61
chr2    30837053        29280759        60      61
chr3    28714068        60631769        60      61
chr4    19953105        89824411        60      61
chr5    36146064        110110074       60      61
chr6    21179577        146858579       60      61
chr7    32205053        168391155       60      61
chr8    22710839        201132965       60      61
chr9    18450726        224222324       60      61
$ vim getKaryotype.sh
 less *.fai | awk 'BEGIN{print "Chr" "\t" "Start" "\t" "End"} 
 {
 if($1=="chr1")print "1" "\t" "0" "\t" $2; 
 else if($1=="chr2")print "2" "\t" "0" "\t" $2; 
 else if($1=="chr3")print "3" "\t" "0" "\t" $2; 
 else if($1=="chr4")print "4" "\t" "0" "\t" $2; 
 else if($1=="chr5")print "5" "\t" "0" "\t" $2; 
 else if($1=="chr6")print "6" "\t" "0" "\t" $2; 
 else if($1=="chr7")print "7" "\t" "0" "\t" $2; 
 else if($1=="chr8")print "8" "\t" "0" "\t" $2; 
 else if($1=="chr9")print "9" "\t" "0" "\t" $2
 }' > xxx.karyotype
$ chmod +x getKaryotype.sh
$ ./getKaryotype.sh
  • 方法二
    用seqkit的fx2tab工具实现
$ seqkit fx2tab -ln xxx.fa > xxx.chr_len
$ cat *.chr_len
chr1                    28800734
chr2                    30837053
chr3                    28714068
chr4                    19953105
chr5                    36146064
chr6                    21179577
chr7                    32205053
chr8                    22710839
chr9                    18450726
$ vim getKaryotype.sh
 less *chr_len | awk 'BEGIN{print "Chr" "\t" "Start" "\t" "End"} 
 {
 if($1=="chr1")print "1" "\t" "0" "\t" $2; 
 else if($1=="chr2")print "2" "\t" "0" "\t" $2; 
 else if($1=="chr3")print "3" "\t" "0" "\t" $2; 
 else if($1=="chr4")print "4" "\t" "0" "\t" $2; 
 else if($1=="chr5")print "5" "\t" "0" "\t" $2; 
 else if($1=="chr6")print "6" "\t" "0" "\t" $2; 
 else if($1=="chr7")print "7" "\t" "0" "\t" $2; 
 else if($1=="chr8")print "8" "\t" "0" "\t" $2; 
 else if($1=="chr9")print "9" "\t" "0" "\t" $2
 }' > xxx.karyotype
$ chmod +x getKaryotype.sh
$ ./getKaryotype.sh
  • 基因密度文件:(我们这里是探针密度)
    第一列:染色体号
    第二列:起始
    第三列:终止
    第四列:基因密度值
D:\>more csi.15bp_density
Chr     Start   End     Value
1       0       10000   0
1       10000   20000   0
1       20000   30000   0
1       30000   40000   0
1       40000   50000   0
1       50000   60000   0
1       60000   70000   0
1       70000   80000   0
1       80000   90000   0
1       90000   100000  0
1       100000  110000  1

获得密度文件
探针拆分(e.g.15bp) → blast+短序列比对 → 结果筛选 → 筛选结果转为bed格式 → bedtools makewindows工具分bin(统计匹配数的单位窗格) → bedtools coverage工具将筛选结果统计入bin,得到密度文件 → 密度文件格式调整

# blast+短序列比对
makeblastdb -in csi.chromosome.fa -dbtype nucl -out csi.chromosome.fa -parse_seqids
blastn -query 15bpC5_1.fa -db csi.chromosome.fa -num_threads 3 -outfmt 7 -out 15bpC5_1.out7 -word_size 7 -gapopen 5 -gapextend 2 -reward 1 -penalty -3
# 结果筛选
awk 'BEGIN{i=1} {
if ($1=="C5_1-"i) {
 if ($2!="chrUn" && $3==100 && $4==15) {
   print $0 >> "15bpC5_1.id1.0co15bp.nochrUn"};
}
else if ($1=="#")
 next;
else {
 ++i;
 if ($2!="chrUn" && $3==100 && $4==15) {
   print $0 >> "15bpC5_1.id1.0co15bp.nochrUn"};
}
}' 15bpC5_1.out7
# 筛选结果转为bed格式
less *bp.nochrUn | awk '{if($9<$10)print $2"\t"$9-1"\t"$10"\t"$1; else print $2"\t"$10-1"\t"$9"\t"$1}' > xxx.bed
# 分bin
less xxx.chr_len | awk '{print  $1 "\t" $2}' > xxx.chr_len2
bedtools makewindows -g xxx.chr_len2 -w 10000 > xxx.chromosome_10k.windows
# 得到密度文件
bedtools coverage -a xxx.chromosome_10k.windows -b xxx.bed | cut -f 1-4 > xxx.cov
# 密度文件格式调整
less xxx.cov | awk 'BEGIN{print "Chr" "\t" "Start" "\t" "End" "\t" "Value"}
{
if($1=="chr1")print "1" "\t" $2 "\t" $3 "\t" $4;
else if($1=="chr2")print "2" "\t" $2 "\t" $3 "\t" $4;
else if($1=="chr3")print "3" "\t" $2 "\t" $3 "\t" $4;
else if($1=="chr4")print "4" "\t" $2 "\t" $3 "\t" $4;
else if($1=="chr5")print "5" "\t" $2 "\t" $3 "\t" $4;
else if($1=="chr6")print "6" "\t" $2 "\t" $3 "\t" $4;
else if($1=="chr7")print "7" "\t" $2 "\t" $3 "\t" $4;
else if($1=="chr8")print "8" "\t" $2 "\t" $3 "\t" $4;
else if($1=="chr9")print "9" "\t" $2 "\t" $3 "\t" $4
}' > xxx.15bp_density

画图

数据导入 → ideogram画图,输出svg文件 → convertSVG将svg转为png

require(RIdeogram)
xxx_karyotype <- read.table("D:\\xxx.karyotype", sep = "\t", header = T, stringsAsFactors = F)
density <- read.table("D:\\xxx.15bp_density", sep = "\t", header = T, stringsAsFactors = F)
ideogram(karyotype = xxx_karyotype, overlaid = density, colorset1 = c("#f7f7f7", "#d73027"), output = "D:\\Temp\\workstation\\fishTeSeq2\\15bpC5_1.svg")
convertSVG("D:\\Temp\\workstation\\fishTeSeq2\\15bpC5_1.svg", device = "png")

PS

想要查看所需要的不同文件的格式,可以打开R安装目录中 D:\R\library\RIdeogram\doc\RIdeogram.R 文件,并运行一下,既可以看到不同文件的格式。

Bug

convertSVG中参数file用来赋值输出文件,但赋值后会自动在前面加上Documents的路径,导致报错。
因此只能放弃设置file参数,输出文件后去C:\Users\Username\Documents\下找新生成的名为chromosome.png的文件。

> convertSVG("D:\\Temp\\workstation\\fishTeSeq2\\15bpC5_1.svg", file = "D:\\Temp\\workstation\\fishTeSeq2\\csi.15bpC5_1.id0.9co15bp.png", device = "png")
Error in grDevices::png(..., res = dpi, units = "in") : 
  unable to start png() device
In addition: Warning messages:
1: In grDevices::png(..., res = dpi, units = "in") :
  unable to open file 'C:/Users/Li Yao/Documents/D:\Temp\workstation\fishTeSeq2\csi.15bpC5_1.id0.9co15bp.png' for writing
2: In grDevices::png(..., res = dpi, units = "in") : opening device failed

所以选用这种方式反而更好些,用setwd(dir)设置一下工作路径

setwd("D:/workstation")
ideogram(karyotype = human_karyotype, overlaid = gene_density)
convertSVG("chromosome.svg", device = "png")

衷心感谢曹锴师兄的指导以及谢文召师兄的脚本。

对了,客官若觉得有点用就请给点个赞赞呗,Thanks!


  • 参考文章
    RIdeogram: drawing SVG graphics to visualize and map genome-wide data on idiograms
    RIdeogram:染色体数据可视化的R包
    从Fasta文件取序列的深度解析 ==> samtools faidx
    samtools-faidx用法
    seqkit的安装与使用
    R语言 读取文件
    如何用R画出你们的SNP密度图,基因密度图
    基因密度热图代码分享
    karyoploteR:画染色体的好帮手
    karyoploteR: 将基因组信息在染色体上“画”出来

你可能感兴趣的:(探针寻找之旅(8)——RIdeogram绘制染色体探针分布图)