6

这是此问题的后续问题: 如何在与 `text` 一起使用的 `bquote` 表达式中换行?

但现在我把它放在了一个传说中,这似乎改变了事情。

我尝试了以下方法:

test<-c(10:1)
dummy1<-0.004323423
dummy2<-0.054
dummy3<-0.032
plot(test,c(1:10))
legend("topright", 
 legend=c(bquote(Qua_0,99^normal == .(round(dummy1,4))),bquote(Qua_0,95^normal == .(round(dummy2,4))),bquote(Qua_0,99^t == .(round(dummy3,4)))),
 bty = "n",lwd=2, cex=1, col=c("red","black","darkgreen"), lty=c(1,3,5))

所以,我想拥有

  1. 表达式正确,以便正确写入索引 0,95 以及幂 ^ correclty

  2. 等号后的换行符

  3. 彩色文本,与 lign 相同,所以第一个是红色的

我试图实现已经存在的帖子的答案,但我没有弄清楚,atop 也不起作用。

4

2 回答 2

6

首先创建一个包含 3 个表达式的向量,并使用它substitute来创建适当的虚拟值。请注意,我正在使用as.expression它们以便不会立即对它们进行评估,并且使用atop用于换行符。然后在调用时使用该向量legend

v <- c(
 as.expression(substitute(atop(Qua[0.99]^normal == "", dummy), list(dummy=round(dummy1,4)))),
 as.expression(substitute(atop(Qua[0.95]^normal == "", dummy), list(dummy=round(dummy2,4)))),
 as.expression(substitute(atop(Qua[0.99]^t == "", dummy), list(dummy=round(dummy3,4))))
)
cols <- c("red","black","darkgreen")
legend("topright", legend=v, bty = "n",lwd=2, cex=1, col=cols, text.col=cols, lty=c(1,3,5))

文本的颜色用 设置text.col在此处输入图像描述

如果你想坚持使用bquote而不是substitute

 v <- c(
  as.expression(bquote(atop(Qua[0.99]^normal == "", .(round(dummy1,4))))),
  as.expression(bquote(atop(Qua[0.95]^normal == "", .(round(dummy2,4))))),
  as.expression(bquote(atop(Qua[0.99]^t == "", .(round(dummy3,4)))))
 )

要使正常0.99粗体,您可以bold在表达式中使用:

v <- c(
 as.expression(substitute(atop(Qua[bold(0.99)]^bold(normal) == "", dummy), list(dummy=round(dummy1,4)))),
 as.expression(substitute(atop(Qua[bold(0.95)]^bold(normal) == "", dummy), list(dummy=round(dummy2,4)))),
 as.expression(substitute(atop(Qua[bold(0.99)]^bold(t) == "", dummy), list(dummy=round(dummy3,4))))
)

但是0.99实际上不会很粗: 在此处输入图像描述

您可以尝试使用正常大小的文本textstyle

v <- c(
 as.expression(substitute(atop(Qua[textstyle(0.99)]^textstyle(normal) == "", dummy), list(dummy=round(dummy1,4)))),
 as.expression(substitute(atop(Qua[textstyle(0.95)]^textstyle(normal) == "", dummy), list(dummy=round(dummy2,4)))),
 as.expression(substitute(atop(Qua[textstyle(0.99)]^textstyle(t) == "", dummy), list(dummy=round(dummy3,4))))
)

得到这个: 在此处输入图像描述

于 2013-03-28T13:21:47.557 回答
5

这里需要做几件事,但主要是以合适的格式获取 3 个表达式 - 简单地c将它们组合在一起是行不通的。为此,我创建了一个表达式列表,然后创建了该列表上sapplyas.expression函数以获得“表达式向量”。

我使用 plotmath 函数atop来获得“换行符”;这将其论点置于另一个之上。

为了获得0,95我认为只是0.95在您的语言环境中的部分,在我的机器上,我必须使用*带有文字的布局函数","095. 如果这只是为了写一个小数,那么在其他.用作小数分隔符的语言环境中,这不是必需的。我怀疑在您的语言环境中,您可以使用下面的第二个版本,但写作[0,99]而不是[0.99],但我不知道。

如果你只是把

bquote(atop(foo_0.99^normal ==, .round(bar, 4)))

你只会得到一个错误:

> bquote(atop(foo_0.99^normal ==, .round(bar, 4)))
Error: unexpected ',' in "bquote(atop(foo_0.99^normal ==,"

==这是因为缺少函数/运算符的右侧。由于您在==(在当前行!)之后不需要任何内容​​,因此您需要使用不会增加额外空间但为==. 在这里,我使用phantom()which 作为占位符但不留空间(因为我不提供任何参数)。但你也可以用,== ""代替"".phantom()

要获得与线条颜色相同的文本,请使用text.col参数。

这是满足您所有要求的完整内容(经过一段时间):

test <- 10:1
dummy1 <- 0.004323423
dummy2 <- 0.054
dummy3 <- 0.032
plot(test, 1:10)

## list of expressions
exprs <-
  list(bquote(atop(Qua_0 * "," * 99^normal == phantom(), .(round(dummy1, 4)))),
       bquote(atop(Qua_0 * "," * 95^normal == phantom(), .(round(dummy2, 4)))),
       bquote(atop(Qua_0 * "," * 99^t == phantom(), .(round(dummy3, 4)))))
## fudge to get them as an expression vector
exprs <- sapply(exprs, as.expression)

cols <- c("red", "black", "darkgreen")
legend("topright", legend = exprs, bty = "n", lwd = 2, cex = 1, col = cols,
       lty=c(1,3,5), text.col = cols)

看起来您正在使用 LaTeX_来获取上标。在 plotmath 你需要[ ]. 您还会注意到,这在排版上不太好——图例条目之间没有足够的空间,但单个条目中的元素之间有一些空间。这是因为我们滥用atop伪造换行符。我们可以使用 的y.intersp参数来处理legend。增加它以2提供足够的空间。

结合这一点,我将执行以下操作来满足您的所有要求:

plot(test, 1:10)

## list of expressions
exprs <-
  list(bquote(atop(Qua[0.99]^normal == phantom(), .(round(dummy1, 4)))),
       bquote(atop(Qua[0.95]^normal == phantom(), .(round(dummy2, 4)))),
       bquote(atop(Qua[0.99]^t == phantom(), .(round(dummy3, 4)))))
## fudge to get them as an expression vector
exprs <- sapply(exprs, as.expression)

cols <- c("red", "black", "darkgreen")
legend("topright", legend = exprs, bty = "n", lwd = 2, cex = 1, col = cols,
       lty=c(1,3,5), text.col = cols, y.intersp = 2)

这会产生:

在此处输入图像描述

于 2013-03-28T13:23:52.917 回答