使用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
,因为表达式列表是类似列表的对象。我看看能不能修改一下代码。