Wie speichere ich einen Plot als Image auf der Festplatte?

304

Ich zeichne eine einfache lineare Regression mit R. Ich möchte dieses Bild als PNG oder JPEG speichern. Ist es möglich, dies automatisch zu tun? (per Code)

Es gibt zwei verschiedene Fragen: Erstens schaue ich bereits auf das Diagramm auf meinem Monitor und möchte es so speichern, wie es ist. Zweitens habe ich den Plot noch nicht generiert, möchte ihn aber direkt auf der Festplatte speichern, wenn ich meinen Plotcode ausführe.

blakc05
quelle
Vielleicht sollte diese Frage bearbeitet werden, um zwei unterschiedliche Szenarien zu erfragen: Erstens arbeiten Sie möglicherweise interaktiv und haben ein schönes Diagramm erstellt, das Sie speichern möchten. Oder zweitens haben Sie noch keinen Plot gesehen und möchten ihn direkt auf die Festplatte schreiben, ohne ihn zuerst anzusehen. Dies wäre sinnvoll, wenn Sie ein Skript schreiben würden, um viele Plots für Sie zu generieren. Ich werde es jetzt bearbeiten
Aaron McDaid

Antworten:

376

Es gibt zwei eng miteinander verbundene Fragen und jeweils eine Antwort.


1. In meinem Skript wird zukünftig ein Bild generiert. Wie speichere ich es auf der Festplatte?

Um ein Diagramm zu speichern, müssen Sie Folgendes tun:

  1. Öffnen Sie ein Gerät, mit png(), bmp(),pdf() oder ähnlich
  2. Zeichnen Sie Ihr Modell
  3. Schließen Sie das Gerät mit dev.off()

Ein Beispielcode zum Speichern des Plots in einer pngDatei:

fit <- lm(some ~ model)

png(filename="your/file/location/name.png")
plot(fit)
dev.off()

Dies wird in der (kombiniert) Hilfeseite für die grafischen Formate beschrieben ?png, ?bmp, ?jpegund ?tiffsowie in der separaten Hilfeseite ?pdf.

Beachten Sie jedoch, dass das Bild auf der Festplatte möglicherweise anders aussieht als das gleiche Diagramm, das direkt auf Ihrem Bildschirm dargestellt wird, z. B. wenn Sie die Größe des Bildschirmfensters geändert haben.


Beachten Sie, dass Sie Ihren Plot explizit drucken müssen , wenn Ihr Plot von einem erstellt wurde latticeoder ggplot2Sie ihn explizit drucken müssen. In dieser Antwort wird dies ausführlicher erläutert und es werden auch Links zu den häufig gestellten Fragen ( R) angezeigt : Der qplot von ggplot wird beim Sourcing nicht ausgeführt


2. Ich betrachte gerade ein Diagramm auf meinem Bildschirm und möchte es unverändert auf die Festplatte kopieren.

dev.print(pdf, 'filename.pdf')

Dies sollte das Bild perfekt kopieren und dabei die Größe des interaktiven Fensters berücksichtigen. Sie können, wie im ersten Teil dieser Antwort, durch pdfandere Dateitypen wie ersetzen png.

Andrie
quelle
4
Wenn Sie den Pfad nicht wie png (filename = "name.png") festlegen, können Sie das Verzeichnis von save withgetwd()
JuanPablo
2
Ich habe diese Antwort um einen Verweis auf erweitert dev.print. Es gibt zwei eng miteinander verbundene Fragen, die meiner Meinung nach unterschiedliche Antworten benötigen. Die zweite Unterfrage lautet im Wesentlichen "Wie speichere ich ein Bild, das ich bereits auf meinem Bildschirm gezeichnet habe?". Entschuldigung, wenn meine Bearbeitung nicht sehr gut ist, können Sie meine Änderungen gerne verbessern.
Aaron McDaid
Wie mache ich das, wenn R nach einer "Auswahl" fragt? Zum Beispiel, wenn ich m3=garchFit(~arma(3,0)+garch(1,1))und benutze plot(m3).
Jacob
3
Wie kann ich die Zahl mit dpi = 3000
Abhishek
2
8 Jahre mit R, ohne zu wissen, dass ich den auf meinem Bildschirm geöffneten Entwickler tatsächlich in einer Datei speichern kann. Ich glaube, das habe ich nicht gebraucht ... aber vielen Dank: D
Simon C.
82

Wenn Sie das Diagramm weiterhin in R sehen möchten, können Sie Folgendes verwenden dev.copy:

X11 ()
plot (x,y)

dev.copy(jpeg,filename="plot.jpg");
dev.off ();

Wenn Sie in R eine Unordnung von zu vielen Plotfenstern erreichen graphics.off(), schließen Sie alle Plotfenster.

Itamar
quelle
2
Gute Antwort! Auf diese Weise können Sie über X mit Plots experimentieren, bis Sie mit den Ergebnissen zufrieden sind, und diese dann sofort speichern. Dies ist normalerweise die bequemste Betriebsart.
Aaron McDaid
3
dev.printist besser, da es das Bild genau vom Bildschirm kopiert. dev.copyErzwingt, dass jedes Bild standardmäßig quadratisch ist. Dies ist frustrierend, wenn Sie alles gut interaktiv eingerichtet haben
Aaron McDaid
4
Ich benutze dev.print()mit den Breiten- und Höhenparametern, um die Abmessungen zu definieren. zB dev.copy(device = png, filename = 'MyPlot.png', width = 1000, height = 500) dev.off()
Scott
72

Wenn Sie ggplot2die bevorzugte Art des Speicherns verwenden, verwenden Sie ggsave. Zuerst müssen Sie zeichnen, nachdem Sie das von Ihnen aufgerufene Diagramm erstellt haben ggsave:

