2010-11-24 7 views
9

Ich speichere ein facettiertes ggplot2-Plot, das gut funktioniert, um bei einer kleineren Größe zu speichern, scheitert aber, wenn ich es vergrößern möchte.ggsave png Fehler bei größerem Format

> 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 

Ich habe PNGs dieser Größe zuvor mit ggsave gespeichert, irgendwelche Ideen, warum es nicht funktioniert?

Reproduzierbare Beispiel:

library(car) 
qplot(education,data=Vocab,geom="density",colour=sex)+facet_wrap(~year) 
+0

hilft es, wenn Sie R neu starten? Wie wäre es, den Dateinamen in '" /tmp/a.png "' 'zu ändern? –

+0

Nein, das Ausführen von 'gc()', das Neustarten oder Speichern unter einem anderen Namen funktioniert nicht. – James

+2

Kann unter Windows Vista und R 2.11.1 nicht mit den Beispielen aus den Hilfedateien reproduziert werden. Scheint ein Problem in Bezug auf Ihren Computer oder das Diagramm. Ist es möglich, ein reproduzierbares Beispiel zu bekommen? –

Antwort

10

HINWEIS: Die Verwendung R 2.12.1 unter Windows 7 64bit, dieses Problem verschwunden ist. Wenn Sie auf dieses Problem stoßen, versuchen Sie zunächst, Ihre R-Version zu aktualisieren.

Nachdem das Problem wieder in einer anderen Frage aufkam, wiederholte ich meinen Testcode auf meinem neuen System, um zu sehen, ob der Fehler weg war, und es ist.


EDIT: Der Trick, warum zugrunde liegende Code arbeiten könnte, ist die Tatsache, dass es nur eine Auflösung von 72 dpi verwendet und nicht 300dpi wie der Standard in ggsave() glaube ich.

so könnte ggsave("tst.png",height=9,width=12,dpi=72) den Trick tun.

Aber Sie müssen wirklich eine verrückte Handlung haben, wenn es nicht dauern kann. Soweit ich das erraten kann, hängt das Problem mit der Grafikkarte zusammen (abgeleitet von this message from prof. Ripley).

Wenn die Auflösung ein Problem ist, können Sie besser vektorisierte Formate wie eps oder pdf verwenden.


EDIT 2:

Anscheinend gibt es irgendwo einen Fehler vielleicht eine Art von Speicherverlust beteiligt? Geben Sie folgenden Code ein:

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 
} 

Das ist für mich in Ordnung läuft, bis ich etwa 9 erreicht, dann erhalte ich den Fehler, den Sie erhalten. Jeder nächste Versuch, den Code auszuführen, beginnend mit i=1, gibt den gleichen Fehler. Der Versuch mit png() und dev.off() gibt wieder den gleichen Fehler. Scheint so, als ob ein Teil eines Speichers voll ist und nicht geleert wird, was effektiv verhindert, dass eine andere PNG-Datei gespeichert wird. auch für mich gc() hat nichts gemacht. Selbst das Schließen von R und das erneute Öffnen funktionierten nicht.

Es ist "gelöst" mit ggsave("tst.pdf"), aber der Fehler bleibt. Ich würde dem R-Team berichten.

+0

Danke Joris, ich habe jetzt ein Beispiel aufgenommen. Ich schaffte es, es für 7.5x10 arbeiten zu lassen, und das erlaubte genug Platz, um Etiketten richtig zu drucken. Ich nehme an, es ist wahrscheinlich ein Problem mit der Grafikkarte, aber dafür ist es immer noch etwas klein. – James

+0

Ich bekomme immer noch das Problem mit R 2.15.2 32-Bit. Ich kann das Problem "lösen", indem ich meinen Computer neu starte und nur R auflade.Ich vermute, dass dies daher ein Problem mit dem Speicheradressraum ist - dh das Betriebssystem kann R nicht genug zusammenhängende Speicherkapazität zur Verfügung stellen, um das Abbild zu erstellen. – James

+0

Ich versuchte es erneut auf meinem System mit R 3.0.2, aber ich reproduzieren nicht. Ich ranan meinen Code und ich kann 38 erreichen, bei denen die Abmessungen einfach zu groß sind (50 Zoll ist zu viel für das Gerät). Wenn ich meinen Beispielcode erneut durchführe, tut es genau dasselbe: renne, bis ich 38 erreiche, und höre mit demselben Fehler auf. Also ich denke, das Problem ist nicht R (Ich laufe auch 32bit). –

Verwandte Themen