为pairs()函数绘制的带回归线的散点图添加斜率系数
实现pairs图上三角显示回归线斜率系数
你只需要自定义一个用于显示斜率的上三角面板函数,替换原来的panel.cor即可,以下是完整实现代码:
# 定义回归线绘制函数 reg <- function(x, y, col) abline(lm(y~x), col=col) # 自定义下三角面板:散点+回归线 panel.lm = function (x, y, col = par("col"), bg = NA, pch = par("pch"), cex = 1, col.smooth = "red", span = 2/3, iter = 3, ...) { points(x, y, pch = pch, col = col, bg = bg, cex = cex) ok <- is.finite(x) & is.finite(y) if (any(ok)) reg(x[ok], y[ok], col.smooth) } # 自定义上三角面板:显示回归线斜率系数 panel.slope <- function(x, y, digits = 2, cex.cor = 1, ...) { # 过滤有效数据点 ok <- is.finite(x) & is.finite(y) if (sum(ok) < 2) { text(0.5, 0.5, "-", cex = cex.cor) return() } # 拟合线性模型并提取斜率(第二个系数为x的斜率) slope <- coef(lm(y[ok] ~ x[ok]))[2] # 格式化斜率文本,保留指定小数位数 slope_text <- sprintf(paste0("%.", digits, "f"), slope) # 在面板中心显示斜率 text(0.5, 0.5, slope_text, cex = cex.cor) } # 生成pairs图 pairs(iris[1:4], panel = panel.lm, upper.panel = panel.slope)
关键部分说明
panel.slope函数中,先过滤掉非数值/缺失值,避免拟合模型报错;当有效数据点不足2个时,显示-占位。- 通过
coef(lm(y~x))[2]提取回归线斜率:线性模型lm(y~x)的系数结果中,第一个是截距,第二个就是x对应的斜率系数。 - 用
sprintf格式化斜率的显示位数,你可以修改digits参数调整小数位数(比如改成3就保留3位小数)。
扩展:同时显示斜率和p值
如果需要在上三角同时展示斜率和对应的显著性p值,可以修改面板函数为:
panel.slope_p <- function(x, y, digits = 2, p_digits = 3, cex.cor = 1, ...) { ok <- is.finite(x) & is.finite(y) if (sum(ok) < 2) { text(0.5, 0.5, "-", cex = cex.cor) return() } model <- lm(y[ok] ~ x[ok]) slope <- coef(model)[2] p_val <- summary(model)$coefficients[2,4] # 分行显示斜率和p值 display_text <- sprintf("slope: %.%df\np: %.%df", digits, slope, p_digits, p_val) text(0.5, 0.5, display_text, cex = cex.cor) } # 调用时替换upper.panel参数 pairs(iris[1:4], panel = panel.lm, upper.panel = panel.slope_p)
内容的提问来源于stack exchange,提问作者Amanda
相关产品推荐
相关产品推荐

