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

How can I save a plot as an image on the disk?

提问人:blakc05 提问时间:8/22/2011 最后编辑:Peter Mortensenblakc05 更新时间:10/31/2023 访问量:439657

问:

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

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

R ggplot2 晶格 r-faq

评论


答:

31赞 Owen 8/22/2011 #1

喜欢这个

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赞 Bonlenfum 11/5/2015
R有没有办法自动推断文件扩展名(即基于函数)?必须更改文件名以及使用的功能似乎很乏味。
424赞 Andrie 8/22/2011 #2

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


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

但请注意,图像在磁盘上的外观可能与直接打印到屏幕上的相同绘图不同,例如,如果您调整了屏幕窗口的大小。


请注意,如果您的绘图是由其中任何一个制作的,则必须显式打印该绘图。请参阅此答案,其中更详细地解释了这一点,并链接到 R 常见问题解答: ggplot 的 qplot 不会在采购时执行latticeggplot2


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

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

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

评论

5赞 JuanPablo 7/16/2013
如果你没有设置路径,比如 png(filename=“name.png”),你可以知道保存的目录getwd()
2赞 Aaron McDaid 8/27/2015
我扩展了这个答案,包括对 .我认为有两个密切相关的问题需要不同的答案。第二个子问题基本上是“如何将我已经绘制的图像保存到屏幕上?如果我的编辑不是很好,很抱歉,请随时改进我的编辑。dev.print
0赞 jacob 1/25/2016
当 R 要求“选择”时,我该怎么做?例如,如果我使用 和 .m3=garchFit(~arma(3,0)+garch(1,1))plot(m3)
3赞 Abhishek 10/25/2017
如何保存dpi=3000的数字
2赞 Simon C. 10/10/2018
使用 R 8 年,却不知道我实际上可以将屏幕上打开的开发人员保存在文件中。我想我不需要那个......但非常感谢:D
8赞 efstratios charitos 8/22/2011 #3

如果您使用 RStudio,则有一个特殊菜单可以将绘图保存为您喜欢的任何格式和您选择的任何分辨率。

评论

4赞 richiemorrisroe 9/1/2011
至少在 Windows 上的 R GUI 中也存在这一点。
0赞 qwr 4/4/2019
有时这对我来说会神秘地失败,但调用函数总是有效的
93赞 Itamar 9/1/2011 #4

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

X11 ()
plot (x,y)

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

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

评论

2赞 Aaron McDaid 11/8/2013
很好的答案!这允许您通过 X 对绘图进行试验,直到您对结果感到满意,然后当场保存它们。这通常是最方便的操作模式。
3赞 Aaron McDaid 9/2/2014
dev.print更好,因为它完全从屏幕上复制图像。 默认情况下,强制每个图像都是方形的。如果您以交互方式很好地设置了所有内容,这将是令人沮丧的dev.copy
5赞 Scott 4/2/2015
我使用 width 和 height 参数来定义尺寸。例如dev.print()dev.copy(device = png, filename = 'MyPlot.png', width = 1000, height = 500) dev.off()
86赞 Paul Hiemstra 11/17/2012 #5

如果使用首选的保存方式是使用 .首先你必须绘图,在创建绘图后,你调用:ggplot2ggsaveggsave

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

图像的格式由您为文件名选择的扩展名决定。其他参数可以传递给 ,特别是 、 和 。ggsavewidthheightdpi

评论

0赞 princelySid 1/18/2017
这在循环中效果很好,dev.off 对我不起作用
0赞 qwr 4/4/2019
这样做的好处是一致的 API,无需打开和关闭设备
1赞 miguelmorin 5/29/2019
与 的解决方案不同,此解决方案在没有图形设备的虚拟机上运行。dev
0赞 SilSur 7/4/2019
我希望 R 中的所有图都有一种强大而简单的方法。无论如何,我的投票在这里。
1赞 Nick 9/3/2019
仍然有效将近 7 年!谢谢。
12赞 Aaron McDaid 9/2/2014 #6

对于第一个问题,我发现在交互式工作时是最好的。首先,你直观地设置你的绘图,当你对你所看到的内容感到满意时,你可以要求 R 将当前绘图保存到磁盘上dev.print

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

您可以替换为其他格式,例如 .pdfpng

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

对于第二个问题(正如其他人已经回答的那样),在执行打印命令之前,必须将输出定向到磁盘

pdf('filename.pdf')
plot( yourdata )
points (some_more_data)
dev.off() # to complete the writing process and return output to your monitor
4赞 Alex Fainshtein 3/10/2015 #7

如果您按照 Andrie 的建议(最佳答案)使用 、 等打开设备,则不会弹出带有绘图的窗口,只会创建 *.png、*bmp 或 *.pdf 文件。这在大规模计算中很方便,因为 R 只能处理有限数量的图形窗口。png()bmp()pdf()

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

0赞 waferthin 6/10/2015 #8

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

R < myscript.R --no-save

这可以根据需要转换为 JPEGPNG

3赞 Gijs 12/23/2015 #9
plotpath<- file.path(path, "PLOT_name", paste("plot_", file, ".png", sep=""))

png(filename=plotpath)

plot(x, y, main=file)

dev.off()

评论

0赞 Gijs 12/23/2015
上面提到的和 r-bloggers.com/automatically-save-your-plots-to-a-folder 的结合 它为我工作!
0赞 CoderGuy123 1/14/2017 #10

在某些情况下,人们希望同时保存和打印基本 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")

请注意,必须使用 ,否则调用将在全局环境中运行并传递给 。quoteplot(x)NULLbasesave()

-1赞 orientchen1978 3/17/2017 #11
dev.copy(png,'path/pngFile.png')
plot(YData ~ XData, data = mydata)
dev.off()

评论

0赞 Peter Mortensen 10/31/2023
解释是有序的。
0赞 Peter Mortensen 10/31/2023
好的,OP已经离开了大楼:“最后一次露面是在2年多以前”
0赞 Peter Mortensen 10/31/2023
也许其他人可以敲响它?这是假答案还是假的?