con - salvare grafici r




Come salvare un grafico come immagine sul disco? (8)

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 tracciamento.


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 di aiuto.


In alcuni casi si vuole salvare e stampare una trama di base r. Ho passato un po 'di tempo e ho trovato 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 il quote , altrimenti la chiamata plot(x) viene eseguita nell'ambiente globale e NULL viene passato a basesave() .


Per la prima domanda, trovo che dev.print è il migliore quando si lavora in modo interattivo. Innanzitutto, imposta visivamente la tua trama e quando sei soddisfatto di ciò che vedi, puoi chiedere a R di salvare la trama corrente sul disco

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

Puoi sostituire il pdf con altri formati come png .

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

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

Se apri un dispositivo usando png() , bmp() , pdf() ecc. Come suggerito da Andrie (la migliore risposta), le finestre con i grafici non appariranno aperte, solo * .png, * bmp o * .pdf i file verranno creati. Questo è utile in massicci calcoli, dal momento che R può gestire solo un numero limitato di finestre grafiche.

Tuttavia, se vuoi vedere i grafici e salvarli, chiama savePlot(filename, type) dopo che i grafici sono stati disegnati e la finestra che li contiene è attiva.


Se utilizzi ggplot2 il modo migliore per salvare è 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 , height e dpi .


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 si raggiunge un ammasso di troppe finestre di trama in R, utilizzare graphics.off() per chiudere tutte le finestre di trama.


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

plotpath<- file.path(path, "PLOT_name",paste("plot_",file,".png",sep=""))

png(filename=plotpath)

plot(x,y, main= file)

dev.off()




r-faq