R中的高级图例:绘图

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被正确书写,并且幂符号^被正确写入

  2. 等号后面加换行符

  3. 文本着色与行相同,因此第一个应为红色

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


请查看@agstudy在我的一个问题中的这个答案,我认为它可能会对你有所帮助。 - Simon O'Hanlon
@SimonO101 嗯,我想不出来了... - Stat Tistician
1
@SimonO101 这个方法可行是因为该解决方案在不同的行上绘制了两个表达式。在图例中无法这样做,因为每个条目必须在单个“行”上,并且每个图例条目只能有一个表达式。 - Gavin Simpson
@GavinSimpson,是的,但这并不改变任何事情..... - Stat Tistician
是的,它确实可以。请看我的回答。 - Gavin Simpson
显示剩余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 来设置。 enter 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)))))
 )

要使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并不是非常粗体: 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))))
)

并且需要这样做: 在此输入图片描述

好的,谢谢。但是我该如何在等号和文本颜色之后换行? - Stat Tistician
2
您可以通过在图例调用中添加 y.intersp = 2 来“修复”图例元素之间的间距问题。 - Gavin Simpson
@caerolus 也许你知道如何增加“正常”和“0.95”的字母大小? - Stat Tistician
1
我认为你不能直接使用plotmath来完成这个任务 - 一个选项,但是可能是一种hack的方法,是结合textstyle()scriptstyle() plotmath函数以及cex进行调整。例如,您可以将除“normal”和“0.95”之外的所有内容都放在scriptstyle()包装中,然后再次使用cex增加整体字体大小。子脚本和上标的较小字体是数学排版的常规约定,因此这就是plotmath所做的。 - Gavin Simpson
1
@StatTistician 在答案末尾添加了它。 - Julián Urbano
显示剩余2条评论

5
这里需要几个步骤,但主要的是将三个表达式以适当的格式呈现出来——简单地将它们用 c 函数连接在一起是行不通的。为此,我创建了一个表达式列表,并对该列表应用 as.expression 函数,得到一个“表达式向量”。
我使用绘图函数 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)

这会产生以下结果:

enter image description here


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