80

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

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

想法?

4

2 回答 2

81

最后一个失败的原因是要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 中的标记(或“名称”或“符号”)不应该以数字开头。因此,您可以通过引用或分隔1以及d非空格分隔符(*运算符)来绕过该限制。将纯数字文字与合法的 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不是 plotmath 函数,因此不会被解释,而是会出现“未处理”,其未处理的参数在括号内。

于 2013-06-27T05:37:32.040 回答
13

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

这里是:

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

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

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

为什么paste0()在这里不起作用超出了我的范围。

于 2013-06-27T04:53:08.243 回答