2011-10-19 42 views
7

我想循环播放一长串qplotsggplot2曲线图,在每个曲线上暂停,以便在继续之前对其进行检查。通过一系列曲线循环

下面的代码不会产生地块:

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

,但如果我在运行了在循环后这条线,我得到一个情节:

qplot(mtcars[,Var], wt, data=mtcars, xlab=Var) 

什么是这种现象的原因?如何显示循环内的图表?

跟进: 是否有更优雅的方式来循环变量比使用mtcars[,Var]xlab=Var

+3

尝试在'print'中打包你的'qplot'调用。请参阅R FAQ的7.22。 – James

回答

10

正如其他答案所说,将每个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,比如在返回别的东西的函数中,它什么都不会做。

+0

谢谢,我更正了我的答案。 – ROLO

5

添加print

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

有关说明见塔维斯陆克文的答案。

6

我最近做了类似的事情,并且认为我会提到两个额外的帮助代码。我包含在for循环这一行打印每个情节后,使R暂停了一会儿(在这种情况下,半秒):

Sys.sleep(0.5) 

或者,而不是在屏幕上查看图,你可以直接将它们保存到文件中,然后在闲暇时浏览它们。或者在我的情况下,我试图对我们正在跟踪的蜜蜂的轨迹进行动画处理,因此我将图像序列导入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()