ggplot的geom_hline调用时无法识别mean_y数据列问题咨询
报错原因
geom_hline的yintercept参数如果不放在美学映射aes()中,会默认从全局工作环境查找变量。你虽然通过管道运算给数据框新增了mean_y列,这个列已经被传入ggplot的关联数据集,但是unique(mean_y)是在全局环境直接求值,全局环境中没有定义名为mean_y的变量,因此触发报错。
解决方法
有3种常见的修正方案:
方案1:把yintercept放入美学映射
ggplot的美学映射aes()会自动从关联的数据集里读取字段,直接将yintercept写在aes()中即可,geom_hline会自动去重相同的截距值:
dat %>% group_by(groups) %>% mutate(mean_y = mean(y)) %>% ungroup() %>% ggplot()+aes(x = age, y = y) + geom_point(aes(color=groups)) + geom_hline(aes(yintercept = mean_y))
方案2:提前计算好均值向量再传入
你可以先单独计算分组均值,再把结果直接传给yintercept参数:
# 提前计算分组均值 mean_vals <- dat %>% group_by(groups) %>% summarise(mean_y = mean(y)) %>% pull(mean_y) # 绘图直接传入向量 ggplot(dat, aes(x = age, y = y)) + geom_point(aes(color=groups)) + geom_hline(yintercept = mean_vals)
方案3:用花括号包裹绘图逻辑,调用管道数据
用{}包裹ggplot代码,用.代指管道传递的数据集,直接提取数据集中的mean_y列:
dat %>% group_by(groups) %>% mutate(mean_y = mean(y)) %>% ungroup() %>% { ggplot(.) + aes(x = age, y = y) + geom_point(aes(color=groups)) + geom_hline(yintercept = unique(.$mean_y)) }
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

