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

问题描述 投票:0回答:11

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

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

r plot ggplot2 lattice r-faq
11个回答
422
投票

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


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

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

  1. 使用
    png()
    bmp()
    pdf()
    或类似工具打开设备
  2. 绘制你的模型
  3. 使用
    dev.off()
  4. 关闭设备

将绘图保存到

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 notexecute on commerce


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

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

这应该完美地复制图像,尊重您对交互式窗口所做的任何大小调整。您可以像本答案的第一部分一样,将

pdf
替换为其他文件类型,例如
png


92
投票

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

dev.copy

X11 ()
plot (x,y)

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

如果 R 中的绘图窗口过多而混乱,请使用

graphics.off()
关闭所有绘图窗口。


84
投票

如果您使用

ggplot2
,首选的保存方式是使用
ggsave
。首先你必须绘图,创建绘图后你称之为
ggsave
:

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

图像的格式由您为文件名选择的扩展名决定。其他参数可以传递给

ggsave
,特别是
width
height
dpi


31
投票

像这样

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

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


12
投票

对于第一个问题,我发现

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 Studio http://rstudio.org/ 有一个特殊的菜单可以将绘图保存为您喜欢的任何格式并以您选择的任何分辨率


4
投票

如果您按照

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

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

savePlot(filename, type)


3
投票
plotpath<- file.path(path, "PLOT_name",paste("plot_",file,".png",sep=""))

png(filename=plotpath)

plot(x,y, main= file)

dev.off()

0
投票

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

R < myscript.R --no-save

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


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


0
投票
dev.copy(png,'path/pngFile.png')
plot(YData ~ XData, data = mydata)
dev.off()
© www.soinside.com 2019 - 2024. All rights reserved.