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 符号来获取上标,但总的来说,我认为必须有一种方法来组合数学表达式和存储在对象中的计算值。
我试过 eval
和 paste
的各种组合,但似乎我一直 运行 遇到同样的问题。
编辑#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))
示例代码:
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
根据 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))