保存多个 ggplot 到文件中。

3
我希望将一系列变化的ggplot保存到不同的文件中。为此,我使用了一个类似于以下代码的for循环:
save = c("plot1","plot2")
for (i in 1:length(save)){
  ggsave(cat(save[i],"\n"), file="i.pdf")
}

"plot1"和"plot2"是工作中的ggplots(绘图对象的名称)。因为我得到了以下错误:
Error in ggsave(cat(save[i], "\n"), file = "i.pdf") : 
  plot should be a ggplot2 plot

我尝试了cat函数。无论是否使用该函数,它都返回相同的错误。如果我直接输入“plot”,它可以正常工作...
我做错了什么?
(编辑了示例,因此有多个绘图)

c("plot")是一个只有一个元素的字符向量。你正在将带有换行符的字符串传递给ggsave的第一个参数,而该参数期望是一个文件名。 - undefined
但是如果这个向量中有多个元素,我该如何做呢?例如,save = c("plot1","plot2")。 - undefined
你能展示更多的代码吗?那些是绘图对象的名称吗? - undefined
是的,它们是图形对象的名称...如果不清楚,对不起! - undefined
cat总是返回NULL,并且只有一个打印到控制台的副作用。在函数中使用它作为参数完全不合适。 - undefined
这很奇怪。如果我执行cat命令,它只会返回向量的第一个元素,而不是“> cat(save[1], "\n")
plot1`。
- undefined
3个回答

7
您需要在ggsave中指定参数plot:
ggsave(plot = plot, file = "save.pdf")

如果您有多个ggplot需要保存,首先需要将它们保存在一个列表中。
plotlist = list()
plotlist[[1]] = plot1
plotlist[[2]] = plot2

等等其他方式。一旦您得到列表,就可以对其进行循环:

for(i in 1:2){
  ggsave(plot = plot[[i]], file = paste("file",i,".pdf",sep=""))
}

那将会把图表保存在文件1、文件2等中。

这对我有效。谢谢。还有一个额外的事情...如何根据列表元素来命名文件?例如plot1.pdf,plot2.pdf... - undefined
以上代码将保存为file1.pdf,file2.pdf等。如果您将代码行更改为:ggsave(plot = plot[[i]], file = paste("plot",i,".pdf",sep="")),它将保存为plot1.pdf,plot2.pdf等。尝试运行i=1然后运行paste("plot",i,".pdf",sep="")),您将了解到paste只是使用索引i创建一个正确的文件名。 - undefined
那么我无法从列表中获取字符串吗?假设我们不谈论plot1和plot2,而是abc和def。文件的名称将会是abc.pdf和def.pdf吗? - undefined
1
你绝对可以通过以下方式使用列表中的名称:ggsave(plot = plot[[i]], file = paste(names(plotlist)[i],".pdf",sep="")) 这符合你的要求吗? - undefined
我做错了什么。例如,names(plotlist)[1] 只返回 NULL - undefined
1
默认情况下,列表没有任何名称。当你创建列表时,你可以添加它们:plotlist[[1]] = plot1,然后你可以添加名称 names(plotlist)[1] = "nameplot1",你可以用任何你想要的东西替换nameplot1,对于列表中的所有项目(在上述情况下为2),重复这个步骤。你也可以在填充列表与图表之后一次性定义名称:names(plotlist) = c("name1", "name2")。现在运行for循环应该能实现你想要的效果 ;) - undefined

3
您可以使用get根据名称获取对象:
library(ggplot2)

plot_1 <- qplot(mpg, wt, data = mtcars)
plot_2 <- qplot(mpg, wt, data = mtcars, geom="path")
plot_3 <- qplot(mpg, data = mtcars, geom = "dotplot")

plot_names <- c("plot_1", "plot_2", "plot_3")

for (i in 1:length(plot_names)) {
  ggsave(filename=sprintf("%s.pdf", plot_names[i]), 
         plot=get(plot_names[i]))
}

但是,将你的图形存储在一个列表中并迭代列表元素会更好:

plots <- list(length=3)
plots[[1]] <- qplot(mpg, wt, data = mtcars)
plots[[2]] <- qplot(mpg, wt, data = mtcars, geom="path")
plots[[3]] <- qplot(mpg, data = mtcars, geom = "dotplot")

for (i in 1:length(plots)) {
  ggsave(filename=sprintf("plot%d.pdf", i), 
         plot=plots[[i]])
}

您可以按名称存储它们,如果想使用情节名称作为输出,或者添加一个名称的列表元素。


0
# List of plots
PlotList <- list(Object$plots)


# PDF
pdf("ManyPlots.pdf")
PlotList
dev.off()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接