2013-04-23 82 views
6

昨天我將R升級到版本3.0.0,將ggplot2升級到版本0.9.3.1(並對我的腳本做了一些小修改)。現在,當我嘗試保存繪圖時出現錯誤 - 不幸的是,錯誤不會以較小的數據框來重現,因此我已經包含了生成相同大小的代碼。在循環中保存圖R

library("ggplot2") 

# Create data frame 
# Time interval ID (x) 
bin.ts.avg <- as.data.frame(rep(1:18, 31)) 
names(bin.ts.avg) <- "x" 
# Time (sequence of 10 minuter intervals between 7am and 10am) 
tt.month.bins <- seq(from=as.POSIXct("2012-01-01 GMT"), to=as.POSIXct("2012-01-01 GMT") + 60*60*24*31, by="10 mins") 
tt.month.bins <- tt.month.bins[-length(tt.month.bins)] 
temp <- as.numeric(format(tt.month.bins, "%H")) 
ind <- which(temp >=7 & temp <= 9) 
tt.month.bins <- tt.month.bins[ind] 
bin.ts.avg$dep <- tt.month.bins 
# Value (with some NA) 
bin.ts.avg$tt <- runif(558, min=2.5, max=5) 
bin.ts.avg$tt[trunc(runif(200, min=1, max=558))] <- NA 
# Day 
bin.ts.avg$depday <- rep(1:31, each=18) 

for (i in 1:2){ 
    if (1){ 
    hist(rnorm(100)) 
    dev.print(file="MyHist.png",device=png, bg="white", width=640, height=352) 

    p <- ggplot(bin.ts.avg, aes(x, tt)) + geom_point() +geom_line() + facet_grid(.~depday) 
    p <- p + ggtitle("10 minute averages")+ xlab("Hour") + ylab("Values")  
    p <- p + scale_x_continuous(breaks=c(min(bin.ts.avg$x), max(bin.ts.avg$x)), labels=c("7", "10")) 
    print(p) 
    dev.print(file="MyGGPlot.png",device=png, bg="white", width=640, height=352) 
    } 
} 

在運行該腳本時,收到以下錯誤消息:

錯誤UseMethod(「深度」):無適用方法爲「深度」 應用於類「NULL的目的「

但是,如果我逐行運行腳本,一切運行正常(下圖)。 How the ggplot should look現在,如果我改變for循環和使用dev.copy,而是ggsave dev.print,如下

for (i in 1:2){ 
    if (1){ 
    hist(rnorm(100)) 
    dev.copy(file="MyHist.png",device=png, bg="white", width=640, height=352) 
    dev.off() 

    p <- ggplot(bin.ts.avg, aes(x, tt)) + geom_point() +geom_line() + facet_grid(.~depday) 
    p <- p + ggtitle("10 minute averages")+ xlab("Hour") + ylab("Values")  
    p <- p + scale_x_continuous(breaks=c(min(bin.ts.avg$x), max(bin.ts.avg$x)), labels=c("7", "10")) 
    print(p) 
    ggsave(filename="MyGGPlot.png") 
    } 
} 

在試圖打開「MyGGPlot.png」使用畫圖,我收到一條錯誤信息,說明

A sharing violation occurred while accessing <filename> 

我使用RStudio版本0.97.449運行腳本。 關於我需要更改以保存當前地塊的任何想法?

+0

在每個循環中,嘗試打開一個設備(例如, 'png()'),並在繪圖之前給出一個唯一的文件名。然後用'dev.off()'在循環結束時關閉設備。 – 2013-04-23 05:55:45

回答

12

dev.copy後,一對夫婦點

使用graphics.off()的。這將關閉所有圖形設備。你也可以撥打dev.off()兩次(但graphics.off()是一種包裝,基本上都會叫dev.off()足夠的時間以關閉所有圖形設備

ggsave不需要print ED對象(這是其中FAQ 7.22是相關的情況下) 。

默認是last_plot是創建的最後一個對象ggplot,改性的或印刷的,所以創造p值足以 ggsave('filname.png')保存該對象。

for (i in 1:2){ 
    if (1){ 
    hist(rnorm(100)) 
    dev.copy(file="MyHist.png",device=png, bg="white", width=640, height=352) 
    graphics.off() 

    p <- ggplot(bin.ts.avg, aes(x, tt)) + geom_point() +geom_line() + facet_grid(.~depday) 
    p <- p + ggtitle("10 minute averages")+ xlab("Hour") + ylab("Values")  
    p <- p + scale_x_continuous(breaks=c(min(bin.ts.avg$x), max(bin.ts.avg$x)), labels=c("7", "10")) 
    # no need to print p 
    ggsave(filename="MyGGPlot.png") 
    # note specifying p is redundant but explicit. 
    # ggsave(filename = 'MyGGplot.png', plot = p) 
    } 
}