7

示例代码:

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 符号来获取上标,但总的来说,我认为必须有一种方法可以将数学表达式和存储在对象中的计算值结合起来。

我试图玩弄eval和各种组合paste,但似乎我一直遇到同样的问题。

编辑#1:
我尝试bquote根据这个答案使用,如下所示:

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

事实证明,这只会将图例呈现为==.

编辑#2:
即使下面的答案有效,但似乎......对于更复杂的表达式非常不方便,如下所示:

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

4

2 回答 2

9

事实证明bquote事情已经接近了。
这行得通(尽管感觉……不太理想):

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

也在工作:

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

显然~需要将元素“粘贴”在一起,而不是实际使用paste()它们?并且as.expression做了expression不能做的事。我不确定到底发生了什么,但是唉,它有效:

非常感谢,彼得·达尔加德

于 2016-03-12T14:50:05.893 回答
1

我注意到,从 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))

带有 bquoted 颜色标签的 ggplot

于 2020-08-17T14:36:43.013 回答