【问题标题】:How to store plots in a list when inside a loop?在循环内如何将绘图存储在列表中?
【发布时间】:2017-06-12 12:16:34
【问题描述】:

我正在循环中工作,我想将绘图保存在一个列表中,以便我可以将它们一起绘制在一个 .pdf 中。问题是该列表未正确填写并使用上次运行的结果重新更新。所以,最后我得到的是一个包含五个完全相同的元素的列表。

我知道循环可能看起来毫无用处,但我只是让它们创建一个尽可能接近真实代码的测试代码(带有可重现的错误)。所以,我需要让循环保持原样。

library (ggplot)
library (gridExtra)

plist <- list()

for (z in 1:5){
  n <- 100
  k <- seq(0, to=4500+z*2000, length=n)
  tmp <- numeric(n)
  for (i in 1:n){
    tmp[i] <- (5*(i*3)^2)}

  plist[[z]] <- ggplot() +
    geom_line(aes(x = k, y = tmp)) +
    theme_bw()

  pdf(sprintf("p%s.pdf", z),
      width = 6, height = 4, onefile = T)
  plot(plist[[z]])
  dev.off()
}

do.call(grid.arrange, c(plist, ncol = 5))

【问题讨论】:

  • 你能在你的for循环中使用p[z]吗?
  • 是的,为什么不将图保存到列表中呢?这样您以后就不需要将它们放入列表中以便一起绘制。
  • 在一个地方你已经分配给 sprintf("p%s", z) 但是当你尝试 get 时你使用 "p_%s"。
  • 这就是我尝试做的事情,当我创建 listp... 有没有更好的方法?
  • 第一次通过循环尝试获取一个不存在的对象,即错误消息所述的p2。你真的想要两个循环:一个用于创建,另一个用于访问绘图?另外:grid.arrange 不在 pkg-ggplot2 中。

标签: r loops plot ggplot2


【解决方案1】:

此答案基于:Storing plot objects in a list

library(ggplot2)
library(gridExtra)

plist <- list()

for (z in 1:5){
  n <- 100
  k <- seq(0, to=4500+z*2000, length=n)
  tmp <- numeric(n)
  for (i in 1:n){
    tmp[i] <- (5*(i*3)^2)}

  data <- data.frame(n, k, tmp)

  plist[[z]] <- ggplot(data = data) + #data needs to be given!!
    geom_line(aes(x = k, y = tmp)) +
    theme_bw()

  pdf(sprintf("p%s.pdf", z),
      width = 6, height = 4, onefile = T)
  plot(plist[[z]])
  dev.off()
}

do.call(grid.arrange, c(plist, ncol = 5))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2010-12-21
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    相关资源
    最近更新 更多