ggplot2绘制带均值线散点图报错:object 'i1' not found 问询
问题解决:ggplot绘制带均值线的散点图(含分组场景)
错误原因
你遇到的Error: object 'i1' not found是因为:geom_vline/geom_hline的xintercept/yintercept参数默认在全局环境查找变量,而非ggplot主数据(df)中的列。直接写i1会找不到对应的对象。
无分组场景的解决方案
方法1:直接引用数据框列(推荐)
不用创建新数据框,直接调用df$i1取均值(你已经把均值赋值给了df的每一行,取任意一行的值即可):
# 生成数据 df <- data.frame(x= rnorm(100), y= rnorm(100)) df$i1 <- mean(df$x) df$i2 <- mean(df$y) library(ggplot2) ggplot(data= df, mapping= aes(x= x, y= y)) + geom_point() + geom_vline(xintercept= df$i1[1]) + # 取第一行的均值即可,所有行值相同 geom_hline(yintercept= df$i2[1])
方法2:将截距放入aes()映射
把xintercept/yintercept放到aes()中,让ggplot从主数据中读取列:
ggplot(data= df, mapping= aes(x= x, y= y)) + geom_point() + geom_vline(aes(xintercept= i1)) + geom_hline(aes(yintercept= i2))
注:这种方式会为每一行数据绘制一条线,但所有线完全重合,视觉上和单条线无区别,仅效率略低。
分组场景的解决方案(结合facet_wrap)
针对你补充的分组数据场景,用facet_wrap拆分分组后,直接在aes()中绑定分组后的均值列即可:
library(tidyverse) # 生成分组数据 df <- data.frame(x= rnorm(100), y= rnorm(100), group= sample(1:2, 100, TRUE)) %>% group_by(group) %>% mutate(i1= mean(x), i2= mean(y)) # 绘制分组散点图+分组均值线 ggplot(df, aes(x=x, y=y)) + geom_point() + geom_vline(aes(xintercept= i1)) + geom_hline(aes(yintercept= i2)) + facet_wrap(~group) # 按group拆分分面
每个分面会自动显示对应分组的x、y均值线,无需额外创建数据框。
内容的提问来源于stack exchange,提问作者LulY
相关产品推荐
相关产品推荐

