R 分配循环不适用于绘图
循环的每次迭代都会创建一个新的plotx。运行printplotx时,它会生成一个不同的图形 然后我使用assign调用每个绘图plotx1、plotx2等,将每个绘图另存为一个单独的名称。 然后,当我绘制名称时,它们都与Y=c相同,但Y轴正确地标记为回路的原始Y!发生什么事了? 我如何纠正这个问题R 分配循环不适用于绘图,r,ggplot2,assign,R,Ggplot2,Assign,循环的每次迭代都会创建一个新的plotx。运行printplotx时,它会生成一个不同的图形 然后我使用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)
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
@Roland解释了这种行为的原因。如果以后要访问这些图,则应使用列表来存储这些图。此外,在传递x和y的字符串时,应该使用aes_字符串而不是aes。以下是工作代码:
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]单独打印它们打印时,打印是新构建的。在循环之后,Y的值是listY中的最后一个值。您有几个选项:可以替换dat[[Y]],也可以将ggplot对象转换为grob。这是在循环外获得相同绘图的正确原因。如果这是一个新问题,很抱歉,但如何将绘图称为COWPROOT?当我尝试运行plot.gridplots[1],plots[2]时,它不会将它们识别为plots将其配置出来我需要使用plot\u gridplotlist=plots\u string使其成为plots,这样您就不需要像dat[[X]]那样编码,而是可以直接引用变量。所以在这种情况下,它可能看起来像aes_stringx=X,y=y。