如何使用plotmath将表达式放置在另一个表达式之上

时间:2019-11-27 16:23:58

标签: r ggplot2 plotmath

如果要生成多行表达式,可以执行以下操作:

over = 'OVER'
below = 'BELOW'

x_lab_title = bquote(atop(.(over), .(below)))

ggplot(data.frame()) + xlab(x_lab_title)

但是,我想自己制作overbelow表达式,例如:

over = expression(X^2)
below = expression(Y^2)

但是它不起作用-而是呈现空白(为什么?)。在我的场景中,实际表达式要复杂得多,自动生成,并且在我生成的后续图之间进行更改,因此我不能简单地这样做:

x_lab_title = bquote(X^2, Y^2)

在这种情况下可以使用,但不适用于overbelow的任何其他值。

2 个答案:

答案 0 :(得分:3)

问题在于R中的expression()实际上更像是一个表达式容器。您真正想要的是表达式对象内的语言对象。所以你可以做

over = expression(X^2)
below = expression(Y^2)
x_lab_title = bquote(atop(.(over[[1]]), .(below[[1]])))

,甚至更好的是,跳过expression()并仅使用quote()

over = quote(X^2)
below = quote(Y^2)
x_lab_title = bquote(atop(.(over), .(below)))

答案 1 :(得分:0)

经过数小时的反复试验,找到了解决方案-这对我有用:

atop_string = paste0('bquote(atop(', toString(over), ',', toString(below), '))')
x_lab_title = eval(parse(text=atop_string))

此解决方案首先组装等效的代码表示形式,然后将其解析为表达式。

即使我自己找到了解决方案,我仍然好奇为什么不能简单地将表达式嵌入atop中?