ggplot轴标签中的下标字母


71

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

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

有什么想法吗?

Answers:


75

最后一个失败的原因是表达式的参数通过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解析中具有特殊含义,因为它表示用户定义的中缀运算符的开始。因此,将其用作文字需要对其进行引用。同样的道理要求“为”和“”被引用,因为它们是“保留字”组R.中还有其他的保留字,(但forin是那些行程我最常发生。)类型:

 ?Reserved

另外一个“技巧”是,italic()如果需要斜体,请在数字内使用引号。未引用的数字不会在该函数内变为斜体。

注意事项:paste是绘图函数, 它的语义与有所不同base::paste function。特别是它没有“ sep”参数。因此,您永远无法在打印的参数之间获得空格,并且如果您尝试放置非空格项目,则所有其他参数之后都会出现一个实例。

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


感谢DWin,不知道它被称为令牌。虽然不是问题所在(而是我的答案),但下标后不粘贴就可以得到(%)吗?
nzcoops

1
特别感谢非空格分隔符,已经寻找了一段时间。
JelenaČuklina

令我惊讶的是,该?plotmath页面在描述语法要求方面做得更好。它只是说它与常规R一样,但是他们确实应该添加一小段对此进行扩展。
IRTFM '18

11

好的。我发誓,尽管我很快就收到了它,但我并没有发布它只是为了自己回答(总是问你问题的方式!)

这里是:

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

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

除了“布拉斯”,我真正想要的是 expression(paste("Hb", A[1][c]," (%)",sep=""))

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


7
paste0不是绘图函数。paste是散点图函数,只是它的语义与base::paste函数不同。特别是它没有“ sep”参数。
IRTFM 2013年

在R表达式中,您需要引用任何特殊字符,%如“ in”或保留字,例如
inrtm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.