R绘图中图例中有多个bquote项

14

以下代码可行(复制并粘贴到R中)

a=123
plot(1,1)
legend('bottomleft',legend=bquote(theta == .(a)))

我希望图例中有多个带希腊字母的项目。举个简单的例子,如果我重复该项目两次,则代码将不再起作用。

a=123
plot(1,1)
legend('bottomleft',legend=c(bquote(theta == .(a)),bquote(theta == .(a))))

我尝试了许多更为复杂的表达式,但它们都没有起作用。

任何帮助都将不胜感激。

2个回答

20

在这种情况下,plotmath 无法将调用列表强制转换为表达式。

> cs <- c(bquote(theta == .(a)),bquote(theta == .(a)))
> cs
[[1]]
theta == 123

[[2]]
theta == 123

> sapply(cs, class)
[1] "call" "call"
你可以通过自己强制转换表达式来使其工作:
> c(as.expression(bquote(theta == .(a))), as.expression(bquote(theta == .(a))))
expression(theta == 123, theta == 123)
> plot(1,1)
> legend('bottomleft',legend= c(as.expression(bquote(theta == .(a))), 
+                               as.expression(bquote(theta == .(a)))))
另一种方法是使用`sapply`强制将原始的调用列表转换为表达式:

Another way is to coerce the original list of calls to expressions using sapply:


plot(1,1)
legend("bottomleft", 
       sapply(c(bquote(theta == .(a)), bquote(theta == .(a))), as.expression))

1
@Gavin:我记得几年前在Rhelp上有一个长时间的交流,Thomas Lumley最终提出了一个sapply(..., as.expression)的解决方案。我曾经试图在其他场合找到它,但没有成功,现在我知道在哪里可以找到另一份拷贝了 :-) - IRTFM

1
为了将原始的调用列表强制转换为表达式,不需要使用sapply()。只需对c()结构中的一个组件使用as.expression()即可:
plot(1,1)
legend("bottomleft", 
       c(as.expression(bquote(theta == .(a))), bquote(theta == .(a))))

c() 将自动将整个 list 强制转换为 expression 类。


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