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

R语言ggplot多变量散点图如何为男女分组添加最佳拟合线

实现方法

你当前使用宽表结构手动为两个性别分组单独添加散点层,要为两组分别添加独立最佳拟合线有两种可行写法:


方法1:最小改动,不调整现有数据结构

注意不要直接在现有代码末尾裸加geom_smooth(),你的全局aes只指定了x轴映射,没有绑定y轴和分组规则,裸加会报错。只要对应每个散点层,单独添加映射关系一致的拟合层即可:

ggplot(data, aes(x = tce*100)) + 
  geom_point(aes(y = Male_0602, colour = "Male")) +
  # 男性分组拟合线,示例为线性拟合,不需要置信区间可保留se=FALSE
  geom_smooth(aes(y = Male_0602, colour = "Male"), method = "lm", se = FALSE) +
  geom_point(aes(y = Female_0602, colour = "Female")) +
  # 女性分组拟合线
  geom_smooth(aes(y = Female_0602, colour = "Female"), method = "lm", se = FALSE) +
  labs(x = "Province-level tariff cut",
       y = "Change in province-level wage between 2001 and 2005",
       colour = "Gender")

方法2:转换为长表格式(更推荐,代码易维护)

ggplot2的图层逻辑更适配长格式数据,把性别维度转换为单独的分组列之后,不需要重复编写散点层和拟合层代码,ggplot会自动按颜色映射完成分组绘图,后续调整样式也不需要修改多个图层:

library(tidyr)
library(ggplot2)

# 宽表转长表:将Male_0602、Female_0602两列转换为「性别分组+工资变化值」两列
data_long <- pivot_longer(
  data,
  cols = c(Male_0602, Female_0602),
  names_to = "gender",
  values_to = "wage_change"
)

ggplot(data_long, aes(x = tce*100, y = wage_change, colour = gender)) +
  geom_point(alpha = 0.7) + # 给散点加透明度,避免点重叠遮挡
  geom_smooth(method = "lm", se = FALSE, linewidth = 1) +
  # 自定义图例标签,替换原始列名
  scale_colour_manual(values = c("#F8766D", "#00BFC4"), labels = c("Male", "Female")) +
  labs(
    x = "Province-level tariff cut",
    y = "Change in province-level wage between 2001 and 2005",
    colour = "Gender"
  )

常用参数调整

  • 若不需要线性拟合、想使用默认的局部加权平滑拟合线,直接删掉method = "lm"参数即可,geom_smooth会根据样本量自动选择适配的平滑算法
  • 若需要显示拟合线的95%置信区间,把se = FALSE改为se = TRUE即可,该参数默认值为TRUE
  • 若要调整拟合线样式,直接在geom_smooth()内传参即可:比如linetype = "dashed"可将线条设为虚线,linewidth = 1.2可调粗线条

内容的提问来源于stack exchange,提问作者anrisakaki96

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:03:20