在含LM、GAM散点图的GGally::ggpairs图中添加R²与P值的问题
解决方案
你需要修改自定义面板函数,在拟合模型后提取R²与P值,再将统计文本标注到面板上,修正后的完整代码如下:
library(tidyverse) library(mgcv) library(GGally) # 数据准备部分保留原有逻辑 sel1<-select(rekap,c('Total_Ni', 'Total_Mg', 'Total_Fe', 'CEC', 'pH','SWC')) # 自定义下三角面板:LM模型 + 统计值标注 lm_panel <- function(data, mapping, ...){ # 提取x、y变量名 x_var <- as_name(mapping$x) y_var <- as_name(mapping$y) # 拟合LM模型 fit <- lm(formula = paste(y_var, "~", x_var), data = data) # 提取R²和P值 r2 <- summary(fit)$r.squared |> round(3) p_val <- summary(fit)$coefficients[2,4] |> round(4) # 格式化统计文本,P值小于0.0001时可自行调整为P<0.0001的显示逻辑 stat_label <- paste0("R² = ", r2, "\nP = ", p_val) p <- ggplot(data = data, mapping = mapping) + geom_point(size = 0.8) + geom_smooth(method = "lm", colour = "orangered2", se = TRUE, linewidth = 0.8) + # 左上角标注统计值,字号、位置可根据需求调整 annotate("text", x = Inf, y = Inf, label = stat_label, hjust = 1.1, vjust = 1.1, size = 2.5, colour = "orangered2") return(p) } # 自定义上三角面板:GAM模型 + 统计值标注 gam_panel <- function(data, mapping, ...){ x_var <- as_name(mapping$x) y_var <- as_name(mapping$y) # 拟合GAM模型,默认用s()平滑项,自由度可根据需求调整 fit <- gam(formula = paste(y_var, "~ s(", x_var, ")"), data = data) # 提取GAM的调整R²和显著性P值 r2 <- summary(fit)$r.sq |> round(3) p_val <- summary(fit)$s.table[4] |> round(4) stat_label <- paste0("R² = ", r2, "\nP = ", p_val) p <- ggplot(data = data, mapping = mapping) + geom_point(size = 0.8) + geom_smooth(method = "gam", colour = "blue", se = TRUE, linewidth = 0.8, formula = y ~ s(x)) + annotate("text", x = Inf, y = Inf, label = stat_label, hjust = 1.1, vjust = 1.1, size = 2.5, colour = "blue") return(p) } # 绘制配对图 p1 <- ggpairs(sel1, columnLabels = c("Total Ni", "Total Mg", "Total Fe", "CEC", "pH","SWC"), upper = list(continuous = gam_panel), lower = list(continuous = lm_panel), # 调整对角面板密度图样式,不需要可删除 diag = list(continuous = wrap("densityDiag", fill = "grey80", alpha = 0.5)))+ theme_bw() + theme(axis.text.x = element_text(size=rel(0.7), angle=0), axis.text.y = element_text(size=rel(0.7), angle=0), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.border = element_rect(fill = NA,colour = "grey35"), strip.background = element_rect(fill = "grey90")) # 输出结果 print(p1)
关键修正说明
- 自定义函数内使用传入的
data参数而非全局变量sel1,避免面板数据匹配异常 - 拟合模型后直接提取对应统计值,标注位置、字号、颜色可根据展示需求灵活调整
- GAM默认使用单变量平滑项
s(x),如果需要调整平滑自由度或模型形式,可修改gam函数的formula参数
内容的提问来源于stack exchange,提问作者Moh Zulfajrin
相关产品推荐
相关产品推荐

