【问题标题】:Advanced legend in R: PlotR中的高级图例:情节
【发布时间】:2013-03-18 18:58:11
【问题描述】:

这是这个问题的后续问题: 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 相同,所以第一个是红色

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

【问题讨论】:

  • 查看this answer@agstudy 提出的我的问题之一。我想它可能会帮助你
  • @SimonO101 mh 不,我想不通....
  • @SimonO101 之所以有效,是因为该解决方案在不同的行上绘制了两个表达式。您不能在图例中这样做,因为每个条目都必须在一个“行”上,并且每个图例条目只能有一个表达式。
  • @Gavin Simpson 好的,谢谢,我现在该怎么办?
  • 那是0.95 你有0,95 - 即你的意思是一个十进制标记,只是在一个奇怪的语言环境;-)

标签: r plot expression legend plotmath


【解决方案1】:

首先创建一个包含 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)))))
 )

要使 normal0.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))))
)

然后得到这个:

【讨论】:

  • 好的,谢谢,但是如何在等号和文本颜色后换行?
  • @StatTistician 在图例中执行此操作的唯一方法是使用 atop plotmath 函数。看看我的回答中如何使用它。
  • 您可以通过将y.intersp = 2 添加到图例调用中来“修复”图例元素之间的间距问题。
  • 我不认为你可以直接使用 plotmath 来做到这一点 - 一个选项,但它是一个 hack 可能是与 cex 结合使用 textstyle()scriptstyle() plotmath 函数.例如,您可以将 除了“正常”和“0.95”的所有内容放在scriptstyle() 包装中,然后使用cex 再次增加整体字体大小。下标和上标的较小字体是数学排版中的常规约定,因此这就是 plotmath 所做的。
  • @StatTistician 在答案末尾添加了它
【解决方案2】:

这里有几件事情需要做,但主要是让这 3 个表达式以合适的格式 - 简单地 c- 将它们放在一起是行不通的。为此,我创建了一个表达式列表,然后在该列表上使用 sapply as.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() 作为占位符但不留空间(因为我没有提供任何参数)。但您也可以使用== "",将"" 替换为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 来伪造换行符。我们可以使用legendy.intersp 参数来处理这个问题。将其增加到 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)

这会产生:

【讨论】:

    猜你喜欢
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多