防止在for循环中覆盖绘图

时间:2017-10-04 12:37:41

标签: r plot ggplot2

我试图在for循环中创建三个不同的图,然后在同一个图中将它们一起绘制。 我知道有人就这个话题提出了一些问题。但我不知道我做错了什么。为什么我的情节会被覆盖。 不过,我尝试了两种解决方案(创建列表或使用assign函数),我不知道为什么我会在循环结束时覆盖我的情节。

所以,第一个解决方案是创建一个列表:

library(gridExtra)
library(ggplot2)

out<-list()
for (i in c(1,2,4)){
  print(i)
  name= paste("WT.1",colnames(WT.1@meta.data[i]), sep=" ")
  print(name)
  out[[length(out) + 1]] <- qplot(NEW.1@meta.data[i],
                 geom="density",
                 main= name)
  print(out[[i]])
}
grid.arrange(out[[1]], out[[2]], out[[3]], nrow = 2)

当我在循环中打印情节时,我得到了我想要的......但当然他们不在一起。

First Plot

当我最后将它们全部绘制在一起时,我得到了所有三个的相同情节:我做的最后一个情节。

All together

这是第二个选项:assign function。我有完全相同的问题。

for ( i in c(1,2,4)) {
  assign(paste("WT.1",colnames(WT.1@meta.data[i]),sep="."), 
     qplot(NEW.1@meta.data[i],geom="density",
           main=paste0("WT.1",colnames(WT.1@meta.data[i]))))
 }

1 个答案:

答案 0 :(得分:1)

对于每次迭代,您都会在循环内错过dev.off。下面的可重现代码:

library(gridExtra)
library(ggplot2)

out<-list()
for (i in c(1,2,3)){
  print(i)

  out[[i]] <- qplot(1:100, rnorm(100), colour = runif(100))

  print(out[[i]])
  dev.off()
}
grid.arrange(out[[1]], out[[2]], out[[3]], nrow = 2)

enter image description here