首页 文章

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

提问于
浏览
263

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

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

11 回答

  • 0

    像这样

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

    也许还有其他人 . 它们都在帮助页面中列出 .

  • 334

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

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

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

  • 54
    plotpath<- file.path(path, "PLOT_name",paste("plot_",file,".png",sep=""))
    
    png(filename=plotpath)
    
    plot(x,y, main= file)
    
    dev.off()
    
  • 0

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

  • 11

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

    R < myscript.R --no-save
    

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

  • 2

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

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

  • 27
    dev.copy(png,'path/pngFile.png')
    plot(YData ~ XData, data = mydata)
    dev.off()
    
  • 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() .

  • 2

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


    1.将来会在我的脚本中生成一个图像,如何将其保存到磁盘?

    要保存绘图,您需要执行以下操作:

    • 使用 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 的单独帮助页面中进行了描述 .

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


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


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

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

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

  • 72

    对于第一个问题,我发现 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中的情节,另一种选择是使用 dev.copy

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

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

相关问题