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

时间:2016-03-12 11:35:42

标签: r ggplot2 plotmath

示例代码:

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))),如下所示:

==

原来只会将图例呈现为{{1}}。

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

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

2 个答案:

答案 0 :(得分:5)

原来bquote的事情很接近 这有效(虽然感觉......不是最理想的):

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

还在工作:

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

显然~需要&#34;粘贴&#34;元素在一起,实际上没有paste()它们?并as.expression执行expression无法做到的事情。我不确定到底发生了什么,但唉,它有效:

非常感谢,Peter Dalgaard

答案 1 :(得分:0)

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

ggplot with bquoted color labels