使用bquote在R中显示两行图例

使用bquote在R中显示两行图例,r,plot,legend,R,Plot,Legend,我想使用bquote绘制图例,但在图例中添加两行时遇到问题。例如: 这项工作: plot(1:10) r2=0.99 legend("topleft",legend=bquote(R^{2} ~ "=" ~.(r2)),bty = "n") 但如果我添加第二行: plot(1:10) r2=0.99 pval=0.01 legend("topleft",legend=c(bquote(R^{2} ~ "=" ~.(r2)),paste("P-value =",pval)),bty = "

我想使用
bquote
绘制图例,但在图例中添加两行时遇到问题。例如:

这项工作:

plot(1:10)
r2=0.99
legend("topleft",legend=bquote(R^{2} ~ "="  ~.(r2)),bty = "n")

但如果我添加第二行:

plot(1:10)
r2=0.99
pval=0.01
legend("topleft",legend=c(bquote(R^{2} ~ "="  ~.(r2)),paste("P-value =",pval)),bty = "n")
图例中我的向量的第一个元素是“扩展的”。为什么呢


我成功地用以下产品生产出了您想要的东西:

textleg <- substitute(atop(paste(R^2==k),
                           plain(P-value)==j), list(k = r2, j=pval))
legend("topleft",legend=textleg,bty = "n")

textleag这是因为
c
-函数无法连接由
bquote
返回的对象类型的多个实例。大多数人认为,
bquote
返回R表达式,但事实并非如此。它返回调用,而这些调用不会连接到列表中。您需要将
expression
函数应用于对
bquote
的多个调用返回的项,以将它们放入“expression”列表中。2005年,Thomas Lumley在Rhelp上对此进行了解释:

legend("topleft",legend=do.call( 'expression', 
                                list( bquote( R^{2} == .(r2)), 
                                      bquote( "P-value" == .(pval)))  ),
                  bty = "n")

如果要将此参数构建到图例中,还有一种替代方法,即允许将表达式与
c()
串在一起。重新定义bquote以返回表达式:

bquote2 <- function (expr, where = parent.frame()) 
{
    unquote <- function(e) if (is.pairlist(e)) 
        as.pairlist(lapply(e, unquote))
    else if (length(e) <= 1L) 
        e
    else if (e[[1L]] == as.name(".")) 
        eval(e[[2L]], where)
    else as.call(lapply(e, unquote))
    as.expression( unquote(substitute(expr)) )
}
legend("topleft",
        legend=c( bquote2(R^{2} ~ "="  ~.(r2)),
                  bquote2(paste("P-value =",pval))), 
        bty = "n")

是的,非常接近。我仍然对行没有正确对齐感到恼火:P(非常次要的一点):我同意您使用更多plotmath运算符的努力,但是
P
value
之间的减号比您引用“P-value”时的范围更广。啊!我认为它们是语言对象,但我不知道它们可以这样组合。如果bquote返回表达式,我相信您可以使用
c
,因为表达式列表是类似列表的对象。我看看能不能修改一下代码。