在Sweave中使用legend():这是一个错误吗?

时间:2012-05-23 20:36:54

标签: r sweave

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

 \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时)单点和由两个点组成的图例,以及两种不同类型的线: correct legend

在sweave中,传说无法生成,我只看到一个空盒子: no legend

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

1 个答案:

答案 0 :(得分: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")
@