2011-05-04 175 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