2011-05-04 123 views
11

我想循环绘图并将绘图的结果放在PDF中。在for循环中打印到PDF

下面的代码来做到这一点:

这样做是从虹膜数据集循环3次,积3个不同的地块。然后它应该保存到C:/驱动器。 PDF文件已创建,但已损坏。

for(i in 1:3){ 
    pdf(paste("c:/", i, ".pdf", sep="")) 
    plot(cbind(iris[1], iris[i])) 
    dev.off() 
} 
+2

这适用于Linux上的我。 (无论如何,当在该系统上使用正确的路径时)。你真的给出的例子是你在做什么或者你在使用不同的绘图系统吗? Lattice或ggplot2是否存在?如果你是这样,那么你需要在'print()'中将绘图调用封装成自动打印,并且你需要打印lattice或ggplot对象来让它们绘制一些东西。 – 2011-05-04 10:55:53

+0

是的,它们在格子中,但是这个也不起作用... – 2011-05-04 10:59:36

+0

任何错误?我的意思是,正如@Chase在他的回答中提到的那样,是您的系统中有效的路径?如果你有写权限,那么只需保存到工作目录,然后按照@Chase所示删除路径。 – 2011-05-04 11:01:59

回答

36

要画格子地块设备上,需要通过打印到的点阵图形函数的调用产生的对象。通常,在交互式使用中,如果未分配,R会自动打印对象。但是,在循环中,自动打印不起作用,因此必须安排要打印的对象,通常通过将其包装在print()中。

下面是一个例子(请原谅我的公式符号;-)的滥用:

require(lattice) 
for(i in 1:3) { 
    pdf(paste("plot", i, ".pdf", sep = "")) 
    print(xyplot(iris[,1] ~ iris[,i], data = iris)) 
    dev.off() 
} 

这将产生一个pdf设备上的三个地块。

+2

这是http:// cran的特例。r-project.org/doc/FAQ/R-FAQ.html#Why-do-lattice_002ftrellis-graphics-not-work_003f(有点难以弄清楚,因为原始海报给了我们什么可能不是他们真正的代码试图运行) – 2011-05-04 15:43:13

2

是在您的操作系统上包含“c:/”有效文件名的文件名?在调用pdf之前,这看起来像是您想要设置的工作目录的一部分。我得到一个错误,告诉我它无法打开该文件:

Error in pdf(paste("c:/", i, ".pdf", sep = "")) : 
    cannot open file 'c:/1.pdf' 

如果我把“C:/”从文件名位,正确地产生3个PDF文件。此外,如果您将dev.off()移动到for循环外部,则会得到一个包含三个页面的PDF,而不是三个PDF。可能是也可能不是你想要的...

for(i in 1:3){ 
    pdf(paste("plot", i,".pdf",sep="")) 
    plot(cbind(iris[1],iris[i])) 
    dev.off() 
} 
+0

我如何设置我的r的工作目录? – 2011-05-04 10:58:44

+1

'setwd()',例如:'setwd(“d:/my.dir”)'。 – 2011-05-04 11:01:46

+1

@Sir Ksilem - 找出当前工作目录的位置,使用'getwd()'。要导航到不同的目录,使用'setwd('c:/ path/to/new/directory')'。我相信'setwd()'可以同时处理绝对和相对目录,但这可能与操作系统有关。帮助页面应该有更多的细节。 – Chase 2011-05-04 11:02:13