求助:使用stat_smooth结合geom_line绘制非逐点变化的平滑多折线图
解决ggplot中stat_smooth功能异常的问题
我仔细看了你的绘图代码,发现几个可能导致stat_smooth出问题的关键点,咱们一步步来排查修复:
1. 分组与颜色映射不一致
你在ggplot()全局映射里指定了colour = Day_Week,但geom_line却单独用group=Day Name``分组,同时stat_smooth还重复写了一遍aes映射。如果Day_Week和Day Name不是同一个变量,这会让分组逻辑彻底混乱——折线按Day Name分组,平滑曲线却按Day_Week分组,自然会出现异常。
建议统一分组规则:如果这两个变量是同一含义(比如只是命名不同),选其中一个同时作为分组和颜色的依据;如果含义不同,明确你希望平滑曲线按哪个变量分组。修改后的代码可以去掉stat_smooth里重复的aes:
Data_Arr %>% ggplot(aes(x=Period, y=M_Min, colour = Day_Week, group = Day_Week)) + geom_line() + # 分组与颜色保持一致 geom_hline(aes(yintercept= 120, linetype = "120MPM"), colour= 'lawngreen')+ ylim(0,200)+ stat_smooth() + # 直接继承全局映射,无需重复定义 theme_readable()
2. 检查Period变量的类型
如果Period是因子/字符串类型(比如像"早高峰""午间"这种分类值,或者是带格式的时间字符串),stat_smooth默认的loess拟合方法会失效——它需要连续的数值型x变量。你可以把Period转成数值型试试:
# 假设Period是类似"1""2""3"的因子,先转字符再转数值 Data_Arr$Period <- as.numeric(as.character(Data_Arr$Period)) # 再运行绘图代码 Data_Arr %>% ggplot(aes(x=Period, y=M_Min, colour = Day_Week, group = Day_Week)) + geom_line() + geom_hline(aes(yintercept= 120, linetype = "120MPM"), colour= 'lawngreen')+ ylim(0,200)+ stat_smooth(method = "loess") + # 显式指定拟合方法 theme_readable()
3. 调整stat_smooth的拟合参数
如果数据量较大,loess方法可能拟合不稳定,你可以换用更适合大样本的拟合方法,比如gam(广义加性模型),或者给线性模型加多项式公式:
# 用gam方法生成平滑曲线,同时关闭置信区间突出曲线 Data_Arr %>% ggplot(aes(x=Period, y=M_Min, colour = Day_Week, group = Day_Week)) + geom_line(alpha = 0.5) + # 给原始折线加透明度,避免和平滑曲线重叠 geom_hline(aes(yintercept= 120, linetype = "120MPM"), colour= 'lawngreen')+ ylim(0,200)+ stat_smooth(method = "gam", formula = y ~ s(x), se = FALSE) + theme_readable()
4. 排查数据异常
有时候stat_smooth失效是因为数据里存在NA值或极端异常值,你可以先清洗数据再绘图:
# 去除包含关键变量缺失值的行 Data_Arr_clean <- Data_Arr %>% drop_na(Period, M_Min, Day_Week) # 用清洗后的数据重新绘图
你可以先从统一分组和检查变量类型这两步入手,这应该能解决大部分常见的stat_smooth异常问题~
内容的提问来源于stack exchange,提问作者NColl
相关产品推荐
相关产品推荐

