【问题标题】:Autosaving multiple pages of lattice plots自动保存多页格子图
【发布时间】:2016-01-05 11:27:10
【问题描述】:

我想知道是否有人可以提供以下代码。我有一个巨大的数据集(> 1000 个主题),我试图单独对其进行可视化。

我很幸运地找到了由 R-bloggers 编写的 Tony Cookson 编写的代码,我已经对其进行了修改以供我使用。代码工作正常,但生成的 pdf 文件已损坏 - 基本上他们拒绝打开。我感觉某处有错误,但我还没有弄清楚在哪里。任何帮助将不胜感激。

library(lattice)

names = LETTERS[1:3] 

for(i in 1:3){

mypath <- file.path("myFilepath", "folder containing 'Plots' subfolder ",
                    "Plots",paste("myplot_", names[i], ".pdf", sep = ""))

pdf(file=mypath)
mytitle = paste("Theoph Plots", names[i])
xyplot(conc ~ Time | Subject, group = Subject, data = Theoph, type = "l",
     layout = c(2, 2), main = mytitle)
dev.off()
}

为了使代码可重现,您需要将 myFilepath、包含“Plots”子文件夹和“Plots”的文件夹替换为计算机上可以找到的实际文件夹的名称。有关更多详细信息,请参阅 R-bloggers 上的原件。我很乐意澄清任何看起来模棱两可的事情。

谢谢

编辑:

library(lattice)

names = LETTERS[1:3] 

for(i in 1:3){

mypath <- file.path("myFilepath", "folder containing 'Plots' subfolder ",
                "Plots",paste("myplot_", names[i], ".pdf", sep = ""))

pdf(file=mypath)
mytitle = paste("Theoph Plots", names[i])
print(xyplot(conc ~ Time | Subject, group = Subject, data = Theoph, type =    "l",
 layout = c(2, 2), main = mytitle))
dev.off()
}

我已经设法使用打印功能找到了一个临时解决方案(上图)。但是,我目前正在同一个 pdf 中获取所有 12 个主题。我真正想要的是 4 个主题(2 x 2 矩阵)放在单独的 pdf 上,因此总共制作 3 个 pdf。有人知道怎么做吗?

【问题讨论】:

  • print 功能让您非常满意。如果您希望每个主题一个 PDF,请从您的 xyplot 中删除 group = Subject 并替换数据参数:data = Theoph[Theoph$Subject == i, ]。你想在四个地块中的每一个中得到什么?
  • @BenBarnes,感谢您的回复。我想要的是每个 plot/pdf 上的 4 个主题,总共 3 个 pdf。目前,它在同一个 pdf 上给了我所有 12 个主题,但在 pdf 的不同页面上。我已经尝试过你的建议,但结果并不完全是我想要的!

标签: r graph plot lattice


【解决方案1】:

如果您希望在每个页面上绘制 Subjects 的子集,则必须为每次迭代对数据进行子集化,然后进行绘制。

要在每个页面上获得 4 个主题,您可以使用以下索引构建器作为子集的基础:

(i - 1) * 4 + 1:4

Theoph 数据集的诀窍在于,主题“数字”实际上是有序因子。所以你必须把上面的转换成一个因子,或者,作为一个快捷方式,转换成一个字符向量。

for(i in 1:3){
    ## Changed mypath to make it reproducible
    mypath <- file.path(tempdir(), paste("myplot_", names[i], ".pdf", sep = ""))
    pdf(file=mypath)

    mytitle = paste("Theoph Plots", names[i])

    myIndex <- as.character((i - 1) * 4 + 1:4) # index builder from above

    print(xyplot(conc ~ Time | Subject, 
        data = Theoph[Theoph$Subject %in% myIndex, ],
        type = "l", layout = c(2, 2), main = mytitle))
    dev.off()
}

主题的顺序有点混乱,因为如上所述,该变量是一个有序因子。为了保持排序,您可以在该因素的水平上进行子集化:

myIndex <- levels(Theoph$Subject)[(i - 1) * 4 + 1:4]

构建索引的最佳方式取决于您的实际数据。

【讨论】:

  • 非常感谢您花时间发帖。它像魔术一样工作!索引真的很聪明,我只需要将它调整到 100 多个主题。再次感谢!
  • 如果我的主题只是因子而不是有序因子,我是否需要更改此代码中的任何内容?当我在我的数据-Error in limits.and.aspect(default.prepanel, prepanel = prepanel, have.xlim = have.xlim, : need at least one panel 上尝试它时,我不断收到错误报告。该代码适用于 Theoph 数据,但不适用于我的。
  • 你使用的是myIndex的第二版还是第一版?
  • 我已经尝试了有和没有as.character。似乎并没有太大的区别——两者都得到错误报告。
  • 使用第二个版本 (myIndex &lt;- levels(Theoph$Subject)[(i - 1) * 4 + 1:4]) - 第一个版本假定 Subjects 由从 1 开始的数字序列指定。如果您的主题由其他任何指定,则第一个 @ 987654332@ 不起作用。
猜你喜欢
  • 2015-11-12
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多