我正在保存一个刻面的ggplot2图,它可以很好地保存在较小的尺寸,但是当我想要增加它时会失败.
> ggsave("tst.png",height=6.75,width=9)
# works fine
> ggsave("tst.png",height=9,width=12)
Error in grDevices::png(..., width = width, height = height, res = dpi, :
unable to start device
In addition: Warning messages:
1: In grDevices::png(..., width = width, height = height, res = dpi, :
Unable to allocate bitmap
2: In grDevices::png(..., width = width, height = height, res = dpi, :
opening device failed
Run Code Online (Sandbox Code Playgroud)
我之前用ggsave保存了这个大小的png,为什么它不工作的任何想法?
可重复的例子:
library(car)
qplot(education,data=Vocab,geom="density",colour=sex)+facet_wrap(~year)
Run Code Online (Sandbox Code Playgroud)
Jor*_*eys 12
注意:在Windows 7 64位上使用R 2.12.1,此问题已消失.如果遇到此问题,请先尝试更新R版本.
在另一个问题再次出现问题之后,我在我的新系统上重新测试我的测试代码,看看错误是否已经消失了.
编辑:为什么底层代码可以工作的技巧是它使用的分辨率只有72 dpi而不是300dpi,这是ggsave()我认为的标准.
所以ggsave("tst.png",height=9,width=12,dpi=72)可以做到这一点.
但如果不能接受,你真的必须有一个疯狂的情节.据我所知,这个问题与显卡有关(来自教授里普利的这条消息).
如果分辨率是一个问题,你最好去像eps或pdf这样的矢量化格式.
编辑2:
显然,某个地方有一个涉及某种内存泄漏的错误?提供以下代码:
library(car)
library(ggplot2)
qplot(education,data=Vocab,geom="density",colour=sex)+facet_wrap(~year)
setwd("G:/Temp")
i<-1
while(1){
tryCatch(ggsave("tst.png",height=9+i,width=12+i),error=function(e) {print(i);stop(e);})
i <- i+1
}
Run Code Online (Sandbox Code Playgroud)
这对我来说很好,直到我达到9,然后我得到你得到的错误.每次下一次尝试运行代码时,再次启动i=1,都会产生相同的错误.尝试png()并dev.off()再次给出相同的错误.似乎存在一些内存填满而没有被清空,有效地阻止了另一个png文件被保存.也对我来说gc()没有做任何事情.即使关闭R并再次重新开启也行不通.
它是"解决"使用ggsave("tst.pdf"),但错误仍然存在.我要向R团队报告.