分配循环不适用于绘图

时间:2017-08-01 06:23:15

标签: r ggplot2 assign

循环的每次迭代都会创建一个新的plotx。这工作正常,因为当我运行print(plotx)时,它会产生不同的图形。

然后我使用assign来调用每个绘图“plotx1”,“plotx2”等。将每个绘图保存为单独的名称。 然后,当我绘制名称图时,它们都与Y = c相同但是y轴正确地标记为循环的原始Y!这是怎么回事? 我该如何纠正?

dat = data.frame("d"= rep(c("bla1","bla2","bla3"),3),"a" = c(1:9), "b"= 
c(19:11), "c"=rep(c(3,2,2),3))

X = "d"
listY = c("a","b","c")
z= 0
for (Y in listY){
  z= z+1
plotx= ggplot(dat,
     aes(x = dat[[X]], y = dat[[Y]])) +
     geom_boxplot() +
     scale_x_discrete(X) +
     scale_y_continuous(Y)+
     theme_bw()
 print(plotx)

 plot_name = paste0("plotx",z)
 assign(plot_name , plotx)
   }
plotx1
plotx2
plotx3

1 个答案:

答案 0 :(得分:1)

@Roland解释了这种行为的原因。如果您想稍后访问它们,则应使用列表来存储绘图。此外,在为aes_stringaes传递字符串时,您应该使用x而不是y。这是一个有效的代码:

dat = data.frame("d"= rep(c("bla1","bla2","bla3"),3),"a" = c(1:9), "b"= 
                   c(19:11), "c"=rep(c(3,2,2),3))

X = "d"
listY = c("a","b","c")
z= 0
plots <- list()
for (Y in listY){
  z= z+1

  plotx <-  ggplot(dat,
                aes_string(x = dat[[X]], y = dat[[Y]])) +
                geom_boxplot() +
                scale_x_discrete(X) +
                scale_y_continuous(Y)+
                theme_bw()
  plot_name <- paste0("plotx",z)
  plots[[plot_name]] <- plotx

}

然后您可以使用plots["plotx1"]

单独绘制它们