【问题标题】:How to annotate() ggplot with latex如何用乳胶注释()ggplot
【发布时间】:2012-09-20 14:17:54
【问题描述】:

我想使用annotate() 将乳胶文本添加到 ggplot2 图中。使用expression(),如here 所述将乳胶添加到轴标签,似乎不起作用。也就是说:

# Use expression() to create subscripted text
p <- ggplot(mpg, aes(x=cty, y=hwy)) + geom_point() +
  scale_x_continuous(expression(text[subscript])) 

# But expression() in annotate adds nothing to the plot
p + annotate("text", x=10, y=40, label=expression(text[subscript])) 

# Passing regular text to annotate works fine
p + annotate("text", x=10, y=40, label="foo") 

为什么expressions 对annotate 的处理与其他ggplot 函数不同?以及如何使用乳胶进行注释?

【问题讨论】:

  • 你可以看看tikzDevice包...
  • 似乎不再积极维护。 (但仍然可能有用!)
  • 我的理解是,它仍然被广泛使用,并且功能强大,但由于更严格的 CRAN/R CMD 检查规则,目前处于孤儿院状态......它最后一次修改是在 7 月 15 日的 R-forge 2012 ...

标签: r ggplot2


【解决方案1】:

有一个名为latex2expR 包可能会有所帮助。它具有函数TeX,它接受一些用美元符号$ 括起来的LaTeX 表达式,如下例所示:

library(latex2exp)
library(ggplot2)

qplot(1, "A")+
     ylab(TeX("Formula: $\\frac{2hc^2}{\\lambda^\\beta}$"))+
     xlab(TeX("$\\alpha$"))

更多示例请见this vignette

【讨论】:

  • 您的示例适用于标签,但问题是关于注释。您的示例不适用于我的注释层,但是,如果您指定 output='character' 并将 'parse=TRUE' 添加到注释调用中,它可以。 annotate(geom='text', x=3, y=3, label=Tex("$\\hat{Y} = B_0 + B_1X_1", output='character'), parse=TRUE)
  • 你知道如何在文本上添加斜体样式吗?
  • @嘉祥你熟悉吗this thread
  • @Vilmantas Gegzna 是的,我以前读过。我想要的是使Tex() 以斜体样式输出。我尝试Tex(italic('...')),但失败了。
  • 我浏览了latex2exp vignette,但没有注意到任何关于斜体样式的信息。您可以尝试更仔细地查看。我不确定 latex2exp 是否支持斜体样式。
【解决方案2】:

您可以使用parse 参数,而不使用expression

p + annotate("text", x=10, y=40, label="text[subscript]", parse=TRUE)

【讨论】:

  • 如果您尝试使用label=expression(text[subscript]), parse = TRUE),您能否帮我确认一下是否有任何异常行为? (我还没升级到 0.9.2...)
  • 好吧……今天早上还是有点昏昏沉沉,而且我第一次犯错了。以前从未见过 R 的那种回应。很奇怪。
  • 我也是第一次看到。它使您可以使用在“?”之后键入的任何内容来更正标签参数。
  • @Joran 的评论 - 我看到了?,然后 R Studio 崩溃了(Max OSX 10.7.4、R 2.14.1、RStudio 0.96.330、ggplot2 0.9.1)。
  • 选项parse = TRUE 使其解释为plotmath 类注解数学表达式
【解决方案3】:

tikzDevice 包重新回到 CRAN(2015 年 11 月发布的最新版本 0.9)。

使用tikz 确实需要完整的 LaTeX 安装;在 LaTeX 文档中通过knitr 可能是最简单的(只需在块选项中设置dev="tikz")。但是,您也可以使用它来创建独立的图形。具有讽刺意味的是,这个问题最难的部分是获取文本下标,这需要一个额外的 LaTeX 包 (fixltx2e) 用于 \textsubscript 命令...

library(tikzDevice)
## add a package to the defaults
options(tikzLatexPackages=
            c(getOption("tikzLatexPackages"),"\\usepackage{fixltx2e}"))
tikz("tikz.tex",standAlone=TRUE)
library("ggplot2"); theme_set(theme_bw())
p <- ggplot(mpg, aes(x=cty, y=hwy)) + geom_point() +
  scale_x_continuous(name="text\\textsubscript{subscript}")
p + annotate("text", x=10, y=40, label="text\\textsubscript{subscript}")
dev.off()

system("pdflatex tikz.tex")

【讨论】:

  • 很好的答案。编译需要一些时间,产生一堆警告,如Measuring dimensions of: \char77,但当 unicode 让我失望时,这是我的首选解决方案(参见stackoverflow.com/questions/27690729/…
  • 这是一个很棒的答案@BenBolker,我设法将它调整到我自己的图表中,但我仍在努力调整打印的 pdf 文件的大小(高度和长度),有什么建议吗?
  • 不是随便的。 tikz 选项中应该有一些东西可以让你处理这个问题,我想?如果您无法弄清楚,我会说发布一个新问题会非常明智
  • 正如您所指出的,解决方案是在 tikz() 函数中使用 widthheight 选项。例如,在您的回答中,它应该类似于以下tikz("tikz.tex",standAlone=TRUE, height=1, width=1.5 )。非常感谢@BenBolker,你拯救了这一天(一如既往!)。
猜你喜欢
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多