You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:40:58