如何使用 plotmath 将一个表达式放在另一个表达式之上
How to place an expression on top of another expression using plotmath
如果我想生成多行表达式,我可以这样做:
over = 'OVER'
below = 'BELOW'
x_lab_title = bquote(atop(.(over), .(below)))
ggplot(data.frame()) + xlab(x_lab_title)
不过,我想自己制作 over
和 below
表达式,例如:
over = expression(X^2)
below = expression(Y^2)
但它不起作用 - 而是呈现空白 space(这是为什么?)。在我的场景中,真实的表达式要复杂得多,是自动生成的,并且在我生成的后续图之间不断变化,因此我不能简单地做:
x_lab_title = bquote(X^2, Y^2)
在这种特殊情况下会起作用,但不适用于 over
和 below
.
的任何其他值
经过几个小时的反复试验找到了解决方案 - 这对我有用:
atop_string = paste0('bquote(atop(', toString(over), ',', toString(below), '))')
x_lab_title = eval(parse(text=atop_string))
此解决方案首先组装等效代码表示,然后将其解析为表达式。
尽管我自己找到了解决方案,但我仍然很好奇为什么我不能简单地在 atop
中嵌入表达式?
问题在于 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)))
如果我想生成多行表达式,我可以这样做:
over = 'OVER'
below = 'BELOW'
x_lab_title = bquote(atop(.(over), .(below)))
ggplot(data.frame()) + xlab(x_lab_title)
不过,我想自己制作 over
和 below
表达式,例如:
over = expression(X^2)
below = expression(Y^2)
但它不起作用 - 而是呈现空白 space(这是为什么?)。在我的场景中,真实的表达式要复杂得多,是自动生成的,并且在我生成的后续图之间不断变化,因此我不能简单地做:
x_lab_title = bquote(X^2, Y^2)
在这种特殊情况下会起作用,但不适用于 over
和 below
.
经过几个小时的反复试验找到了解决方案 - 这对我有用:
atop_string = paste0('bquote(atop(', toString(over), ',', toString(below), '))')
x_lab_title = eval(parse(text=atop_string))
此解决方案首先组装等效代码表示,然后将其解析为表达式。
尽管我自己找到了解决方案,但我仍然很好奇为什么我不能简单地在 atop
中嵌入表达式?
问题在于 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)))