R / ggplot2:评估表达式内部的对象

R / ggplot2: Evaluate object inside expression

示例代码:

rsq <- round(cor(mtcars$disp, mtcars$mpg)^2, 2) # rsq = 0.72

ggplot(mtcars, aes(x = disp, y = mpg)) +
  geom_point() +
  geom_smooth(method = lm, aes(color = "Linear")) +
  scale_color_discrete(labels = expression(paste("R"^2, " = ", rsq)))

我希望图例显示为 R² = 0.72
我知道我可以只使用 ² 的 unicode 符号来获取上标,但总的来说,我认为必须有一种方法来组合数学表达式和存储在对象中的计算值。

我试过 evalpaste 的各种组合,但似乎我一直 运行 遇到同样的问题。

编辑#1:
我尝试使用 bquote 根据 to this answer 像这样:

scale_color_discrete(labels = bquote(R^2 == .(rsq)))

原来只将图例呈现为 ==

编辑#2:
尽管下面的答案有效,但似乎......对于更复杂的表达式来说非常不方便,就像这样:

我仍然希望有一个更简单的解决方案。

原来 bquote 事情已经结束了。
这有效(尽管感觉……次优):

  scale_color_discrete(labels = as.expression(bquote(R^2~"="~.(rsq))))

也在工作:

 scale_color_discrete(labels = as.expression(bquote(R^2 == .(rsq))))

显然 ~ 需要将这些元素 "paste" 在一起,而不是实际 paste() 对它们? as.expression 做到了 expression 做不到的事情。我不确定到底发生了什么,但唉,它有效:

非常感谢,Peter Dalgaard

我注意到,从 ggplot2 包的版本 3.3.2 开始,scale_color_discrete()scale_color_manual() 现在都直接接受 bquote() 标签。据推测,此更改更广泛地适用于其他 scale_ 函数,但我没有进行更广泛的测试。

虽然 geom_line(aes(color = bquote(...)))geom_line(aes(color = as.expression(bquote(...)))) 等更简单的方法仍然被拒绝,因为它们具有无效的美学。

data = data.frame(x = seq(0, 5, length.out = 50))
data$exp1 = 1 - exp(-data$x)
data$exp0.5 = 1 - exp(-0.5 * data$x)
ggplot(data, aes(x = x)) + geom_line(aes(y = exp1, color = "exp1")) + 
  geom_line(aes(y = exp0.5, color = "exp0.5")) +
  scale_color_manual(labels = c(bquote(1 - e^-x), bquote(1 - e^"-0.5x")), values = c("blue", "green")) + # or scale_color_discrete(labels = c(bquote(1 - e^-x), bquote(1 - e^"-0.5x")))
  labs(y = "y") + theme(legend.position = c(0.8, 0.15))