使用R中的循环绘制子集的子集

时间:2016-09-18 20:18:27

标签: r for-loop subset

我有一个看起来像这样的数据框。

head(growthMelt)
        Date  Strain Replicate Fluor
1 2016-08-24    42-2   Fluor.I 14.01
2 2016-08-24    42-4   Fluor.I  9.60
3 2016-08-24    42-6   Fluor.I 47.66
4 2016-08-24    42-8   Fluor.I 28.47
5 2016-08-24 Control   Fluor.I 51.61
6 2016-08-26    42-2   Fluor.I 75.78

我有5个菌株,每个菌株每个日期有三个荧光测量值。我需要为每个应变与日期的每个荧光测量值绘制一个图。所以,最终我需要得到像plot(Fluor~Date)这样的东西。我需要五个图,每个图一个,每个图上有三个荧光(Fluor.I, Fluor.II, Fluor.III)测量线。

有很多数据,所以我选择使用for循环来进行子集和绘图。到目前为止,我已经尝试过:

strains<-unique(growthMelt$Strain)

 fluors<-unique(growthMelt$Replicate)

for(i in strains){
  sub.strain<-subset(growthMelt, Strain==i)
  for (i in fluors){
    sub.flours<-subset(sub.strain, Replicate==i)
    plot(Fluor~Date, sub.flours)
  }
}

结果图仅显示一个菌株的一个Fluor复制品。 任何建议都将不胜感激。

另外,这是我关于Stack Overflow的第一个问题所以请保持温和。 :)

1 个答案:

答案 0 :(得分:1)

您只会看到最后一个情节,因为它每次都会覆盖最后一个情节。因此,您可以尝试制作矩阵的mfrow。

par(mfrow=c(5,3))

strains<-unique(growthMelt$Strain)

 fluors<-unique(growthMelt$Replicate)

for(i in strains){
  sub.strain<-subset(growthMelt, Strain==i)
  for (j in fluors){
    sub.flours<-subset(sub.strain, Replicate==j)
    plot(Fluor~Date, sub.flours)
  }
}

或者您可以将每个地图保存到新文档(例如pdf):

for(i in strains){
  sub.strain<-subset(growthMelt, Strain==i)
  for (j in fluors){
    sub.flours<-subset(sub.strain, Replicate==j)
    pdf(paste("Plot_",i,"x",j,".pdf",sep=""))
    plot(Fluor~Date, sub.flours)
    dev.off()
  }
}

或者只是一个大pdf

pdf("Plot.pdf")
for(i in strains){
  sub.strain<-subset(growthMelt, Strain==i)
  for (j in fluors){
    sub.flours<-subset(sub.strain, Replicate==j)
    plot(Fluor~Date, sub.flours)
  }
}
dev.off()

ggplot 选项:

library(ggplot2)
p1 <- ggplot(growthMelt, aes(x=Date, y = Fluor)) + 
  geom_point() + 
  geom_smooth(method = "lm", se = FALSE) + 
  facet_grid(Strain ~ Replicate)

p1