基于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
相关产品推荐
相关产品推荐

