关于r:如何将图表保存为磁盘上的图像?

How to save a plot as image on the disk?

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

有两个不同的问题:首先,我已经在看监视器上的情节了,我想把它原封不动地保存下来。其次,我还没有生成绘图,但是我想在执行绘图代码时直接将其保存到磁盘上。


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

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

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

  • 使用png()bmp()pdf()或类似工具打开设备。
  • 绘制模型
  • 使用dev.off()关闭设备
  • 将绘图保存到png文件的一些示例代码:

    1
    2
    3
    4
    5
    fit <- lm(some ~ model)

    png(filename="your/file/location/name.png")
    plot(fit)
    dev.off()

    这在图形格式?png?bmp?jpeg?tiff的(组合)帮助页以及?pdf的单独帮助页中进行了描述。

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

    请注意,如果您的绘图是由latticeggplot2绘制的,则必须显式打印绘图。请参阅这个更详细地解释这一点的答案,并链接到R FAQ:ggplot的qplot在采购时不执行。

    2。我目前正在屏幕上查看一个绘图,我想将其"原样"复制到磁盘上。

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

    这应该完美地复制图像,考虑到您对交互窗口所做的任何调整。与此答案的第一部分一样,您可以用其他文件类型(如png)替换pdf


    如果您想继续在R中查看绘图,另一种选择是使用dev.copy

    1
    2
    3
    4
    5
    X11 ()
    plot (x,y)

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

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


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

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

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


    这样地

    1
    2
    3
    png('filename.png')
    # make plot
    dev.off()

    或者这个

    1
    2
    3
    4
    # sometimes plots do better in vector graphics
    svg('filename.svg')
    # make plot
    dev.off()

    或者这个

    1
    2
    3
    pdf('filename.pdf')
    # make plot
    dev.off()

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


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

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

    您可以用其他格式(如png)替换pdf

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

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

    1
    2
    3
    4
    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/有一个特殊的菜单,可以将您的绘图保存为您喜欢的任何格式和您选择的任何分辨率。


    1
    2
    3
    4
    5
    6
    7
    plotpath<- file.path(path,"PLOT_name",paste("plot_",file,".png",sep=""))

    png(filename=plotpath)

    plot(x,y, main= file)

    dev.off()


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

    但是,如果要查看绘图并保存它们,请在绘制绘图并激活包含这些绘图的窗口后调用savePlot(filename, type)


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


    在某些情况下,您希望同时保存和打印基R图。我花了一点时间,想出了这个实用功能:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    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()


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

    1
    R < myscript.R --no-save

    必要时可转换成JPG/PNG格式。