ggplot(...)
ggsave("plot.png")

Das Format des Bildes wird durch die Erweiterung bestimmt, die Sie für den Dateinamen auswählen. Zusätzliche Parameter können übergeben werden ggsave, vor allem width, heightund dpi.

Paul Hiemstra
quelle
Dies funktioniert gut in einer Schleife, dev.off hat bei mir nicht funktioniert
fürstlichSid
Der Vorteil davon ist die konsistente API und keine Notwendigkeit, Geräte
ein-
Im Gegensatz zu Lösungen mit devfunktionierte diese Lösung auf einer virtuellen Maschine ohne Grafikgeräte.
Miguelmorin
Ich wünschte, es gäbe einen mächtigen, aber einfachen Ansatz wie diesen für ALLE Handlungen in R. Wie auch immer, meine Stimme geht hier.
SilSur
1
Noch fast 7 Jahre gültig! Danke dir.
Nick
30

So was

png('filename.png')
# make plot
dev.off()

oder dieses

# sometimes plots do better in vector graphics
svg('filename.svg')
# make plot
dev.off()

oder dieses

pdf('filename.pdf')
# make plot
dev.off()

Und wahrscheinlich auch andere. Sie sind alle zusammen auf den Hilfeseiten aufgeführt.

Owen
quelle
Gibt es eine Möglichkeit für R, die Dateierweiterung automatisch abzuleiten (dh basierend auf der Funktion)? Es scheint mühsam, sowohl den Dateinamen als auch die verwendete Funktion ändern zu müssen.
Bonlenfum
11

Bei der ersten Frage finde dev.printich das Beste, wenn ich interaktiv arbeite. Zuerst richten Sie Ihren Plot visuell ein und wenn Sie mit dem, was Sie sehen, zufrieden sind, können Sie R bitten, den aktuellen Plot auf der Festplatte zu speichern

dev.print(pdf, file="filename.pdf");

Sie können durch pdfandere Formate wie ersetzen png.

Dadurch wird das Bild genau so kopiert, wie Sie es auf dem Bildschirm sehen. Das Problem mitdev.copy ist, dass das Bild häufig unterschiedlich ist und sich nicht an die Fenstergröße und das Seitenverhältnis erinnert. Dadurch wird das Diagramm standardmäßig quadratisch.

Bei der zweiten Frage (wie andere bereits beantwortet haben) müssen Sie die Ausgabe auf die Festplatte leiten, bevor Sie Ihre Plotbefehle ausführen

pdf('filename.pdf')
plot( yourdata )
points (some_more_data)
dev.off() # to complete the writing process and return output to your monitor
Aaron McDaid
quelle
8

Wenn Sie R Studio http://rstudio.org/ verwenden, gibt es ein spezielles Menü, in dem Sie Ihren Plot in einem beliebigen Format und in einer beliebigen Auflösung speichern können

efstratios charitos
quelle
4
Dies ist zumindest auch in der R-GUI unter Windows vorhanden.
Richiemorrisroe
manchmal scheitert dies auf mysteriöse Weise für mich, aber das Aufrufen einer Funktion funktioniert immer
qwr
3

Wenn Sie ein Gerät mit öffnen png(), bmp(), pdf()usw. , wie vorgeschlagen Andrie (die beste Antwort), werden die Fenster mit Plots nicht Pop - up öffnen, nur * .png, * .bmp oder * .pdf - Dateien werden erstellt. Dies ist bei umfangreichen Berechnungen praktisch, da R nur eine begrenzte Anzahl von Grafikfenstern verarbeiten kann.

Wenn Sie jedoch die Diagramme anzeigen und auch speichern möchten, rufen Sie an, savePlot(filename, type)nachdem die Diagramme gezeichnet wurden und das Fenster mit ihnen aktiv ist.

Alex Fainshtein
quelle
0

Um diese Antworten zu ergänzen: Wenn Sie ein R-Skript haben, das Aufrufe enthält, die Diagramme für den Bildschirm generieren (das native Gerät), können diese alle in einer PDF-Datei (dem Standardgerät für eine nicht interaktive Shell) gespeichert werden. "Rplots.pdf "(der Standardname) durch Umleiten des Skripts vom Terminal nach R (vorausgesetzt, Sie verwenden Linux oder OS X), z.

R < myscript.R --no-save

Dies könnte nach Bedarf in jpg / png konvertiert werden

Waferthin
quelle
0

In einigen Fällen möchte man ein Basis-Plot sowohl speichern als auch drucken. Ich habe ein bisschen Zeit verbracht und mir diese Dienstprogrammfunktion ausgedacht:

x = 1:10

basesave = function(expr, filename, print=T) {
  #extension
  exten = stringr::str_match(filename, "\\.(\\w+)$")[, 2]

  switch(exten,
         png = {
           png(filename)
           eval(expr, envir = parent.frame())
           dev.off()
         },
         {stop("filetype not recognized")})


  #print?
  if (print) eval(expr, envir = parent.frame())

  invisible(NULL)
}

#plots, but doesn't save
plot(x)

#saves, but doesn't plot
png("test.png")
plot(x)
dev.off()

#both
basesave(quote(plot(x)), "test.png")

#works with pipe too
quote(plot(x)) %>% basesave("test.png")

Beachten Sie, dass man verwenden muss quote, sonst wird der plot(x)Aufruf in der globalen Umgebung ausgeführt und an NULLweitergeleitet basesave().

Deleet
quelle
0
dev.copy(png,'path/pngFile.png')
plot(YData ~ XData, data = mydata)
dev.off()
orientchen1978
quelle