R:Plot中的高级图例

时间:2013-03-28 11:04:14

标签: r plot expression legend plotmath

这是这个问题的后续问题: How to have a new line in a `bquote` expression used with `text`?

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

我尝试了以下内容:

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相同,所以第一个是红色的

  4. 我试图实现现有帖子的答案,但我没想出来,atop也没有用。

2 个答案:

答案 0 :(得分: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.colenter image description here

如果您想坚持使用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 实际上不会非常大胆: enter image description here

您可以使用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))))
)

得到这个: enter image description here

答案 1 :(得分:5)

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

我使用plotmath函数atop来获取“换行符”;这把它的论点放在另一个上面。

要获取0,95部分(我认为只是0.95但是在您的语言环境中,在我的机器上,我必须使用布局函数*和文字{{1}并置","0。如果这只是为了写小数,那么在使用95作为小数分隔符的其他语言环境中,这不是必需的。我怀疑在你的语言环境中,你可以使用下面的第二个版本,但写.而不是[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(),将== ""替换为""

要使文本与行颜色相同,请使用phantom()参数。

完全满足您的所有要求(时尚之后):

text.col

看起来你正在使用LaTeX 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) 来获取上标。在情节中你需要_。 您还会注意到,这在排版上并不是那么好 - 图例条目之间没有足够的空间,但是单个条目中的元素之间有一些空间。这是因为我们滥用[ ]伪造换行符。我们可以使用atop的{​​{1}}参数来解决这个问题。将其增加到y.intersp可以提供足够的空间。

结合这一点,我会做以下事情以满足您的所有要求:

legend

这会产生:

enter image description here