在for循环中将多个绘图输出到R中的单个文件中

时间:2016-01-29 19:47:48

标签: r for-loop ggplot2 output bar-chart

我有以下数据矩阵:

TranscriptID    GeneID  Biotype TranscriptName  CommonNAme  GeneName    TSS-ID  Locus-ID    DNp63D-DMECs-1  DNp63D-DMECs-2  DNp63D-DMECs-3  DNp63WTMECs-1   DNp63WTMECs-2   Fold    2-tailedtest
Test1   TestA   protein_coding  Fun1    Ex1 Ex1 ExA1    ExA1    1.15E-08    2.68E-12    0.005077929 4.99E-07    6.38E-08    6.02E+03    0.495089687
Test2   TestB   protein_coding  Fun2    Ex2 Ex2 ExA2    ExA2    3.69E-08    0.014129129 0.075213367 0.121370367 0.404553833 1.13E-01    0.123434776
Test3   TestC   protein_coding  Fun3    Ex3 Ex3 ExA3    ExA3    4.89E-05    0   0   6.58E-05    1.64E-34    4.96E-01    0.643007583
Test4   TestA   protein_coding  Fun4    Ex4 Ex4 ExA4    ExA4    0.058629449 0   0   0.056200966 0.253314667 1.26E-01    0.180082201
Test5   TestB   protein_coding  Fun5    Ex5 Ex5 ExA5    ExA5    7.80E-06    0   0   1.42E-11    4.20E-36    3.66E+05    0.495026427
Test6   TestC   protein_coding  Fun6    Ex6 Ex6 ExA6    ExA6    0   0   0   0   2.41E-101   0.00E+00    0.272228401
Test7   TestA   protein_coding  Fun7    Ex7 Ex7 ExA7    ExA7    3.77E-08    0.023945749 0.077103517 0.262936167 0.2940195   1.21E-01    0.004479038
Test8   TestB   protein_coding  Fun8    Ex8 Ex8 ExA8    ExA8    9.30E-09    4.82E-14    0.000827853 8.19E-07    7.47E-07    3.52E+02    0.496141526

我想生成每个行的均值和标准误差的条形图,其中第9行到第11列表示A组,第12到13列表示B组。我编写了以下R脚本,无需工作一个问题,但我想知道是否:

  1. 有任何建议可以优化这个脚本,使其运行得更快,特别是当我有时会有数百行和更多列时。

    1. 有没有办法确保每个8个图输出到一个文件中?因此,我的输出看起来像一个8个条形图的矩阵 我尝试使用多色函数:
    2. multiplot(q,cols = 4)#assuming这将绘制4列,每列将在下面的脚本末尾有2个图,但这不起作用。下面的当前脚本在不同的文件中输出每个图

      我的R代码:

      input <- read.delim(file="MECs-DNp63IsoformLevels.txt", header=TRUE, sep="\t")
      input<-as.matrix(input)
      
      
      
      for (i in 1:nrow(input)) {
      mean1 <- mean(as.numeric(input[i,12:13]))
      mean2 <- mean(as.numeric(input[i,9:11]))
      sd1 <- sd(as.numeric(input[i,12:13]))
      sd2 <- sd(as.numeric(input[i,9:11]))
      sem1 <- sd2/sqrt(length(input[i,12:13]))
      sem2 <- sd1/sqrt(length(input[i,9:11]))
      
      mean_sem <- data.frame(mean=c(mean1, mean2), sem=c(sem1, sem2), group=c("WT", "DNp63D-D")) 
      mean_sem$group<-factor(mean_sem$group, levels=mean_sem$group, ordered=TRUE) #this prevents ggplot from ordering the x-axis alphabaetically and keeps the order as the input dataframe
      theme_set(theme_gray(base_size = 20))
      print(i)
      p<- ggplot(mean_sem, aes(x=group, y=mean)) + 
        geom_bar(stat='identity', width=.3, colour="black", fill=c("blue", "red")) +
        geom_errorbar(aes(ymin=mean-sem, ymax=mean+sem),
                      width=.2) +
        geom_line(aes(colour=group)) +
        scale_colour_manual(values=c("blue", "red")) + 
        xlab('Genotype of MECs') +
        ylab('Quantile Norm FPKM')
      
      q = p +ggtitle(input[i,5])
      
      ggsave(filename=paste(input[i,5],'.png', sep=""), plot=q)
      
      }
      

      输出的一个例子是: enter image description here

      正如我所说,以上脚本有效。但我可以优化它以便在更大的数据集上运行更快吗?另外,如何在for循环中将8个图像输出到一个文件中。

      我的目标是输出类似于下面的输出(它可以是2列和4行,或任何组合......只要在for循环中我可以将多个图输出到一个图中)。

      enter image description here

0 个答案:

没有答案