【问题标题】:Subscript letters in ggplot axis labelggplot轴标签中的下标字母
【发布时间】:2013-06-24 11:01:19
【问题描述】:

我正在尝试研究如何在轴标签中添加下标字母。

dat <- data.frame(x = rnorm(100), y = rnorm(100))
ggplot(dat, aes(x=x,y=y)) +
    geom_point() +
    labs(y=expression(Blah[1]))

dat <- data.frame(x = rnorm(100), y = rnorm(100))
ggplot(dat, aes(x=x,y=y)) +
    geom_point() +
    labs(y=expression(Blah[1d]))

第一个例子只是一个数字,只要你在方括号中有一个字符,它就会失败。 Blah[subscript(1d)] 本质上是我需要的,但我不知道如何让它让我在下标中有字母。我尝试过变体,包括paste()

以下示例提供了奇怪的行为:

labs(y=expression(Blah[12])) # this works
labs(y=expression(Blah[d])) # this works
labs(y=expression(Blah[d1])) # this works
labs(y=expression(Blah[1d])) # this fails

想法?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    最后一个失败的原因是expression 的参数通过 R 解析器运行,并且当它们未能通过测试它们是否可能是正确的 R 语法时返回错误。字符串或标记 1d 不是有效的 R 标记(或符号)。可以将其分解为有效的 R 标记并与非空格运算符“连接”、反引号或使用普通引号。我认为两者都比使用paste 更好:

     ggplot(dat, aes(x=x,y=y)) +
         geom_point() +
         labs(y=expression(Blah[1*d]))
     ggplot(dat, aes(x=x,y=y)) +
         geom_point() +
         labs(y=expression(Blah["1d"]))
    

    R 中的标记(或“名称”或“符号”)不应该以数字开头。因此,您可以通过引用或通过非空格分隔符 * 运算符分隔 1d 来绕过该限制。将纯数字文字与合法的 R 符号或标记“连接”或“连接”。

    要获得一个不下标的百分号:

     ggplot(dat, aes(x=x,y=y)) +
        geom_point() +
        labs(y=expression(Blah[1*d]*"%"))
    

    在 pct 符号周围加上括号:

    expression(Blah[1*d]*"(%)")
    

    % 字符在 R 解析中具有特殊含义,因为它表示用户定义的中缀运算符的开始。因此,将其用作文字需要引用它。同样的推理需要引用“for”和“in”,因为它们在 R 的“保留字”组中。还有其他保留字,(但 forin 是那些让我绊倒的词最常见。)类型:

     ?Reserved
    

    另一个“技巧”是在italic() 中的数字周围使用引号,如果您需要将它们斜体。未加引号的数字不会在该函数中变为斜体。

    注意事项:paste 是一个绘图函数除了,它的语义与base::paste function 不同。特别是,它没有“sep”参数。因此,打印的参数之间永远不能有空格,如果您尝试放入非空格项,则会在标记为 sep=" " 的所有其他参数之后出现一个实例。

    paste0 不是绘图函数,因此不会被解释,而是会显示为“未处理”,其未处理的参数位于括号内。

    【讨论】:

    • 感谢 DWin,不知道它被称为令牌。虽然它不在问题中(但在我的答案中),但你能在没有粘贴的下标之后得到 (%) 吗?
    • 特别感谢非空格分隔符,已经找了一段时间了。
    • ?plotmath 页面没有更好地描述语法要求,这一直让我感到惊讶。它只是说它就像普通的 R,但他们真的应该添加一个小段落来扩展它。
    【解决方案2】:

    好的。我发誓我发布这个并不是为了自己回答,尽管我很快就得到了它(当你提出问题时总是这样!)

    这里是:

    ggplot(dat, aes(x=x,y=y)) +
        geom_point() +
        labs(y=expression(Blah[1][d]))
    

    认为最好发布答案而不是删除问题,因为它可能有一天会帮助其他人。

    除了'Blahs',我真正想要的是expression(paste("Hb", A[1][c]," (%)",sep=""))

    为什么paste0() 在这里不起作用我无法理解。

    【讨论】:

    • paste0 不是绘图函数。 paste 是一个绘图函数,只是它的语义与 base::paste 函数不同。特别是它没有“sep”参数。
    • 在 R 表达式中,您需要引用任何特殊字符,如 % 或保留字如“in”
    猜你喜欢
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多