【问题标题】:Create and output multiple plots from list从列表中创建和输出多个图
【发布时间】:2015-10-23 11:06:26
【问题描述】:

我正在尝试创建并以 pdf 格式输出 64 个项目的列表。我的数据采用以下形式:

QQJAN     List of 64

file1: List of 2
..$x: num [1:161] 96.7 96.8 97.5 ...
..$y: num [1:161] 9.3 10.3 17.3 ...
..................................................................
file64: List of 2
..$x: num [1:161] 42.6 59.9 70.4 ...
..$y: num [1:161] 9.3 10.3 17.3 ...

我可以使用以下方法对列表中的任何单个项目执行此操作:

plot(QQJAN$file1)

然后可以将这些文件作为 pdf 输出到我的工作目录,但是如何将列表中的所有 64 个文件连同它们的名称一起绘制和输出,即 file1.pdf、文件 2.pdf 等。

这里可以使用lapply函数吗?

一个可重现的例子:

QQJAN$file1$x=c(1,2,3,4)
QQJAN$file1$y=c(2,4,5,6)

QQJAN$file2$x=c(2,2,3,5)
QQJAN$file2$y=c(2,4,5,6)

【问题讨论】:

  • 尝试使用lapply,即lapply(names(QQJAN), function(x) plot(QQJAN[[x]], ,并使用paste0(x, '.pdf'指定文件名
  • 感谢@akrun 的回复。这给了我一条错误消息:“xy.coords (x, y, xlabel, ylabel, log) 中的错误:'x' 和 'y' 长度不同。但它们不应该不同,因为 x 和 y 都有 161整数。
  • 你能提供一个可重现的小例子
  • 我不确定我上面添加的内容是否是可重现的示例,但也许它可以帮助说明我的数据的性质。

标签: r


【解决方案1】:

由于缺乏可重复的示例,未进行测试:

for (i in seq_along(QQJAN)) {
  pdf(sprintf("plot%i.pdf", i)) #or pdf(paste0(names(QQJAN)[i], ".pdf"))
    plot(QQJAN[[i]])
  dev.off()
}

如果您只对副作用感兴趣,例如绘图,for 循环通常是合适的。如果你需要返回值,你应该使用lapply

【讨论】:

  • 非常感谢@Roland。这也很有效,但我更喜欢 lapply 方法,因为我可以更容易地理解它在做什么。但是非常感谢这个伟大的替代解决方案。
【解决方案2】:

我们可以使用lapply 来循环list 元素的names,通过paste使用.pdf 来创建pdf 文件,子集list (@987654328) @), plot.

 invisible(lapply(names(QQJAN), function(x) {
         pdf(paste0(x, '.pdf'))
          plot(QQJAN[[x]])
         dev.off()}))

数据

QQJAN <- structure(list(file1 = structure(list(x = c(6L, 5L, 15L, 11L, 
14L, 19L, 6L, 16L, 17L, 6L, 13L, 8L, 14L, 14L, 7L, 19L, 4L, 1L, 
11L, 3L, 2L, 12L, 15L, 3L, 5L, 14L, 2L, 12L, 13L, 1L, 7L, 5L, 
8L, 3L, 19L, 5L, 15L, 13L, 14L, 20L), y = c(29L, 23L, 17L, 14L, 
3L, 5L, 24L, 22L, 16L, 21L, 28L, 52L, 28L, 43L, 33L, 60L, 28L, 
18L, 11L, 9L, 30L, 15L, 17L, 8L, 44L, 19L, 57L, 59L, 45L, 30L, 
9L, 13L, 1L, 60L, 39L, 21L, 35L, 50L, 3L, 44L)), .Names = c("x", 
"y")), file2 = structure(list(x = c(11L, 3L, 11L, 5L, 8L, 7L, 
6L, 18L, 8L, 17L, 7L, 15L, 19L, 3L, 10L, 12L, 13L, 2L, 9L, 10L, 
15L, 13L, 3L, 6L, 16L, 1L, 20L, 5L, 9L, 4L, 12L, 1L, 6L, 13L, 
18L, 7L, 18L, 19L, 15L, 13L), y = c(56L, 31L, 40L, 43L, 20L, 
45L, 55L, 8L, 43L, 26L, 7L, 52L, 7L, 31L, 11L, 14L, 55L, 26L, 
4L, 42L, 34L, 44L, 12L, 4L, 30L, 60L, 23L, 44L, 29L, 55L, 6L, 
37L, 11L, 14L, 36L, 52L, 28L, 22L, 31L, 33L)), .Names = c("x", 
"y"))), .Names = c("file1", "file2"))

【讨论】:

  • 工作愉快。非常感谢@akrun!
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
  • 2013-06-23
  • 2021-12-27
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
相关资源
最近更新 更多