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

如何在ggplot2图中自定义n阶多项式回归方程的各系数小数位数?

自定义ggplot2多项式回归方程的系数小数位数

你可以直接在lm_eqn函数中集成自定义小数位数列表,不需要单独处理每个系数。只需要给函数添加参数接收每个系数对应的小数位数,再用逐元素处理的方式对系数进行四舍五入即可。

初始效果与目标效果

初始图:
初始图

目标图:
目标图

数据

df <-  
structure(list(x0 = c(70.6, 20.85, 136.5, 110.5, 52.65, 95.05, 
99.05, 26.55, 28.7, 37.9, 124.5, 52.35, 113.5, 129.5, 40.25, 
37.25, 125, 215.5, 70.1, 171.5, 56.35, 44.85, 106.5, 110, 102.5, 
64.5, 85.75, 137, 253, 109.5, 146.5, 159.5, 83.85, 160, 215, 
125.5, 94.95, 150.5, 200.5, 111.5, 207.5, 63.35, 63.1, 94.5, 
143.5, 135, 62.65, 55.95, 161.5, 126.5, 49.55, 43.9, 87, 48.8, 
98, 163, 76, 60.5, 97.35, 62, 84, 54.25, 52.65, 54.2, 175.5, 
75.85, 202.5, 97, 181, 98, 33.7, 72.4, 252.5, 156, 46.9, 243, 
136, 127, 175.5, 169.5, 113, 144.5, 94, 96, 40.35, 60.75, 95.5, 
89.75, 48.35, 18.5, 43.8, 113.5, 27.1, 54.85, 65.25, 57.1, 46.05, 
66.75, 23.55, 94.3, 46.85, 60.75, 40.35, 96, 71, 94, 71.8, 60.95, 
62.35, 85.85, 76.3, 146.5, 128.5, 70.65, 96, 60.5, 67.95, 59.6, 
70.15, 70.8, 59.3, 158.5, 114.5, 30.6, 131.5, 64.25, 86.9, 71.1, 
62.85, 102.5, 51.1, 169.5, 47.15, 73.4, 77.35, 73.35, 99.5, 290.5, 
85.25, 108.5, 236, 74.05, 33.25, 97.5, 114.5, 64.2, 38.1, 59.2, 
124, 92, 165, 112, 113, 154.5, 119, 27.7, 113, 68.45, 50, 130, 
72.75, 18.8, 105.5, 141, 124, 139, 351.5, 137, 114.5, 72.75), 
y0 = c(-7.2, -9.7, -9, -47, -19.3, -0.0999999999999943, -0.0999999999999943, 
-9.1, -7.4, -9.8, 5, -6.7, -11, -11, -16.5, -12.5, -36, 3, 
-18.2, -5, -6.7, -21.7, -11, -6, -9, -13, -15.5, 18, 36, 
-1, -15, 11, -21.7, 26, 14, -19, -7.90000000000001, -5, 19, 
-5, 17, -16.7, -4.2, -27, -1, 8, 0.700000000000003, -25.9, 
7, -11, -13.1, -11.8, -30, -19.6, -12, -10, -28, -9, 3.3, 
-10, -26, -22.5, -11.3, -20.4, -7, 0.299999999999997, -43, 
-16, 2, -6, -11.4, -16.8, 15, -2, -13.8, 10, -16, -4, 21, 
-5, -10, -21, -10, -18, -16.7, -11.5, -15, -11.5, -6.7, -7, 
-13.6, -13, -10.2, -27.7, -6.5, -16.2, -18.1, -27.5, -13.1, 
-10.6, -17.7, -11.5, -16.7, -18, -16, -10, -5.59999999999999, 
-17.9, -14.7, -15.7, -16.6, -17, -5, -17.3, -8, -1, 4.09999999999999, 
-19.2, -6.3, -9.59999999999999, -8.6, -3, 1, -13.2, 3, -14.5, 
-11.8, 9.8, -23.7, -13, 3.8, 7, -8.3, -16.8, -14.7, -12.7, 
-7, 3, -16.5, -15, -30, -10.1, -8.5, -11, 3, -10.4, -34.2, 
-24.4, 8, -16, 20, -6, -20, -1, -4, -13.4, 0, -14.9, -10, 
-6, 0.5, -1.6, -1, 8, -4, -10, 11, 0, 3, 0.5)), class = "data.frame", row.names = c(NA, 
-170L))  

修改后的代码

支持自定义小数位数的lm_eqn函数

library(ggplot2)  

# 生成带自定义系数小数位数的回归方程
lm_eqn <- function(df, degree, digits_list, raw=TRUE){
  m <- lm(y0 ~ poly(x0, degree, raw=raw), df)  # 拟合4阶多项式模型
  # 按指定小数位数逐个处理系数
  cf <- mapply(function(coef_val, digit) round(coef_val, digit), 
               coef(m), digits_list)
  r2 <- round(summary(m)$r.squared, 4)  # R²保留4位小数
  powers <- paste0("^", seq(length(cf)-1))  # 生成多项式次数标签
  powers[1] <- ""  # x的1次幂省略^1标记
  
  # 拼接系数项(处理正负号)
  pcf <- paste0(ifelse(sign(cf[-1])==1, " + ", " - "), abs(cf[-1]),
                paste0("*italic(x)", powers), collapse = "")
  # 组合完整方程字符串
  eq <- paste0("italic(y) == ", cf[1], pcf, "*','", "~italic(r)^2==", r2)
  eq
}

绘图调用示例

这里指定4阶多项式每个系数的小数位数:常数项1位,x项3位,x²项6位,x³项9位,x⁴项12位(可根据目标图需求调整digits_list数值):

ggplot(df, aes(x0, y0)) +
  geom_point() +
  scale_y_continuous(limits = c(-50, 50), expand=c(0,0)) +
  stat_smooth(method = "lm", formula = y ~ poly(x, 4, raw = TRUE), linewidth = 1) +    
  annotate("text", x = 0, y = 45, 
           label = lm_eqn(df, 4, digits_list = c(1, 3, 6, 9, 12), raw = TRUE),
           hjust = 0, family = "Times", parse = TRUE, size = 4.5)

注意事项

  • digits_list的长度必须与多项式系数数量一致:n阶多项式包含n+1个系数(常数项 + n次项),4阶多项式需要5个元素的列表。
  • 可根据目标图的展示需求,灵活调整digits_list中每个位置的数值,实现不同系数保留不同小数位数的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:55:55