如何用tidyverse代码在ggplot中连接分组均值点?
解决方案:分组均值点连线的tidyverse实现
问题背景
你已完成以下操作:
- 绘制连续变量散点图并添加拟合曲线:
mtcars %>% ggplot(aes(x=mpg, y = disp)) + geom_point() + geom_smooth(method="auto", se=TRUE, fullrange=FALSE, level=0.95)
- 使用
cut将mpg分为5个区间,计算每组disp的均值并绘制点图:
mtcars %>% mutate(mpg_groups = cut(mpg, 5)) %>% group_by(mpg_groups) %>% mutate(mean_disp = mean(disp)) %>% ggplot(aes(x=mpg_groups, y = mean_disp)) + geom_point()
但mpg_groups是因子变量,直接用geom_smooth无法连接均值点,以下是两种简洁的解决方式:
方法一:直接对因子轴均值点连线
用geom_line替代geom_smooth,通过group=1强制将所有因子水平视为同一组,确保连线顺序正确(cut默认生成有序因子,也可显式指定ordered=TRUE):
mtcars %>% mutate(mpg_groups = cut(mpg, 5, ordered = TRUE)) %>% group_by(mpg_groups) %>% summarise(mean_disp = mean(disp)) %>% # 用summarise直接生成每组均值,避免冗余数据行 ggplot(aes(x = mpg_groups, y = mean_disp)) + geom_point(size = 2) + geom_line(group = 1) # 关键参数:强制所有点归为同一组进行连线
方法二:转换为连续轴(推荐,支持拟合曲线)
提取区间中点作为连续型x轴变量,既可以直接连线,也能正常使用geom_smooth添加拟合趋势:
mtcars %>% mutate(mpg_groups = cut(mpg, 5, ordered = TRUE), # 提取区间上下限并计算中点 mpg_mid = (as.numeric(sub("\\((.*),(.*)\\]", "\\1", mpg_groups)) + as.numeric(sub("\\((.*),(.*)\\]", "\\2", mpg_groups))) / 2) %>% group_by(mpg_groups, mpg_mid) %>% summarise(mean_disp = mean(disp)) %>% ggplot(aes(x = mpg_mid, y = mean_disp)) + geom_point(size = 2) + geom_line() + # x为连续变量,无需额外指定group参数 geom_smooth(method = "lm", se = TRUE, color = "red") # 可选添加线性拟合线
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

