【问题标题】:How to save a plot as image on the disk?如何将绘图保存为磁盘上的图像?
【发布时间】:2011-10-31 22:16:50
【问题描述】:

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

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

【问题讨论】:

  • 也许应该编辑这个问题以询问两个不同的场景:首先,您可能正在交互式工作并创建了一个您希望保存的漂亮图。或者,第二,您还没有看到任何绘图,并且您想直接将其写入磁盘而不先查看它 - 如果您正在编写脚本来为您生成许多绘图,这将是有意义的。我现在就编辑它

标签: r plot ggplot2 lattice r-faq


【解决方案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()

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

【讨论】:

  • R 有没有办法自动推断文件扩展名(即基于函数)?必须更改文件名以及使用的功能似乎很乏味。
【解决方案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 的单独帮助页面中进行了描述。

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


请注意,如果您的绘图是由 latticeggplot2 制作的,则您必须明确打印该绘图。请参阅此答案以更详细地解释这一点,并链接到 R 常见问题解答:ggplot's qplot does not execute on sourcing


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

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

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

【讨论】:

  • 如果不设置路径,比如png(filename="name.png"),可以用getwd()知道保存的目录
  • 我已扩展此答案以包含对 dev.print 的引用。我认为有两个密切相关的问题需要不同的答案。第二个子问题基本上是“如何保存已经绘制到屏幕上的图像?”。抱歉,如果我的编辑不是很好,请随时改进我的编辑。
  • 当 R 要求“选择”时我该怎么做?例如,如果我使用 m3=garchFit(~arma(3,0)+garch(1,1))plot(m3)
  • 如何使用 dpi=3000 保存图形
  • 使用 R 8 年,但我并不知道我实际上可以将在我的屏幕上打开的开发文件保存在一个文件中。我想我不需要那个......但非常感谢:D
【解决方案3】:

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

【讨论】:

  • 这至少也存在于 Windows 的 R GUI 中。
  • 有时这对我来说神秘地失败了,但调用函数总是有效的
【解决方案4】:

如果你想继续看到 R 中的情节,另一种选择是使用dev.copy

X11 ()
plot (x,y)

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

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

【讨论】:

  • 很好的答案!这使您可以通过 X 对绘图进行试验,直到您对结果感到满意,然后当场保存它们。这通常是最方便的操作模式。
  • dev.print 更好,因为它可以准确地从屏幕复制图像。 dev.copy 默认情况下强制每个图像为正方形。如果您以交互方式很好地设置了所有内容,这会令人沮丧
  • 我使用带有宽度和高度参数的dev.print() 来定义尺寸。例如dev.copy(device = png, filename = 'MyPlot.png', width = 1000, height = 500) dev.off()
【解决方案5】:

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

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

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

【讨论】:

  • 这在循环中运行良好,dev.off 对我不起作用
  • 这样做的好处是 API 一致,无需搞乱打开和关闭设备
  • dev 的解决方案不同,此解决方案可以在没有图形设备的虚拟机上运行。
  • 我希望在 R 中的所有地块都有一个强大而简单的方法。无论如何,我的投票就在这里。
  • 仍然有效近 7 年!谢谢。
【解决方案6】:

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

【讨论】:

    【解决方案7】:

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

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

    【讨论】:

      【解决方案8】:

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

      R < myscript.R --no-save
      

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

      【讨论】:

        【解决方案9】:
        plotpath<- file.path(path, "PLOT_name",paste("plot_",file,".png",sep=""))
        
        png(filename=plotpath)
        
        plot(x,y, main= file)
        
        dev.off()
        

        【讨论】:

        【解决方案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")
        

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

        【讨论】:

          【解决方案11】:
          dev.copy(png,'path/pngFile.png')
          plot(YData ~ XData, data = mydata)
          dev.off()
          

          【讨论】:

            猜你喜欢
            • 2020-05-10
            • 1970-01-01
            • 2016-09-30
            • 1970-01-01
            • 2015-06-23
            • 1970-01-01
            相关资源
            最近更新 更多