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

如何使用ggpmisc的stat_poly_line将趋势线截距设为0?

在ggplot2中强制线性回归线过原点并计算R²的方法

方法一:使用ggpmisc包(适配你的现有流程)

直接在stat_poly_line()和stat_poly_eq()中指定过原点的线性模型公式即可,核心是用y ~ x + 0(或等价的y ~ 0 + x)强制截距为0:

library(ggplot2)
library(ggpmisc)

# 替换成你的实际数据框和变量名
df <- your_data_frame

ggplot(df, aes(x = x_var, y = y_var)) +
  geom_point() +
  # 绘制过原点的趋势线
  stat_poly_line(
    formula = y ~ x + 0, 
    color = "red", 
    linewidth = 1
  ) +
  # 计算并显示对应模型的R²
  stat_poly_eq(
    formula = y ~ x + 0,
    aes(label = paste(..rr.label.., sep = "~~~")),
    parse = TRUE,
    position = position_nudge(x = 1, y = 5) # 可根据图表调整标注位置
  ) +
  theme_minimal()

关键说明:

  • formula = y ~ x + 0明确告诉模型不拟合截距,只计算斜率,趋势线会严格经过(0,0)点。
  • stat_poly_eq()必须使用和趋势线完全相同的公式,否则计算出的R²会是带截距模型的结果,和趋势线不匹配。

方法二:基础lm模型 + geom_abline(无需ggpmisc)

如果不想依赖ggpmisc,可以手动拟合过原点的线性模型,再提取参数绘制直线并添加R²:

library(ggplot2)

df <- your_data_frame

# 拟合过原点的线性模型
zero_intercept_model <- lm(y_var ~ x_var + 0, data = df)
slope <- coef(zero_intercept_model)[["x_var"]]
r_squared <- round(summary(zero_intercept_model)$r.squared, 3)

ggplot(df, aes(x = x_var, y = y_var)) +
  geom_point() +
  geom_abline(slope = slope, color = "red", linewidth = 1) +
  # 添加R²标注
  annotate(
    "text", 
    x = max(df$x_var)*0.8, # 调整x轴标注位置
    y = max(df$y_var)*0.8, # 调整y轴标注位置
    label = paste0("R² = ", r_squared),
    color = "red"
  ) +
  theme_minimal()

注意事项

  • 只有当你的数据逻辑上支持“x=0时y=0”的假设时,才适合强制回归线过原点,否则会导致模型拟合偏差。
  • 上述两种方法得到的趋势线和R²结果,和Excel中“设置截距为0”的效果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:13:15