3

现在我正在学习 sweave 来写一个包小插曲。我正在使用传统的 R 图形。奇怪的是,我添加到一个可以正常工作的高级绘图中的图例,否则在我 Sweave 文件时不起作用。这是一个最小的例子:

 \documentclass{article}
 \begin{document}
 <<fig=TRUE>>=
 plot(0.5, 0.5, xlim = c(0,1), ylim = c(0,1))
 legend("bottomright", c("data", "summary", "curve", "conf. region"), 
      pch = c(2,1,NA,NA), lwd = c(NA,NA, 2,1))
 @
 \end{document}

R 代码生成(在运行 R 版本 2.15 时)一个点和一个由两个点和两种不同类型的线组成的图例: 正确的传说

在 sweave 中无法生成图例,我只看到一个空框: 没有传说

这是一个sweave bug,还是我忽略了什么?

4

1 回答 1

6

问题

这似乎是一个错误,但它是一个问题,pdf()而不是它Sweave()本身。

要了解我的意思,请尝试调用pdf(). 它产生与上面显示的相同的缺陷图:

pdf("pdfPlot.pdf")
    plot(0.5, 0.5, xlim = c(0,1), ylim = c(0,1))
    legend("bottomright", c("data", "summary", "curve", "conf. region"), 
         pch = c(2,1,NA,NA), lwd = c(NA,NA, 2,1))
dev.off()

相比之下,cairo_pdf()生成的图看起来还不错:

cairo_pdf("cairo_pdfPlot.pdf")
    plot(0.5, 0.5, xlim = c(0,1), ylim = c(0,1))
    legend("bottomright", c("data", "summary", "curve", "conf. region"), 
         pch = c(2,1,NA,NA), lwd = c(NA,NA, 2,1))
dev.off()

解决方案1:使用knitr。

如果您愿意切换到knitr,则修复此问题很容易。只需添加dev="cairo_pdf" 到您的代码块标头(如果您愿意,可以删除fig=TRUE),如下所示:

<<dev="cairo_pdf">>=
...
...
@

处理代码就像library(knitr); knit("myScript.Rnw")代替当前调用一样简单Sweave("myScript.Rnw")

解决方案 2:构建您自己的对 \includegraphics{} 的调用。

如果你必须坚持Sweave(),做这样的事情会让你解决这个问题:

<<results=tex, term=FALSE, echo=FALSE>>=
cairo_pdf("myPlot.pdf", width=5)
    plot(0.5, 0.5, xlim = c(0,1), ylim = c(0,1))
    legend("bottomright", c("data", "summary", "curve", "conf. region"),
         pch = c(2,1,NA,NA), lwd = c(NA,NA, 2,1))
dev.off()
cat("\\includegraphics{myPlot.pdf}\n\n")
@
于 2012-05-23T21:46:53.067 回答