Come salvare una trama come immagine sul disco?


304

Traccio una semplice regressione lineare usando R. Vorrei salvare quell'immagine come PNG o JPEG, è possibile farlo automaticamente? (tramite codice)

Ci sono due domande diverse: in primo luogo, sto già guardando la trama sul mio monitor e vorrei salvarla così com'è. In secondo luogo, non ho ancora generato la trama, ma vorrei salvarla direttamente su disco quando eseguo il mio codice di stampa.


Forse questa domanda dovrebbe essere modificata per porre due scenari distinti: in primo luogo, potresti lavorare in modo interattivo e aver creato una trama piacevole che desideri salvare. Oppure, in secondo luogo, non hai ancora visto alcuna trama e vuoi scriverla direttamente sul disco senza prima guardarla - questo avrebbe senso se stessi scrivendo uno script per generare molte trame per te. Lo modificherò ora
Aaron McDaid,

Risposte:


376

Esistono due domande strettamente correlate e una risposta per ciascuna.


1. Un'immagine verrà generata in futuro nel mio script, come posso salvarla su disco?

Per salvare un grafico, è necessario effettuare le seguenti operazioni:

  1. Aprire un dispositivo, usando png(), bmp(), pdf()o simili
  2. Traccia il tuo modello
  3. Chiudi il dispositivo usando dev.off()

Qualche codice di esempio per salvare la trama in un pngfile:

fit <- lm(some ~ model)

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

Questo è descritto nella (combinato) pagina di aiuto per i formati grafici ?png, ?bmp, ?jpege ?tiffcosì come nella pagina di aiuto separata per ?pdf.

Si noti tuttavia che l'immagine potrebbe apparire diversa sul disco rispetto allo stesso grafico direttamente tracciato sullo schermo, ad esempio se è stata ridimensionata la finestra sullo schermo.


Nota che se la tua trama è fatta da uno dei due latticeo ggplot2devi stampare esplicitamente la trama. Vedi questa risposta che spiega questo in modo più dettagliato e si collega anche alle Domande frequenti su R: qplot di ggplot non viene eseguito su sourcing


2. Attualmente sto guardando una trama sul mio schermo e voglio copiarla "così com'è" sul disco.

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

Questo dovrebbe copiare l'immagine perfettamente, rispettando qualsiasi ridimensionamento che hai fatto alla finestra interattiva. È possibile, come nella prima parte di questa risposta, sostituire pdfcon altri tipi di file come png.


4
se non imposti il ​​percorso, come png (nomefile = "nome.png"), puoi conoscere la directory di salvataggio congetwd()
JuanPablo

2
Ho esteso questa risposta per includere un riferimento a dev.print. Ci sono due domande strettamente correlate che penso abbiano bisogno di risposte diverse. La seconda domanda secondaria è sostanzialmente "Come faccio a salvare un'immagine che ho già tracciato sul mio schermo?". Mi scuso se la mia modifica non è molto buona, sentiti libero di migliorare le mie modifiche.
Aaron McDaid,

Come posso fare questo quando R chiede una "Selezione"? Ad esempio, se uso m3=garchFit(~arma(3,0)+garch(1,1))e plot(m3).
Jacob

3
Come posso salvare la cifra con dpi = 3000
Abhishek,

2
8 anni usando R senza sapere che potrei effettivamente salvare lo sviluppatore aperto sul mio schermo in un file. Immagino di non averne bisogno ... ma grazie mille: D
Simon C.,

82

Se vuoi continuare a vedere la trama in R, un'altra opzione è usare dev.copy:

X11 ()
plot (x,y)

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

Se raggiungi un ingombro di troppe finestre della trama in R, usa graphics.off()per chiudere tutte le finestre della trama.


2
Bella risposta! Ciò ti consente di sperimentare grafici tramite X, fino a quando non sei soddisfatto dei risultati, e quindi salvarli sul posto. Questa è di solito la modalità operativa più conveniente.
Aaron McDaid l'

3
dev.printè meglio in quanto copia esattamente l'immagine dallo schermo. dev.copyimpone che ogni immagine sia quadrata per impostazione predefinita. Questo è frustrante se hai impostato tutto in modo interattivo
Aaron McDaid

