【问题标题】:multiple bquote items in legend of an R plotR图的图例中的多个bquote项目
【发布时间】:2011-08-26 20:39:52
【问题描述】:

以下作品,(复制并粘贴到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))))

我尝试了很多更复杂的表达式,但都不起作用。

我们将不胜感激。

【问题讨论】:

    标签: r plot legend plotmath


    【解决方案1】:

    在这种情况下,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 强制对表达式的原始调用列表:

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

    【讨论】:

    • @Gavin:我似乎记得几年前在 Rhelp 上的一次长时间交流,Thomas Lumley 终于想出了一个 sapply(..., as.expression) 解决方案。我曾尝试在其他场合找到它但没有成功,但现在我知道在哪里可以找到另一个副本:-)
    【解决方案2】:

    要强制调用表达式的原始列表,不必使用sapply()。只需将as.expression() 用于c() 构造中的一个组件即可:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-12
      • 2012-05-10
      • 2018-04-09
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 2019-11-17
      • 2014-09-19
      相关资源
      最近更新 更多