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

8

示例代码:

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:
即使下面的答案有效,但对于更复杂的表达式(如下图),它似乎很不方便: 我仍然希望有一个更简单的解决方案。
2个回答

11

原来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无法实现的功能。我不确定到底发生了什么,但是它可行:

非常感谢Peter Dalgaard


2
我注意到,在ggplot2软件包的3.3.2版本中,scale_color_discrete()scale_color_manual()现在可以直接接受标签。这种改变可能更广泛地适用于其他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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接