安装
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: 将基因组信息在染色体上“画”出来