1.R畫圖
R是我們做生信進(jìn)行圖形展示較為常用的軟件琼梆,我們在經(jīng)常使用R進(jìn)行數(shù)據(jù)展示,畫一個或者幾個圖,但我們做生信的屯援,批量化是我們最重要的目標(biāo)之一。比如有時候可能有幾萬個圖需要畫念脯,我們不可能一個一個的去畫圖狞洋,這時候就需要進(jìn)行批量畫圖。
2.R循環(huán)畫圖
R循環(huán)畫圖循環(huán)畫圖挺簡單绿店,主要是在dev.off()之前吉懊,加上一句print(p)即可庐橙,這里的p為畫圖對象,如下所示:
```
for (i in cluster){
name<-paste(i,'cluster_VlnPlot',sep='_')
mkdirs(paste(outdir,'3_marker',sep='/'),name)
for(m in 1:nrow(all.markers)){
if (all.markers["cluster"][m,]==i){
filename<-paste(gene.list[m],'VlnPlot.pdf',sep='_')
graph <- paste(name,filename,sep='/')
pdf(graph, w=12, h=8)
p<-VlnPlot(object = immune.combined, features.plot = c(gene.list[m]), return.plotlist=TRUE,point.size.use = -1,cols.use=color,size.x.use = -1)
print(p)
plot_grid(p)
dev.off()
}
}
}
```
這里print(p)是循環(huán)的關(guān)鍵
2.try語句畫圖
我們在畫圖或者操作的時候借嗽,可能有時候某個基因不在我們已有的文件态鳖,我們直接循環(huán)畫圖,將會出現(xiàn)報錯恶导,而且這個報錯后面所有的圖都將無法正常完成浆竭,因此這里需要使用try語句,如果報錯惨寿,直接打印報錯信息邦泄,并且跳過此圖,直接畫下一幅圖裂垦,比如:
```
for (i in 1:cluster_num){
tryCatch({gene<-read.table(paste(i,"diff_gene_condition.csv",sep="_"),sep=",",header = TRUE,row.names = NULL)
graph <- paste(prefix,i,'_diff_featureHeatmap.pdf',sep='_')
pdf(graph,w=12, h=8)
gene_FeatureHeatmap<-c()
if (length(gene[,1]) >=6){
gene_FeatureHeatmap<-as.vector(gene[,1][1:6])
}else{
gene_FeatureHeatmap<-as.vector(gene[,1])
}
p<-FeatureHeatmap(immune.combined, features.plot = gene_FeatureHeatmap, group.by = "stim", pt.size = 0.25, key.position = "top",max.exp = 3,do.return =TRUE)
print(p)
plot_grid(p)
dev.off()
},error=function(e){print(paste(i,"--聚類不在某個組中,差異分析畫所有聚類的熱圖出現(xiàn)錯誤",sep=""))} )
}
```
這里主要使用的語句為:tryCatch({},error=function(e){print(報錯信息)} )
這個是我的第一版的try語句畫圖顺囊,并且也成功運行過很多次,包括循環(huán)分析蕉拢、差異分析特碳。
3.第二版循環(huán)畫圖
第一版畫圖,其實是有bug晕换,只是一直沒有遇到畫圖報錯的循環(huán)测萎,某次,我再運行這個腳本届巩,其中某個基因的數(shù)據(jù)在我們畫圖文件中不存在硅瞧,結(jié)果直接報錯,畫不出來圖恕汇,報錯信息如下:
開始一直不知道原因腕唧,后面通過查詢報錯信息,找到原因(https://stackoverflow.com/questions/24207960/too-many-open-devices-r)瘾英,原來是因為報錯的時候枣接,pdf文件已經(jīng)建立,但是沒有關(guān)閉缺谴,如果循環(huán)太多但惶,將會出現(xiàn)Too many open devices r信息。
輸入命令:dev.list()
# tiff jpeg tiff jpeg tiff jpeg tiff jpeg tiff tiff tiff tiff tiff jpeg tiff tiff tiff # 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
得到如上的信息湿蛔,說明還有十幾張圖還沒有關(guān)閉膀曾,使用dev.off()關(guān)閉十幾次后,就可以正常畫圖了阳啥。
找到原因了添谊,那就得解決,這里的解決方案就是在報錯的時候察迟,我們在關(guān)閉一下圖片文件斩狱,并且刪掉改文件耳高,打印報錯信息,就解決此問題所踊,具體命令如下:
```
if (opt$gene=='yao'){
print('沒有輸入特定的基因做小提琴圖和箱線圖泌枪,continue!')
}else{
print("輸入了特別的基因秕岛,將對特定的基因進(jìn)行熱圖和小提琴圖")
costmer_gene_file<-read.table(opt$gene,sep='\t')
costmer_gene<-unique(costmer_gene_file[,1])
mkdirs(outdir,'3_marker/costmer_gene/')
setwd(paste(outdir,'3_marker/costmer_gene',sep='/'))
for (m in 1:length(costmer_gene)){
tryCatch({
print("開始進(jìn)行特定的基因表達(dá)量分布圖繪制碌燕。。瓣蛀。。雷厂。惋增。。改鲫。")
filename<-paste(costmer_gene[m],'FeaturePlot.pdf',sep='_')
pdf(filename, w=12, h=8)
p<-FeaturePlot(object =immune.combined, features.plot = as.character(costmer_gene[m]), min.cutoff = "q9", pt.size = 0.5,cols.use = c("lightgrey","blue"))
print(p)
dev.off()
},error=function(e){
dev.off()
print(paste(costmer_gene[m],"--不在分析分析結(jié)果中,基因表達(dá)量分布圖出現(xiàn)錯誤诈皿,請注意核對",sep=""))
cmd<-paste('rm ',filename,sep=' ')
system(cmd)
} )
}
for (m in 1:length(costmer_gene)){
tryCatch({
print("開始進(jìn)行特定的基因進(jìn)行小提琴圖繪制。像棘。稽亏。。缕题。截歉。。烟零。")
filename<-paste(costmer_gene[m],'VlnPlotPlot.pdf',sep='_')
pdf(filename, w=12, h=8)
p<-VlnPlot(object = immune.combined, features.plot = as.character(costmer_gene[m]), return.plotlist=TRUE,point.size.use = -1,cols.use=color,size.x.use = -1)
print(p)
dev.off()
},error=function(e){
dev.off()
print(paste(costmer_gene[m],"--不在分析分析結(jié)果中,基因表達(dá)小提琴圖出現(xiàn)錯誤瘪松,請注意核對",sep=""))
cmd<-paste('rm ',filename,sep=' ')
system(cmd)
} )
}
cmd<-paste('ls ',paste(outdir,'3_marker/costmer_gene',sep='/'),'/*.pdf|while read i;do convert $i `dirname $i`/`basename $i .pdf`.png ;done',sep='')
print(cmd)
system(cmd)
}
```
到此,循環(huán)畫圖沒有問題了锨阿。
2019年1月22日