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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:38:37