4
Uso dev.print()i parametri di larghezza e altezza per definire le dimensioni. ad es. dev.copy(device = png, filename = 'MyPlot.png', width = 1000, height = 500) dev.off()
Scott,

72

Se si utilizza ggplot2il modo preferito di salvataggio è utilizzare ggsave. Per prima cosa devi tracciare, dopo aver creato la trama che chiami ggsave:

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

Il formato dell'immagine è determinato dall'estensione scelta per il nome file. Ulteriori parametri possono essere passati a ggsave, in particolare width, heighte dpi.


Funziona bene in un ciclo, dev.off non ha funzionato per me
principescoSid

il lato positivo di questo è l'API coerente e non c'è bisogno di pasticciare con l'accensione e lo spegnimento dei dispositivi
qwr

A differenza delle soluzioni con dev, questa soluzione ha funzionato su una macchina virtuale senza dispositivi grafici.
miguelmorin,

Vorrei che ci fosse un approccio potente ma semplice come questo per TUTTE le trame in R. Comunque, il mio voto va qui.
SilSur,

1
Ancora valido quasi 7 anni dopo! Grazie.
Nick,

30

Come questo

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

o questo

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

o questo

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

E probabilmente anche altri. Sono tutti elencati insieme nelle pagine della guida.


Esiste un modo per R di dedurre automaticamente l'estensione del file (cioè in base alla funzione)? Sembra noioso dover cambiare il nome del file e la funzione utilizzata.
Bonlenfum,

11

Per la prima domanda, trovo dev.printdi essere il migliore quando si lavora in modo interattivo. Innanzitutto, imposti la trama visivamente e quando sei soddisfatto di ciò che vedi, puoi chiedere a R di salvare la trama corrente su disco

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

È possibile sostituire pdfcon altri formati come png.

Questo copierà l'immagine esattamente come la vedi sullo schermo. Il problema dev.copyè che l'immagine è spesso diversa e non ricorda le dimensioni della finestra e le proporzioni: impone che la trama sia quadrata per impostazione predefinita.

Per la seconda domanda, (come altri hanno già risposto), è necessario indirizzare l'output su disco prima di eseguire i comandi di stampa

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

8

Se usi R Studio http://rstudio.org/ c'è un menu speciale per salvare la trama come qualsiasi formato ti piace e con qualsiasi risoluzione tu scelga


4
Questo esiste anche nella R GUI su Windows, almeno.
richiemorrisroe,

a volte questo misteriosamente fallisce per me, ma chiamare una funzione funziona sempre
qwr

3

Se si apre un dispositivo utilizzando png(), bmp(), pdf()ecc come suggerito da Andrie (la migliore risposta), le finestre con trame non saranno pop-up aperta, basta * .png, * .bmp o * verranno creati file .pdf. Ciò è utile nei calcoli di massa, poiché R può gestire solo un numero limitato di finestre grafiche.

Tuttavia, se si desidera visualizzare i grafici e salvarli, chiamare savePlot(filename, type)dopo che i grafici sono stati disegnati e la finestra che li contiene è attiva.



0

Per aggiungere a queste risposte, se si dispone di uno script R contenente chiamate che generano grafici sullo schermo (il dispositivo nativo), è possibile salvarli tutti in un file pdf (il dispositivo predefinito per una shell non interattiva) "Rplots.pdf "(il nome predefinito) reindirizzando lo script in R dal terminale (supponendo che si stia eseguendo Linux o OS X), ad esempio:

R < myscript.R --no-save

Questo potrebbe essere convertito in jpg / png se necessario


0

In alcuni casi si desidera salvare e stampare un diagramma di base. Ho trascorso un po 'di tempo e mi è venuta in mente questa funzione di utilità:

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

Si noti che è necessario utilizzare quote, altrimenti la plot(x)chiamata viene eseguita nell'ambiente globale e NULLviene passata basesave().


0
dev.copy(png,'path/pngFile.png')
plot(YData ~ XData, data = mydata)
dev.off()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.