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

技术求助:如何用ggplot绘制中位数上下的两条回归线?

解决方法:分组拟合回归线

你之前用geom_hline的思路不对——这个函数是用来画水平参考线的,不是带斜率的回归线(回归线和x轴变量直接相关)。要实现“中位数上下各一条回归线”的需求,正确做法是先按中位数给数据分组,再分别拟合每组的回归线。

步骤1:预处理数据,添加分组标记

假设你的数据框是df,其中age是年龄变量,y是你要分析的响应变量。先计算y的中位数,给每个观测标记属于“中位数以上”还是“中位数以下”组:

library(dplyr)
library(ggplot2)

# 计算y的中位数并添加分组列
df <- df %>%
  mutate(y_group = ifelse(y > median(y), "中位数以上", "中位数以下"))

步骤2:绘制分组回归线

用geom_smooth指定线性拟合方法,按分组分别画回归线:

ggplot(df, aes(x = age, y = y, color = y_group)) +
  geom_point(alpha = 0.5) +  # 散点增加透明度,避免数据重叠
  geom_smooth(method = "lm", se = FALSE) +  # 拟合线性回归线,se=FALSE关闭置信区间
  geom_hline(yintercept = median(df$y), linetype = "dashed", color = "black") +  # 可选:添加中位数水平参考线
  labs(
    title = "年龄与响应变量的分组回归线",
    x = "年龄",
    y = "响应变量",
    color = "分组"
  ) +
  theme_minimal()

如果是按年龄中位数分组(更贴合“年龄潜在效应”的需求)

如果你想展示年龄高于/低于中位数的两组各自的回归线,只需修改分组逻辑:

# 按年龄中位数分组
df <- df %>%
  mutate(age_group = ifelse(age > median(age), "年龄高于中位数", "年龄低于中位数"))

# 绘图
ggplot(df, aes(x = age, y = y, color = age_group)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "lm", se = FALSE) +
  geom_vline(xintercept = median(df$age), linetype = "dashed", color = "black") +  # 添加年龄中位数垂直参考线
  labs(
    title = "年龄分组与响应变量的回归线",
    x = "年龄",
    y = "响应变量",
    color = "年龄分组"
  ) +
  theme_minimal()

关于你之前的问题说明

  • 你写的geom_hline (aes(yintercept = median(df$y)有语法错误(缺少闭合括号),正确写法应为geom_hline(yintercept = median(df$y))(不需要aes,因为是固定值)。
  • 合并两个图表的方法冗余,直接在同一图中分组拟合更简洁高效。

内容的提问来源于stack exchange,提问作者Yacila

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:45:20