保存 Rstudio 面板中已经存在的所有图
Save all plots already present in the panel of Rstudio
我为一个项目制作了不同的情节(超过一百个),但我没有在途中捕捉到它们(是的,这很糟糕,我知道)。现在,我需要一次将它们全部保存,但不需要再次 运行ning 我的脚本(这需要几个小时)。有没有办法在 Rstudio 中这样做?
编辑:所有的情节都已经存在了,我不想再运行它们了。
如果您输入以下功能,所有后续操作都将保存在一个文档中:
pdf("nameofthedocument.pdf")
plot(x~y)
plot(...
dev.off()
您还可以使用 tiff()、jpg()...请参阅 ?pdf
如果您的绘图是 3d,您可以拍摄所有绘图的快照并将它们保存为 .png 文件格式。
snapshot3d(filename = '../Plots/SnapshotPlots.png', fmt = 'png')
否则,最好的方法是使用 par(mfrow)
函数创建多面板绘图 window。尝试以下
plotsPath = "../Plots/allPlots.pdf"
pdf(file=plotsPath)
for (x in seq(1,100))
{
par(mfrow = c(2,1))
p1=rnorm(x)
p2=rnorm(x)
plot(p1,p2)
}
dev.off()
您还可以使用 png
、bmp
、tiff
和 jpeg
函数代替 pdf
。你可以看看他们的优缺点,选择你认为对你的需求好的。
虽然这个讨论已经有一段时间不活跃了,但有些人,比如我,仍然遇到同样的问题,而其他解决方案似乎并没有真正理解真正的问题是什么。
那么,动手吧。你的情节历史被保存在一个名为 .SavedPlots
的变量中。您可以直接访问它,将其分配给代码中的另一个变量,或者从图中执行后者 window.
# ph for plot history
ph <- .SavedPlots
在 R 3.4.2 中,我可以索引 ph
以在设备中重现相应的绘图。接下来的内容相当简单:
- 打开新设备(png、jpeg、pdf...)。
- 重现你的剧情
ph[index_of_plot_in_history]
.
- 关闭设备(如果是多页pdf则继续打印)。
示例:
for(i in 1:lastplot) {
png('plotname.png')
print(ph[i])
dev.off()
}
注意:有时这不会发生,因为编程不当。例如,我使用 MICE 包来估算具有大量变量的许多数据集,并按照 this paper 的第 4.3 节中所示进行绘图。问题是,每个图只显示三个变量,如果我在代码中使用 png 设备,则只会保存每个数据集的最后一个图。但是,如果将图打印到 window,每个数据集的所有图都会被记录下来。
在 RStudio 中,每个会话都有一个临时目录,可以使用 tempdir()
获得。在该临时目录中,还有另一个目录始终以 "rs-graphics"
开头,并包含保存为 ".png"
文件的所有绘图。因此,要获取 ".png"
个文件的列表,您可以执行以下操作:
plots.dir.path <- list.files(tempdir(), pattern="rs-graphics", full.names = TRUE);
plots.png.paths <- list.files(plots.dir.path, pattern=".png", full.names = TRUE)
现在,您可以将这些文件复制到您想要的目录中,如下:
file.copy(from=plots.png.paths, to="path_to_your_dir")
附加功能:
您会注意到,.png
文件名是自动生成的(例如,0078cb77-02f2-4a16-bf02-0c5c6d8cc8d8.png
)。因此,如果您想根据 RStudio 中的绘图顺序对 .png
个文件进行编号,您可以按如下方式进行:
plots.png.detials <- file.info(plots.png.paths)
plots.png.detials <- plots.png.detials[order(plots.png.detials$mtime),]
sorted.png.names <- gsub(plots.dir.path, "path_to_your_dir", row.names(plots.png.detials), fixed=TRUE)
numbered.png.names <- paste0("path_to_your_dir/", 1:length(sorted.png.names), ".png")
# Rename all the .png files as: 1.png, 2.png, 3.png, and so on.
file.rename(from=sorted.png.names, to=numbered.png.names)
希望对您有所帮助。
我不确定 Rstudio 如何打开绘制绘图的设备,但我猜它使用 dev.new()
。在这种情况下,保存所有打开的图形的一种快速方法是遍历所有设备并使用 dev.print
.
写入它们
类似于:
lapply(dev.list(),function(d){dev.set(d);dev.print(pdf,file=file.path(folder,paste0("graph_",d,".pdf"))})
其中 folder
是您要存储图形的文件夹的路径(例如,如果您在 linux 中并且想存储所有图形,则可以是 folder="~"
在您的主文件夹中)。
我为一个项目制作了不同的情节(超过一百个),但我没有在途中捕捉到它们(是的,这很糟糕,我知道)。现在,我需要一次将它们全部保存,但不需要再次 运行ning 我的脚本(这需要几个小时)。有没有办法在 Rstudio 中这样做?
编辑:所有的情节都已经存在了,我不想再运行它们了。
如果您输入以下功能,所有后续操作都将保存在一个文档中:
pdf("nameofthedocument.pdf")
plot(x~y)
plot(...
dev.off()
您还可以使用 tiff()、jpg()...请参阅 ?pdf
如果您的绘图是 3d,您可以拍摄所有绘图的快照并将它们保存为 .png 文件格式。
snapshot3d(filename = '../Plots/SnapshotPlots.png', fmt = 'png')
否则,最好的方法是使用 par(mfrow)
函数创建多面板绘图 window。尝试以下
plotsPath = "../Plots/allPlots.pdf"
pdf(file=plotsPath)
for (x in seq(1,100))
{
par(mfrow = c(2,1))
p1=rnorm(x)
p2=rnorm(x)
plot(p1,p2)
}
dev.off()
您还可以使用 png
、bmp
、tiff
和 jpeg
函数代替 pdf
。你可以看看他们的优缺点,选择你认为对你的需求好的。
虽然这个讨论已经有一段时间不活跃了,但有些人,比如我,仍然遇到同样的问题,而其他解决方案似乎并没有真正理解真正的问题是什么。
那么,动手吧。你的情节历史被保存在一个名为 .SavedPlots
的变量中。您可以直接访问它,将其分配给代码中的另一个变量,或者从图中执行后者 window.
# ph for plot history
ph <- .SavedPlots
在 R 3.4.2 中,我可以索引 ph
以在设备中重现相应的绘图。接下来的内容相当简单:
- 打开新设备(png、jpeg、pdf...)。
- 重现你的剧情
ph[index_of_plot_in_history]
. - 关闭设备(如果是多页pdf则继续打印)。
示例:
for(i in 1:lastplot) {
png('plotname.png')
print(ph[i])
dev.off()
}
注意:有时这不会发生,因为编程不当。例如,我使用 MICE 包来估算具有大量变量的许多数据集,并按照 this paper 的第 4.3 节中所示进行绘图。问题是,每个图只显示三个变量,如果我在代码中使用 png 设备,则只会保存每个数据集的最后一个图。但是,如果将图打印到 window,每个数据集的所有图都会被记录下来。
在 RStudio 中,每个会话都有一个临时目录,可以使用 tempdir()
获得。在该临时目录中,还有另一个目录始终以 "rs-graphics"
开头,并包含保存为 ".png"
文件的所有绘图。因此,要获取 ".png"
个文件的列表,您可以执行以下操作:
plots.dir.path <- list.files(tempdir(), pattern="rs-graphics", full.names = TRUE);
plots.png.paths <- list.files(plots.dir.path, pattern=".png", full.names = TRUE)
现在,您可以将这些文件复制到您想要的目录中,如下:
file.copy(from=plots.png.paths, to="path_to_your_dir")
附加功能:
您会注意到,.png
文件名是自动生成的(例如,0078cb77-02f2-4a16-bf02-0c5c6d8cc8d8.png
)。因此,如果您想根据 RStudio 中的绘图顺序对 .png
个文件进行编号,您可以按如下方式进行:
plots.png.detials <- file.info(plots.png.paths)
plots.png.detials <- plots.png.detials[order(plots.png.detials$mtime),]
sorted.png.names <- gsub(plots.dir.path, "path_to_your_dir", row.names(plots.png.detials), fixed=TRUE)
numbered.png.names <- paste0("path_to_your_dir/", 1:length(sorted.png.names), ".png")
# Rename all the .png files as: 1.png, 2.png, 3.png, and so on.
file.rename(from=sorted.png.names, to=numbered.png.names)
希望对您有所帮助。
我不确定 Rstudio 如何打开绘制绘图的设备,但我猜它使用 dev.new()
。在这种情况下,保存所有打开的图形的一种快速方法是遍历所有设备并使用 dev.print
.
类似于:
lapply(dev.list(),function(d){dev.set(d);dev.print(pdf,file=file.path(folder,paste0("graph_",d,".pdf"))})
其中 folder
是您要存储图形的文件夹的路径(例如,如果您在 linux 中并且想存储所有图形,则可以是 folder="~"
在您的主文件夹中)。