2017-08-01 93 views
0

循环的每次迭代都会创建一个新的plotx。这运行良好,因为当我运行打印(plotx)它会产生不同的图形。指定循环不适用于绘图

然后,我使用assign来调用每个plot“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 
+2

当你打印该地块建造新绘制出来。在循环之后,'Y'的值是'listY'中的最后一个值。你有几个选择:你可以用'dat [[Y]]来代替,或者你可以把ggplot对象变成grob。 – Roland

+0

这是在循环外获得相同绘图的正确原因。 – Sal

回答

1

此行为的原因由@Roland解释。如果您想稍后访问,应该使用列表来存储图表。另外,您应该使用aes_string而不是aes,因为您正在传递字符串xy。这是一个工作代码:

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"]

+0

对不起,如果这是一个新问题,但我该如何将情节称为cowplot?当我尝试运行plot.grid(图[1],图[2])时,它不会将它们识别为地块 – Birdonawire

+0

算出它我需要使用plot_grid(plotlist = plot) – Birdonawire

+0

'aes_string'使它成为你不用需要像'dat [[X]]这样的编码',但可以直接引用该变量。所以在这种情况下,它可能看起来像'aes_string(x = X,y = Y)'。 – aosmith