如何将绘图作为图像保存在磁盘上?


304

我使用R绘制了一个简单的线性回归。我想将该图像另存为PNG或JPEG,是否可以自动执行?(通过代码)

有两个不同的问题:首先,我已经在监视器上查看该图了,我想按原样保存它。其次,我还没有生成绘图,但是我想在执行绘图代码时将其直接保存到磁盘。


也许应该对这个问题进行编辑,以询问两种不同的情况:首先,您可能正在交互工作,并创建了一个不错的图,希望保存。或者,第二,您还没有看到任何图,并且您希望不先查看就直接将其写入磁盘-如果您正在编写脚本来为您生成许多图,这将很有意义。我现在将对其进行编辑
Aaron McDaid 2014年

Answers:


376

有两个密切相关的问题,每个问题都有一个答案。


1.将来会在脚本中生成图像,如何将其保存到磁盘?

要保存图解,您需要执行以下操作:

  1. 打开设备,使用png()bmp()pdf()或类似
  2. 绘制模型
  3. 使用以下方法关闭设备 dev.off()

用于将绘图保存到png文件的一些示例代码:

fit <- lm(some ~ model)

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

这是在(组合)帮助页面的图形格式描述的?png?bmp?jpeg?tiff以及在用于单独的帮助页面?pdf

但是请注意,图像在磁盘上看起来与直接绘制到屏幕上的同一图不同,例如,如果您调整了屏幕上窗口的大小。


请注意,如果您的绘图是由任一人制作的,lattice或者ggplot2您必须显式打印该绘图。请参阅此答案,以更详细地说明此问题,并且还链接到R常见问题解答:ggplot的qplot在采购时不执行


2.我目前正在查看屏幕上的绘图,我想按原样将其复制到磁盘。

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

这应该完美地复制图像,同时考虑到您对交互式窗口所做的任何调整大小。您可以像在此答案的第一部分中pdf那样用其他文件类型替换png


4
如果您未设置路径,例如png(filename =“ name.png”),则可以使用getwd()
JuanPablo 2013年

2
我已将此答案扩展为包括对的引用dev.print。我认为有两个密切相关的问题需要不同的答案。第二个子问题基本上是“如何将已经绘制的图像保存到屏幕上?”。抱歉,如果我的编辑效果不是很好,请随时改进我的编辑。
亚伦·麦克戴德

当R要求“选择”时,我该怎么做?例如,如果我使用m3=garchFit(~arma(3,0)+garch(1,1))plot(m3)
雅各布

3
我如何保存dpi = 3000的图形
Abhishek

2
使用R的8年时间里,我不知道实际上可以将在屏幕上打开的dev保存到文件中。我想我不需要那个...但是非常感谢:D
Simon C.

82

如果您想继续查看R中的图,则可以使用dev.copy

X11 ()
plot (x,y)

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

如果在R中出现太多的绘图窗口,请使用graphics.off()来关闭所有绘图窗口。


2
好答案!这使您可以通过X来试验图,直到对结果满意为止,然后将其保存在现场。这通常是最方便的操作模式。
亚伦·麦克戴德

3
dev.print更好,因为它可以准确地从屏幕上复制图像。dev.copy强制每个图像默认为正方形。如果您可以很好地交互设置所有内容,这将令人沮丧
Aaron McDaid 2014年

4
我使用dev.print()width和height参数来定义尺寸。例如 dev.copy(device = png, filename = 'MyPlot.png', width = 1000, height = 500) dev.off()
斯科特(Scott)

72

如果使用ggplot2首选的保存方式,则使用ggsave。创建绘图后,首先必须绘图ggsave

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

图像的格式取决于您为文件名选择的扩展名。其他参数可以传递到ggsave,特别是widthheightdpi


这在循环中效果很好,dev.off不适用于我
princelySid

这样做的好处是一致的API,无需
费心

与的解决方案不同dev,此解决方案可在没有图形设备的虚拟机上工作。
miguelmorin

我希望对于R中的所有地块都有一个强大但简单的方法,无论如何,我的投票就在这里。
SilSur

1
仍然有效将近7年!谢谢。
尼克,

30

像这样

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

或这个

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

或这个

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

可能还有其他人。它们全部都列在帮助页面中。


R有什么方法可以自动推断文件扩展名(即基于函数)?必须更改文件名以及所使用的功能似乎很麻烦。
Bonlenfum 2015年

11

对于第一个问题,我发现dev.print在进行交互工作时最好。首先,您以视觉方式设置图表,对所看到的图像满意时,可以要求R将当前图表保存到磁盘

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

您可以替换pdf为其他格式,例如png

这将完全按照您在屏幕上看到的图像进行复制。问题dev.copy在于图像通常是不同的,并且不记得窗口的大小和宽高比-默认情况下,它会强制将图变为正方形。

对于第二个问题(因为其他人已经回答了),必须在执行绘图命令之前将输出定向到磁盘

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


3

如果您在使用开启装置png()bmp()pdf()等所建议Andrie(最好的答案),与地块窗口将不会弹出公开,公正* .png和* BMP或* .pdf文件将被创建。由于R只能处理有限数量的图形窗口,因此在进行大量计算时很方便。

但是,如果要查看图并保存它们,请savePlot(filename, type)在绘制图并且包含它们的窗口处于活动状态后调用。



0

要添加到这些答案中,如果您有一个R脚本,其中包含一些调用,这些调用会生成要在屏幕上显示的图(本机设备),那么所有这些都可以保存到pdf文件(非交互式外壳的默认设备)“ Rplots.pdf (默认名称),方法是将脚本从终端重定向到R(假设您正在运行linux或OS X),例如:

R < myscript.R --no-save

可以根据需要将其转换为jpg / png


0

在某些情况下,既要保存又要打印基本r图。我花了一些时间,想出了这个实用程序功能:

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

请注意,必须使用quote,否则该plot(x)调用将在全局环境中运行并NULL传递给basesave()


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.