如何在R中基于group_by生成的散点图叠加不同回归模型的拟合曲线
R 语言 ggplot2 不同分组绘制不同回归模型曲线的实现方案
确保已加载tidyverse套件(包含dplyr、ggplot2等所需工具包),无需合并不同类型的模型对象,按分组生成拟合值数据集后传入绘图图层即可实现需求,具体代码如下:
步骤1:生成分组拟合线数据集
fit_data <- df %>% group_by(Id) %>% group_modify(~ { if (.y$Id == "Ga") { # Ga组拟合线性模型 mod <- lm(Increment ~ Weight, data = .x) # 在Ga组Weight取值范围内生成100个均匀分布的点用于绘制平滑曲线 x_seq <- seq(min(.x$Weight), max(.x$Weight), length.out = 100) data.frame(Weight = x_seq, Increment = predict(mod, newdata = data.frame(Weight = x_seq))) } else if (.y$Id == "Aa") { # Aa组拟合指数模型 mod <- lm(log(Increment) ~ Weight, data = .x) x_seq <- seq(min(.x$Weight), max(.x$Weight), length.out = 100) # 对log转换后的预测值做exp还原,匹配原始Increment的量纲 data.frame(Weight = x_seq, Increment = exp(predict(mod, newdata = data.frame(Weight = x_seq)))) } else { # Za组不生成拟合数据,直接返回空 NULL } }) %>% ungroup()
步骤2:绘制最终图形
ggplot(df, aes(x = Weight, y = Increment, color = Id)) + geom_point() + # 传入自定义拟合数据集绘制回归曲线,linewidth可按需调整粗细 geom_line(data = fit_data, linewidth = 1)
实现逻辑说明
- 用
group_modify按Id字段分组处理数据,根据分组类别选择对应的模型进行拟合 - 对需要绘制曲线的分组,在自变量的取值范围内生成均匀分布的序列,计算对应预测值生成平滑曲线所需的数据集
- 指数模型拟合时对因变量做了log转换,预测值需要调用
exp()还原到原始数据的量纲 - Za组直接返回空值,不会生成拟合数据,自然不会在图中绘制曲线
内容的提问来源于stack exchange,提问作者Mata
相关产品推荐
相关产品推荐

