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

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

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

414782 次浏览

像这样

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. 一个图像将在未来生成在我的脚本,我如何将它保存到磁盘?

要保存一个plot,你需要做以下操作:

  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& #39;s qplot不执行源


2. 我目前在我的屏幕上看一个情节,我想复制它“原样”到磁盘。

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

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

如果你使用R Studio http://rstudio.org/,有一个特殊的菜单可以将你的图保存为你喜欢的任何格式和你选择的任何分辨率

如果你想继续在R中看到这个图形,另一个选项是使用dev.copy:

X11 ()
plot (x,y)


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

如果你在R中遇到太多的plot窗口,使用graphics.off()关闭所有的plot窗口。

如果你使用ggplot2,首选的保存方式是使用ggsave。首先,你必须绘制,在创建你称为ggsave的绘图之后:

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

图像的格式由您为文件名选择的扩展名决定。附加参数可以传递给ggsave,特别是widthheightdpi

对于第一个问题,我发现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

如果你使用png()bmp()pdf()等打开一个设备,如< em > Andrie < / em >(最佳答案)所建议的,带有图的窗口将不会弹出打开,只会创建*.png, *bmp或*.pdf文件。这在大量计算中很方便,因为R只能处理有限数量的图形窗口。

然而,如果你想看到这些图并保存它们,在绘制了这些图并且包含它们的窗口处于活动状态后调用savePlot(filename, type)

为了补充这些答案,如果您有一个R脚本,其中包含为屏幕(本机设备)生成图形的调用,那么这些都可以保存到pdf文件(非交互式shell的默认设备)中。“Rplots.pdf”(默认名称)通过将脚本从终端重定向到R(假设您运行的是linux或OS X),例如:

R < myscript.R --no-save

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

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


png(filename=plotpath)


plot(x,y, main= file)


dev.off()

在某些情况下,人们希望既保存又打印底数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()

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