Como salvar um gráfico como imagem no disco?

Eu traço uma regressão linear simples usando R. Eu gostaria de salvar essa imagem como PNG ou JPEG, é possível fazê-lo automaticamente? (via código)

Existem duas questões diferentes: Primeiro, eu já estou olhando para o gráfico no meu monitor e gostaria de salvá-lo como está. Em segundo lugar, eu ainda não criei o enredo, mas gostaria de salvá-lo diretamente no disco quando eu executar meu código de plotagem.

Há duas questões estreitamente relacionadas e uma resposta para cada uma delas.


1. Uma imagem será gerada no futuro no meu script, como eu salvo no disco?

Para salvar um gráfico, você precisa fazer o seguinte:

  1. Abra um dispositivo usando png() , bmp() , pdf() ou similar
  2. Plote seu modelo
  3. Feche o dispositivo usando dev.off()

Algum exemplo de código para salvar o gráfico em um arquivo png :

 fit < - lm(some ~ model) png(filename="your/file/location/name.png") plot(fit) dev.off() 

Isso é descrito na página de ajuda (combinada) para os formatos charts ?png ?bmp ?jpeg e ?tiff , bem como na página de ajuda separada para ?pdf .

No entanto, observe que a imagem pode parecer diferente no disco para o mesmo plotagem diretamente plotada na canvas, por exemplo, se você redimensionou a janela na canvas.


Note que se o seu enredo é feito por qualquer lattice ou ggplot2 você tem que imprimir explicitamente o enredo. Veja esta resposta que explica isso com mais detalhes e também links para o R FAQ: ggplot's qplot não executa em sourcing


2. Atualmente estou olhando para um gráfico na minha canvas e quero copiá-lo 'como está' para o disco.

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

Isso deve copiar a imagem perfeitamente, respeitando qualquer redimensionamento feito na janela interativa. Você pode, como na primeira parte desta resposta, replace o pdf por outros tipos de arquivos, como png .

Se você quiser continuar vendo o gráfico em R, outra opção é usar dev.copy :

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

Se você atingir uma confusão de muitas janelas de plotagem em R, use graphics.off() para fechar todas as janelas de plotagem.

Se você usar o ggplot2 a maneira preferida de salvar é usar ggsave . Primeiro você tem que traçar, depois de criar o enredo que você chama de ggsave :

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

O formato da imagem é determinado pela extensão escolhida para o nome do arquivo. parameters adicionais podem ser passados ​​para ggsave , notavelmente width , height e dpi .

Como isso

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

ou isto

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

ou isto

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

E provavelmente outros também. Eles estão todos listados juntos nas páginas de ajuda.

Para a primeira questão, acho dev.print para ser o melhor quando se trabalha de forma interativa. Primeiro, você configura seu enredo visualmente e, quando estiver satisfeito com o que vê, pode pedir a R para salvar o gráfico atual no disco.

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

Você pode replace o pdf por outros formatos, como png .

Isto irá copiar a imagem exatamente como você a vê na canvas. O problema com o dev.copy é que a imagem é frequentemente diferente e não lembra o tamanho da janela e a relação de aspecto – ela força o gráfico a ser quadrado por padrão.

Para a segunda questão, (como outros já responderam), você deve direcionar a saída para o disco antes de executar seus comandos de plotagem.

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

Se você usa o R Studio http://sofpt.miximages.com/plot/strong (a melhor resposta), as janelas com charts não aparecerão abertas, apenas .png, * bmp ou * .pdf arquivos serão criados. Isso é conveniente em cálculos maciços, já que o R pode manipular apenas um número limitado de janelas gráficas.

No entanto, se você quiser ver os charts e salvá-los, chame savePlot(filename, type) depois que os charts forem desenhados e a janela que os contém estiver ativa.

 plotpath< - file.path(path, "PLOT_name",paste("plot_",file,".png",sep="")) png(filename=plotpath) plot(x,y, main= file) dev.off() 

Para adicionar a essas respostas, se você tiver um script R contendo chamadas que geram charts para a canvas (o dispositivo nativo), todas elas podem ser salvas em um arquivo PDF (o dispositivo padrão para um shell não interativo) “Rplots.pdf “(o nome padrão), redirecionando o script para R do terminal (supondo que você está executando o Linux ou OS X), por exemplo:

 R < myscript.R --no-save 

Isso pode ser convertido para jpg / png conforme necessário

Em alguns casos, um quer salvar e imprimir um gráfico de base. Passei um pouco de tempo e desenvolvi esta function de utilidade:

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

Note que é necessário usar quote , caso contrário, a chamada plot(x) é executada no ambiente global e NULL é passada para basesave() .

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