如何在Base R中翻转GAM绘图的X轴与Y轴?
在Base R中翻转GAM绘图的XY轴
要解决这个问题,核心思路是先提取plot.gam()生成的绘图数据,再手动交换XY轴重新绘制——直接反转输入变量拟合模型会改变平滑效应的含义,和原模型的输出逻辑完全无关。
具体步骤
- 提取绘图数据:调用
plot.gam()时设置returnData = TRUE,该参数会让函数返回每个平滑项的拟合值、自变量取值、标准误等绘图核心数据,而非直接生成图像。 - 手动绘制翻转图:对提取到的每个平滑项数据,交换原XY轴的角色(用原拟合效应作为新X轴,原自变量作为新Y轴),并还原置信区间等元素。
代码示例
以mgcv包拟合的GAM模型为例:
# 加载包并拟合示例模型 library(mgcv) set.seed(123) dat <- gamSim(1, n = 400, dist = "normal", scale = 2) mod <- gam(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = dat) # 提取绘图数据(pages=1避免分页,returnData=TRUE返回数据而非绘图) plot_data <- plot(mod, pages = 1, returnData = TRUE) # 批量绘制所有平滑项的翻转图 par(mfrow = c(2, 2)) # 设置2x2的绘图布局 for (i in seq_along(plot_data)) { d <- plot_data[[i]] term <- names(plot_data)[i] var_name <- gsub("s\\((.*)\\)", "\\1", term) # 提取自变量名称 # 初始化空图框 plot(d$fit, d$x, type = "n", xlab = "平滑效应", ylab = var_name, main = paste(term, "翻转图")) # 添加灰色置信区间带 polygon(c(d$fit + d$se, rev(d$fit - d$se)), c(d$x, rev(d$x)), col = "lightgray", border = NA) # 叠加拟合曲线 lines(d$fit, d$x, lwd = 2) } par(mfrow = c(1, 1)) # 还原布局
关键说明
plot.gam()返回的plot_data是一个列表,每个元素对应一个平滑项,包含x(自变量取值)、fit(平滑拟合效应)、se(标准误)等字段。- 用
polygon()绘制置信区间时,需要将原fit±se的序列反转,配合原自变量序列的反转,才能生成闭合的填充区域。 - 这种方法完全基于原模型的拟合结果,不会改变GAM的核心计算逻辑,只是调整了绘图的轴映射关系。
内容的提问来源于stack exchange,提问作者Superdog38
相关产品推荐
相关产品推荐

