ggplot2 spaghetti图添加loess回归线、中位数(IQR)或均值(SD)方法求助
问题原因
- 两次运行异常的核心诱因是
ggplot全局美学映射中设置了group=ID,后续统计图层默认继承该分组规则,导致统计计算按每个ID单独执行:- 绘制LOESS线时,系统会为每个ID单独拟合曲线,多数ID仅2~3个观测值,达不到LOESS拟合的样本要求,因此抛出大量警告
- 绘制中位数线时,
stat_summary的fun.df参数要求传入的是函数名而非提前计算好的数据框,且按ID分组后计算的中位数也不是你需要的整体变化趋势
解决方案
方案1:添加整体LOESS非线性趋势线
给geom_smooth单独设置group=1覆盖全局ID分组即可,代码如下:
# 注意你定义的数据集名为mydata,原代码中soquestiondata需替换为mydata sp_loess <- ggplot(mydata, aes(x=age, y=continuous_outcome, group=ID, color=ID)) + geom_point() + geom_line() + xlab("年龄(岁)") + ylab("连续结局变量") + theme(legend.position = "none") + # group=1表示所有数据作为整体拟合,颜色固定为红色,se=FALSE可关闭置信区间阴影 geom_smooth(method="loess", formula=y~x, group=1, color="red", se=TRUE) sp_loess
方案2:添加中位数趋势线
无需提前计算中位数,直接通过stat_summary指定计算逻辑与整体分组即可:
sp_median <- ggplot(mydata, aes(x=age, y=continuous_outcome, group=ID, color=ID)) + geom_line() + geom_point() + # fun指定统计函数为中位数,group=1表示整体计算,linewidth调整线宽 stat_summary(fun = median, group=1, color="red", geom="line", linewidth=1) + xlab("年龄(岁)") + ylab("连续结局变量") + theme(legend.position = "none") sp_median
如果需要展示分箱的中位数散点,把geom="line"改为geom="point"即可。
内容的提问来源于stack exchange,提问作者tcvdb1992
相关产品推荐
相关产品推荐

