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

3

我现在正在学习Sweave以编写包vignette。我使用传统的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),会生成一个单独的点和包含两个点和两种不同类型线的图例: correct legend 但是,在 sweave 中无法生成图例,只能看到一个空框: no legend 这是 Sweave 的一个错误吗?还是我忽略了什么?

我猜这应该向 R 核心报告:https://bugs.r-project.org/ - Yihui Xie
好的!我会将此提交为错误报告。 - Philipp
1个回答

6

问题

这似乎是一个bug,但它是与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">>=
...
...
@

处理代码就像现在这样简单:在您当前调用Sweave("myScript.Rnw")的位置上执行library(knitr); knit("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")
@

1
knitr 中,您不需要使用 fig=TRUE;除非您抑制它们,否则图形将始终生成。 - Yihui Xie
@Yihui -- 又一个不错的设计决策。谢谢。 (我已经修改了knitr绑定代码块,以便注意到这个区别。) - Josh O'Brien
更准确地说:这是一个错误(哎呀,PDF 是瑞普利领域,所以最好称其为“可能的不幸”),与在 pch 和 lwd 中使用 NA 有关。尝试使用非 NA 值,它可以工作,但我找不到一个能提供所需显示的解决方案。 - Dieter Menne

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