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
相关产品推荐
相关产品推荐

