我使用 R 绘制了一个简单的线性回归。我想将该图像保存为 PNG 或 JPEG,是否可以自动执行?(通过代码)
有两个不同的问题:首先,我已经在我的显示器上查看情节,我想按原样保存它。其次,我还没有生成绘图,但我想在执行绘图代码时直接将其保存到磁盘。
有两个密切相关的问题,每个问题都有一个答案。
要保存绘图,您需要执行以下操作:
png()
使用、bmp()
或pdf()
类似工具打开设备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's qplot does not execute on sourcing
dev.print(pdf, 'filename.pdf')
这应该完美地复制图像,尊重您对交互式窗口所做的任何调整。您可以像本答案的第一部分一样,将其替换pdf
为其他文件类型,例如png
.
如果您想继续查看 R 中的绘图,另一种选择是使用dev.copy
:
X11 ()
plot (x,y)
dev.copy(jpeg,filename="plot.jpg");
dev.off ();
如果您在 R 中遇到太多绘图窗口的混乱,请使用graphics.off()
关闭所有绘图窗口。
如果您使用ggplot2
首选的保存方式是使用ggsave
. 首先,您必须在创建您调用的绘图后进行绘图ggsave
:
ggplot(...)
ggsave("plot.png")
图像的格式由您为文件名选择的扩展名决定。其他参数可以传递给ggsave
,特别是width
,height
和dpi
。
像这样
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()
可能还有其他人。它们都列在帮助页面中。
对于第一个问题,我发现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
如果您使用 R Studio http://rstudio.org/,则有一个特殊菜单可以将您的绘图保存为您喜欢的任何格式和您选择的任何分辨率
如果您按照Andriepng()
的建议(最佳答案)使用、等打开设备bmp()
,带有绘图的窗口将不会弹出打开,只会创建 *.png、*bmp 或 *.pdf 文件。这在大量计算中很方便,因为 R 只能处理有限数量的图形窗口。pdf()
但是,如果您想查看绘图并保存它们,请savePlot(filename, type)
在绘制绘图并且包含它们的窗口处于活动状态后调用。
plotpath<- file.path(path, "PLOT_name",paste("plot_",file,".png",sep=""))
png(filename=plotpath)
plot(x,y, main= file)
dev.off()
为了补充这些答案,如果您有一个 R 脚本,其中包含生成屏幕图的调用(本机设备),那么这些都可以保存到 pdf 文件(非交互式外壳的默认设备)“Rplots.pdf "(默认名称)通过将脚本从终端重定向到 R(假设您正在运行 linux 或 OS X),例如:
R < myscript.R --no-save
这可以根据需要转换为 jpg/png
在某些情况下,一个人想要保存和打印一个基本的 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()