使用Sweave在for循环中绘制多个图表

6

我的Sweave代码块:

<<fig=TRUE,echo=FALSE>>=
for(i in 1:10) {
  plot(rep(i,10))
  dev.new()
}
@

在生成的pdf中,我只得到了一个图形(来自第一次迭代)。我希望打印出所有10个图形。我做错了什么? 我尝试用frame()plot.new()替换dev.new(),但没有任何反应。

1
尝试使用 fig.keep = 'all' - rawr
1个回答

10

如@rawr所建议,最简单的解决方法是切换到knitr(实际上没有任何理由不这样做!)并在代码块选项中加入fig.keep="all"(如果您切换到knitr,您就不再需要fig=TRUE了…包括图形的工作是自动进行的,fig.keep="none"fig=FALSE的类比)

或者,如果您想继续使用原始的Sweave,请查看Sweave手册第17页:

A.9 不能从一个图形块创建多个图形

考虑您想在循环中创建几个图表,类似于

<<fig=TRUE>>
for (i in 1:4) plot(rnorm(100)+i)
@

这种方法目前无法工作,因为Sweave在每个图表块中只允许一个图表。简单的原因是,在执行代码之前Sweave会打开一个PostScript设备,并在此之后将其关闭。如果需要在循环中绘制图形,则必须按照以下方式编写代码:

<<results=tex,echo=FALSE>>=
for(i in 1:4){
file=paste("myfile", i, ".eps", sep="")
postscript(file=file, paper="special", width=6, height=6)
plot(rnorm(100)+i)
dev.off()
cat("\\includegraphics{", file, "}\n\n", sep="")
}
@

第一次使用后,我必须承认 - knitr 和 markdown 真是太棒了。 - pmichna

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