如何在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
相关产品推荐
相关产品推荐

