循环通过一系列qplots

Zac*_*ach 7 r ggplot2

我想循环一系列qplots或多个ggplot2情节,暂停每一个,以便我可以在继续之前检查它.

以下代码不生成图:

library(ggplot2)
par(ask=TRUE)
for(Var in names(mtcars)) {
    qplot(mtcars[,Var], wt, data=mtcars, xlab=Var)
}
Run Code Online (Sandbox Code Playgroud)

但如果我在运行循环后运行此行,我会得到一个情节:

qplot(mtcars[,Var], wt, data=mtcars, xlab=Var)
Run Code Online (Sandbox Code Playgroud)

这种行为的原因是什么?如何在循环中显示图?

跟进:循环变量比使用mtcars[,Var]和更优雅xlab=Var吗?

Tav*_*udd 11

正如其他答案所说,将每个qplot()电话打包print()(这是R FAQ 7.22).原因是ggplot在print.ggplot被调用之前不会打印到图形设备上. print()是一个派生到print.ggplot幕后的通用函数.

当你在repl("read-evaluate-print loop",又名shell)中工作时,前一个输入行的返回值将通过隐式调用自动打印print().这就是qplot(mtcars[,Var], wt, data=mtcars, xlab=Var)为你工作的原因 .它与范围或for循环无关.如果您将该行放在其他未直接返回到repl的其他位置,例如在返回其他内容的函数中,它将不执行任何操作.


Jam*_*ers 6

我最近做了类似的事情,并且认为我会提到两个有用的代码.我在for-loop中包含了这一行,以便在打印每个绘图后让R暂停片刻(在这种情况下,半秒):

Sys.sleep(0.5)
Run Code Online (Sandbox Code Playgroud)

或者,您可以直接将它们保存到文件中,然后在闲暇时浏览它们,而不是在屏幕上查看图形.或者在我的情况下,我试图动画我们跟踪的蜜蜂的轨迹,所以我将图像序列导入ImageJ并将其保存为GIF动画.

library(ggplot2)
png(file="cars%d.png")
for(Var in names(mtcars)) {
print(qplot(mtcars[,Var], wt, data=mtcars, xlab=Var))
}
dev.off()
Run Code Online (Sandbox Code Playgroud)


ROL*_*OLO 5

添加print:

library(ggplot2)
par(ask=TRUE)
for(Var in names(mtcars)) {
    print(qplot(mtcars[,Var], wt, data=mtcars, xlab=Var))
}
Run Code Online (Sandbox Code Playgroud)

有关解释,请参阅Tavis Rudd的回答.