Como salvar um gráfico como imagem no disco?

304

Eu planto 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)

Há duas perguntas diferentes: Primeiro, eu já estou vendo o gráfico no meu monitor e gostaria de salvá-lo como está. Segundo, ainda não gerei o gráfico, mas gostaria de salvá-lo diretamente em disco ao executar meu código de plotagem.

blakc05
fonte
Talvez essa pergunta deva ser editada para perguntar sobre dois cenários distintos: Primeiro, você pode estar trabalhando interativamente e ter criado um bom enredo que deseja salvar. Ou, segundo, você ainda não viu nenhum enredo e deseja gravá-lo diretamente no disco sem vê-lo primeiro - isso faria sentido se você estivesse escrevendo um script para gerar muitos enredos para você. Vou editá-lo agora
Aaron McDaid 02/09

Respostas:

376

Existem duas perguntas estreitamente relacionadas e uma resposta para cada uma.


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

Para salvar uma plotagem, faça o seguinte:

  1. Abrir um dispositivo, usando png(), bmp(), pdf()ou semelhante
  2. Traçar seu modelo
  3. Feche o dispositivo usando dev.off()

Alguns exemplos de código para salvar a plotagem em um pngarquivo:

fit <- lm(some ~ model)

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

Isto é descrito na página de ajuda (combinados) para os formatos gráficos ?png, ?bmp, ?jpege ?tiff, bem como na página de ajuda separado para ?pdf.

Observe, no entanto, que a imagem pode parecer diferente no disco para o mesmo gráfico plotado diretamente na tela, por exemplo, se você redimensionou a janela na tela.


Observe que, se o seu plot for feito por um latticeou ggplot2você tiver que imprimi-lo explicitamente. Veja esta resposta que explica isso com mais detalhes e também links para a FAQ R: O qplot do ggplot não é executado na fonte


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

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

Isso deve copiar a imagem perfeitamente, respeitando qualquer redimensionamento que você tenha feito na janela interativa. Você pode, como na primeira parte desta resposta, substituir pdfpor outros tipos de arquivos como png.

Andrie
fonte
4
Se você não definir o caminho, como png (filename = "Name.png"), você pode saber o diretório de salvar comgetwd()
juanpablo
2
Estendi esta resposta para incluir uma referência a dev.print. Há duas perguntas intimamente relacionadas que, penso, precisam de respostas diferentes. A segunda sub-pergunta é basicamente "Como salvar uma imagem que já plotei na minha tela?". Desculpas se minha edição não for muito boa, fique à vontade para melhorar minhas edições.
Aaron McDaid
Como faço isso quando R pede uma "Seleção"? Por exemplo, se eu usar m3=garchFit(~arma(3,0)+garch(1,1))e plot(m3).
27416
3
Como posso salvar a figura com dpi = 3000
Abhishek 25/10
2
8 anos usando R sem saber que eu realmente poderia salvar o desenvolvedor aberto na minha tela em um arquivo. Acho que não precisava disso ... mas muito obrigado: D
Simon C.
82

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

X11 ()
plot (x,y)

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

Se você encontrar muitas janelas de plotagem em R, use graphics.off()para fechar todas as janelas de plotagem.

Itamar
fonte
2
Ótima resposta! Isso permite que você experimente plotagens via X, até ficar satisfeito com os resultados e salve-as no local. Este é geralmente o modo mais conveniente de operação.
Aaron McDaid
3
dev.printé melhor, pois copia a imagem exatamente da tela. dev.copyforça todas as imagens a ficarem quadradas por padrão. Isso é frustrante se você configurou tudo de maneira bem interativa
Aaron McDaid
4
Eu uso dev.print()com os parâmetros width e height para definir as dimensões. por exemplo dev.copy(device = png, filename = 'MyPlot.png', width = 1000, height = 500) dev.off()
Scott
72

Se você usar ggplot2a maneira preferida de economizar é usar ggsave. Primeiro você precisa plotar, depois de criar o gráfico que você chama ggsave:

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

O formato da imagem é determinado pela extensão que você escolher para o nome do arquivo. Os parâmetros adicionais podem ser passados para ggsave, nomeadamente width, heighte dpi.

Paul Hiemstra
fonte
Isso funciona bem em um loop, dev.off não funcionou para mim
princelySid
o lado positivo disso é a API consistente e não há necessidade de mexer com ligar e desligar dispositivos
QWR
Diferentemente das soluções dev, essa solução funcionava em uma máquina virtual sem dispositivos gráficos.
Miguelmorin 29/05/19
Eu gostaria que houvesse uma abordagem poderosa, mas simples, como esta para TODAS as parcelas em R. De qualquer forma, meu voto é aqui.
SilSur
1
Ainda válido quase 7 anos depois! Obrigado.
Nick
30

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.

Owen
fonte
Existe alguma maneira de o R inferir a extensão do arquivo automaticamente (ou seja, com base na função)? Parece tedioso ter que mudar o nome do arquivo, bem como a função usada.
Bonlenfum
11

Para a primeira pergunta, acho dev.printo melhor ao trabalhar interativamente. Primeiro, você configura sua plotagem visualmente e, quando estiver satisfeito com o que vê, pode pedir ao R para salvar a plotagem atual em disco.

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

Você pode substituir pdfpor outros formatos, comopng .

Isso copiará a imagem exatamente como você a vê na tela. O problema comdev.copy é que a imagem geralmente é diferente e não se lembra do tamanho da janela e da proporção - ela força o gráfico a ficar quadrado por padrão.

Para a segunda pergunta (como outras pessoas 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
Aaron McDaid
fonte
8

Se você usa o R Studio http://rstudio.org/, existe um menu especial para salvar sua plotagem no formato que desejar e em qualquer resolução que você escolher

efstratios charitos
fonte
4
Isso também existe na GUI R no Windows, pelo menos.
Richiemorrisroe #
às vezes isso falhar misteriosamente para mim, mas chamar uma função sempre funciona
QWR
3

Se você abrir um dispositivo usando png(), bmp(), pdf()etc., como sugerido por Andrie (a melhor resposta), as janelas com parcelas não vai aparecer aberta, apenas * .png, * bmp ou arquivos * .pdf será criado. Isso é conveniente em cálculos massivos, já que o R pode lidar apenas com um número limitado de janelas gráficas.

No entanto, se você quiser ver os gráficos e também salvá-los, ligue savePlot(filename, type)depois que os gráficos forem desenhados e a janela que os contiver estiver ativa.

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

png(filename=plotpath)

plot(x,y, main= file)

dev.off()
Gijs
fonte
uma combinação do que é mencionado acima e r-bloggers.com/automatically-save-your-plots-to-a-folder Funcionou para mim!
Gijs
0

Para adicionar essas respostas, se você tiver um script R contendo chamadas que geram plotagens para a tela (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 a partir do terminal (supondo que você esteja executando o Linux ou OS X), por exemplo:

R < myscript.R --no-save

Isso pode ser convertido em jpg / png, conforme necessário

waferthin
fonte
0

Em alguns casos, deseja-se salvar e imprimir um gráfico de base r. Passei um pouco de tempo e criei esta função de utilitário:

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

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

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