如何在ggplot2诊断图(ggfortify autoplot)中调整平滑线线宽?
解决ggfortify autoplot中平滑线线宽无法调整的问题
嘿,我明白你遇到的困扰了——smooth.linesize参数在ggfortify::autoplot.lm()里确实不起作用,这是因为ggfortify的这个函数并没有把这个参数暴露出来给用户直接调用。不过我们有两种简单的方法可以解决这个问题:
方法1:修改已生成的ggplot对象
你可以先通过autoplot生成基础图形,然后手动修改平滑线图层的线宽参数:
library(ggfortify) library(ggplot2) model1 <- lm(len~dose*supp, data = ToothGrowth) # 先生成基础诊断图 p <- autoplot(model1, which = 1, label.size = 3, data = ToothGrowth, size=3, colour = "dose", smooth.colour = 'darkblue', smooth.linetype="dotted") # 提取图形结构并修改平滑线线宽 p_build <- ggplot_build(p) # 平滑线对应的是第2个图层(索引从1开始),修改linewidth参数(ggplot2 3.4.0+用linewidth,旧版本用size) p_build$data[[2]]$linewidth <- 3 # 重新构建并绘制图形 p_updated <- ggplot_gtable(p_build) plot(p_updated)
这个方法的原理是:autoplot生成的残差图里,平滑线是一个geom_smooth图层,我们通过ggplot_build()获取图形的底层数据,直接修改线宽参数后再重新渲染。
方法2:手动构建残差拟合图(更灵活可控)
如果觉得修改图层太绕,也可以完全脱离ggfortify,用ggplot直接绘制残差图,这样所有元素都能自定义:
library(ggplot2) model1 <- lm(len~dose*supp, data = ToothGrowth) # 准备包含残差、拟合值和原数据列的数据集 resid_data <- data.frame( fitted_values = fitted(model1), residuals = residuals(model1), dose = ToothGrowth$dose, supp = ToothGrowth$supp ) # 手动绘制残差-拟合值图 ggplot(resid_data, aes(x = fitted_values, y = residuals, colour = factor(dose))) + geom_point(size = 3) + # 设置散点大小 geom_smooth( method = "loess", # 和autoplot默认的平滑方法一致 colour = "darkblue", linetype = "dotted", linewidth = 3, # 这里直接设置线宽即可 se = FALSE # 关闭置信区间,和autoplot默认一致 ) + labs(x = "Fitted values", y = "Residuals") + theme_bw()
这种方法的好处是你能完全掌控每个元素的样式,不需要受限于ggfortify的参数限制。
补充说明
为什么smooth.linesize无效?因为ggfortify的autoplot.lm()函数在构建平滑线时,只实现了smooth.colour、smooth.linetype等少数参数的传递,并没有支持smooth.linesize,所以直接传入这个参数不会有任何效果。
内容的提问来源于stack exchange,提问作者Baltazár Tivadar
相关产品推荐
相关产品推荐

