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

350
我用R绘制了一个简单的线性回归图。我想将该图像保存为PNG或JPEG格式。是否可以通过代码自动完成这个操作?
有两个不同的问题:首先,我已经在我的显示器上查看了这个图像,并且希望将其保存为原样。其次,我还没有生成这个图像,但是我希望在执行绘图代码时直接将其保存到磁盘上。

1
也许这个问题应该被编辑成询问两种不同的情况:首先,您可能正在交互式地工作,并创建了一个漂亮的图形,希望将其保存。或者,第二种情况是您还没有看到任何图形,想要直接将其写入磁盘而不先查看它——如果您正在编写一个为您生成多个图形的脚本,这是有意义的。我现在会进行编辑。 - Aaron McDaid
11个回答

424

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


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帮助页面。

请注意,如果您调整了屏幕上的窗口大小,则磁盘上的图像可能与直接绘制到屏幕的相同情节看起来不同。


请注意,如果您的情节是由latticeggplot2创建的,则必须明确打印情节。请参见此答案,其中更详细地解释了这一点,并链接到R常见问题解答:ggplot's qplot does not execute on sourcing


2.我现在正在查看屏幕上的情节,我想将其“原样”复制到磁盘。

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

这应该可以完美地复制图像,尊重您对交互窗口所做的任何调整。您可以像答案的第一部分那样,将 pdf 替换为其他文件类型,例如 png


5
如果你没有设置路径,例如png(filename="name.png"),你可以使用getwd()来知道保存的目录。 - JuanPablo
2
我已经扩展了这个答案,包括对dev.print的引用。我认为有两个密切相关的问题需要不同的答案。第二个子问题基本上是“如何保存我已经绘制到屏幕上的图像?”如果我的编辑不太好,请随意改进我的编辑。 - Aaron McDaid
当R要求“选择”时,我该怎么做?例如,如果我使用m3=garchFit(~arma(3,0)+garch(1,1))plot(m3) - jacob
3
如何以 dpi=3000 的分辨率保存图片? - Abhishek
2
使用R已经8年了,却不知道我可以将开发界面保存到文件中。我猜我并不需要那个...但还是非常感谢:D - Simon C.

92

如果您想在R中继续查看图形,另一种选择是使用 dev.copy

X11 ()
plot (x,y)

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

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


2
很棒的答案!这使您可以通过X实验绘图,直到您对结果满意,然后立即保存它们。这通常是最方便的操作模式。 - Aaron McDaid
3
dev.print 更好,因为它可以精确地从屏幕上复制图像。dev.copy 默认强制每个图像��是正方形的。如果你已经通过交互式方式设置好了所有内容,这会让人感到沮丧。 - Aaron McDaid
5
我使用dev.print()函数,并使用宽度和高度参数来定义尺寸,例如: dev.copy(device = png, filename = 'MyPlot.png', width = 1000, height = 500) dev.off() - Scott

85

如果您使用ggplot2,最好的保存方式是使用ggsave。首先绘制图形,创建完图形后调用ggsave

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

图片格式由您为文件名选择的扩展名确定。可以向 ggsave 传递其他参数,特别是 width, height, 和 dpi


这在循环中运行良好,dev.off 对我无效。 - princelySid
这样做的好处是API一致,不需要去烦恼开启和关闭设备。 - qwr
1
与使用“dev”解决方案不同,此解决方案可在没有图形设备的虚拟机上运行。 - miguelmorin
我希望在R中所有的图表都有这样强大而简单的方法。无论如何,我的投票在这里。 - SilSur
1
七年过去了,它仍然有效!谢谢。 - Nick

31

就像这样

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

还有可能有其他的问题。它们都在帮助页面中一起列出。


1
R是否有自动推断文件扩展名的方法(即基于函数)?必须更改文件名和使用的函数似乎很繁琐。 - Bonlenfum

12

对于第一个问题,我发现当进行交互式工作时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

8
如果您使用R Studio,可以通过特殊菜单将绘图保存为任何格式,并选择任何分辨率。 http://rstudio.org/

4
在Windows上的R GUI中,这也是存在的,至少如此。 - richiemorrisroe
有时候这对我来说会神秘地失败,但调用一个函数总是有效的。 - qwr

4
如果你使用png()bmp()pdf()等函数打开设备,如Andrie(最佳答案)所建议的那样,图形窗口将不会弹出,只会创建*.png、*bmp或*.pdf文件。这在大规模计算中非常方便,因为R只能处理有限数量的图形窗口。
然而,如果你想查看绘图并保存它们,请在绘制图形并激活包含它们的窗口后调用savePlot(filename, type)函数。

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

png(filename=plotpath)

plot(x,y, main= file)

dev.off()

以上提到的内容和http://www.r-bloggers.com/automatically-save-your-plots-to-a-folder/的结合对我很有帮助! - Gijs

0
补充一下这些答案,如果您有一个包含调用生成屏幕图的R脚本(本地设备)的脚本,则可以通过从终端将脚本重定向到R(假设您正在运行Linux或OS X),将所有这些内容保存到pdf文件(非交互式shell的默认设备)“Rplots.pdf”(默认名称),例如:
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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接