gpt4 book ai didi

r - 在循环中将图保存在R中

转载 作者:行者123 更新时间:2023-12-04 13:40:47 27 4
gpt4 key购买 nike

昨天,我将R升级到了3.0.0版,并将ggplot2升级到了0.9.3.1版(并对脚本进行了一些小的更改)。现在,在尝试保存图时出现错误-不幸的是,该错误不会在较小的数据帧中重现,因此我包含了生成相同大小的代码的代码。

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)
}
}

运行此脚本时,我收到以下错误消息:

Error in UseMethod("depth") : no applicable method for 'depth' applied to an object of class "NULL"



但是,如果我逐行运行脚本,那么一切都可以正常运行(如下图所示)。现在,如果我更改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运行脚本。
关于保存当前绘图所需更改的任何想法?

最佳答案

几点

graphics.off()之后使用dev.copy。这将关闭所有图形设备。您也可以调用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)
}
}

关于r - 在循环中将图保存在R中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16161852/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com