【问题标题】:Save several ggplots to files将多个 ggplots 保存到文件中
【发布时间】:2014-12-17 04:35:48
【问题描述】:

我想保存一组变化的 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 功能。无论是否使用该函数,它都会返回相同的错误。如果我直接输入“情节”,它会起作用......

我做错了什么?

(编辑了例子,所以有不止一个情节)

【问题讨论】:

  • c("plot") 是一个单元素字符向量。您将带有换行符的字符串传递到 ggsave 的第一个参数中,该参数需要一个文件名。
  • 但是如果这个向量中有多个元素,我该怎么做。保存 = c("plot1","plot2")
  • 你能再显示一些代码吗?这些是情节对象的名称吗?
  • 是的,它们是情节对象的名称...抱歉,如果不清楚!
  • cat 总是返回 NULL 并且只有打印到控制台的副作用。将其用作函数中的参数是完全不合适的。

标签: r string ggplot2 concatenation


【解决方案1】:

您需要在 ggsave 中指定参数绘图:

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...
  • 以上代码将保存为 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
  • 所以我无法从列表中获取字符串?假设我们不是在谈论 plot1 和 plot2,而是在谈论 abc 和 def。文件的名称如何是 abc.pdf 和 def.pdf?
  • 您绝对可以通过以下方式使用列表中的名称:ggsave(plot = plot[[i]], file = paste(names(plotlist)[i],".pdf",sep="")) 这就是您要找的吗?
  • 默认情况下,列表没有任何名称。当您创建列表时,您可以添加它们:plotlist[[1]] = plot1 然后您可以添加名称 names(plotlist)[1] = "nameplot1" 您可以替换 nameplot1 为您想要的任何内容,对列表中的所有项目重复此操作(在上述情况 2 中)。您还可以通过names(plotlist) = c("name1", "name2") 在列表中填写图表后一次性定义名称。运行 for 循环现在应该做你想做的事了 ;)
【解决方案2】:

您可以使用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]))
}

但是,您最好将绘图存储在 list 中并遍历列表元素:

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]])
}

如果您想使用绘图名称作为输出或为名称添加列表元素,您可以将它们命名存储。

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多