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

基于ggplot绘制Mann-Kendall检验结果图,整合Sen斜率估计值

解决Mann-Kendall检验与线性回归结果同图展示的问题

嘿,我明白你现在的问题啦——原来的ggplot函数能展示线性回归的R²、斜率和p值,但现在要把Mann-Kendall检验的Sen斜率估计值也加进去,在同一张图里同时展示两种检验结果,卡在了怎么提取Sen斜率的数值放到geom_label的文本里对吧?别担心,我来给你一步步解决:

第一步:准备所需工具包

首先我们需要trend包,它提供了Mann-Kendall检验和Sen斜率估计的专用函数,先安装并加载:

install.packages("trend")
library(ggplot2)
library(trend)

第二步:重构你的ggplot函数

我把原来的函数重构了一下,让它能同时计算线性回归和Mann-Kendall检验的结果,并且把两种结果都整合到图中的标签里:

ggplotRegressionMK <- function(data, x_col, y_col, title_text) {
  # 计算线性回归模型
  lm_fit <- lm(formula = paste(y_col, "~", x_col), data = data)
  # 进行Mann-Kendall检验和Sen斜率估计
  mk_test <- mk.test(data[[y_col]])
  sen_est <- sen.slope(data[[y_col]])
  
  # 提取需要展示的关键数值(保留3位有效数字)
  adj_r2 <- signif(summary(lm_fit)$adj.r.squared, 3)
  lm_slope_val <- signif(lm_fit$coef[[2]], 3)
  lm_p_val <- signif(summary(lm_fit)$coef[2,4], 3)
  sen_slope_val <- signif(sen_est$estimates, 3)
  mk_p_val <- signif(mk_test$p.value, 3)
  
  # 绘制图形
  ggplot(data, aes(x = .data[[x_col]], y = .data[[y_col]])) +
    geom_point() +
    geom_line() +
    # 把两种检验结果整合到标签中,用换行分隔更清晰
    geom_label(aes(x = 2000, y = 33, hjust = 0, vjust = 0,
                   label = paste("Linear Regression:\n",
                                 "R^2 = ", adj_r2, "\n",
                                 "Slope = ", lm_slope_val, "\n",
                                 "p-value = ", lm_p_val, "\n\n",
                                 "Mann-Kendall Test:\n",
                                 "Sen Slope = ", sen_slope_val, "\n",
                                 "p-value = ", mk_p_val)))+
    stat_smooth(method = "lm", col = "red") +
    xlab("Year") +
    ylab("Total Precipitation") +
    labs(title = title_text) +
    scale_y_continuous(limits = c(0, 40)) +
    theme(plot.title = element_text(hjust = 0.5))
}

第三步:使用函数绘图

假设你的数据框名为precip_data,其中年份列是Year,降水量列是Total_Precipitation,调用函数的方式如下:

ggplotRegressionMK(data = precip_data, 
                   x_col = "Year", 
                   y_col = "Total_Precipitation", 
                   title_text = "Pullman (1941–2018)")

关键说明

你之前的问题核心是不知道如何提取Sen斜率的数值——其实sen.slope()函数返回的对象里,$estimates就是我们需要的Sen斜率估计值,直接提取即可。另外我把原来的aes_string换成了更现代的.data[[col]]语法,避免了函数过时的问题,同时让代码更规范易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:49:26