如何在geom_hline()中访问aes()中映射的变量?
解决方法
方法1:用stat_summary替代geom_hline
stat_summary可以直接复用ggplot主图层中映射的y变量,自动计算均值并绘制水平线,无需重复指定数据集列名:
ggplot(mtcars, aes(x = hp, y = qsec)) + geom_point() + stat_summary(fun = mean, geom = "hline", color = "black")
这里fun = mean指定计算均值,geom = "hline"告诉stat_summary用水平线的形式呈现结果。
方法2:提前计算均值存入变量
如果坚持要用geom_hline,可以先把y变量的均值单独计算出来,再传入yintercept参数,避免重复写mtcars$qsec:
y_avg <- mean(mtcars$qsec) ggplot(mtcars, aes(x = hp, y = qsec)) + geom_point() + geom_hline(yintercept = y_avg)
关于{{ }}语法的适用场景
{{ }}是tidy eval(整洁评估)的语法,主要用于自定义函数封装ggplot代码时,传递映射变量。比如你想写一个通用函数,支持传入不同的y变量并添加均值线,就可以用它:
library(rlang) plot_add_mean_line <- function(data, y_col) { # 先提取y变量的名称并计算均值 y_name <- as_name(enquo(y_col)) y_mean <- mean(data[[y_name]]) ggplot(data, aes(x = hp, y = {{ y_col }})) + geom_point() + geom_hline(yintercept = y_mean) } # 调用函数 plot_add_mean_line(mtcars, qsec)
直接在geom_hline的yintercept里用mean({{ y }})会报错,因为geom_hline的这个参数不在aes映射的上下文里,无法识别{{ y }}指代的变量。
内容的提问来源于stack exchange,提问作者swolf
相关产品推荐
相关产品推荐

