smplot2绘图中重复异常值来源排查及移除求助
解决sm_raincloud图中pre-m时间点重复异常值问题
第一步:先排查数据本身
异常值大概率来自原始数据,先确认match1中pre-m时间点的记录是否存在重复或异常值:
# 筛选pre-m时间点的数据 pre_m_data <- subset(match1, Time.m.1 == "pre-m") # 检查重复行 print(pre_m_data[duplicated(pre_m_data), ]) # 查看所有扭矩值的分布 summary(pre_m_data$Rel.Torque.m.1)
如果发现重复行,直接用去重处理:
# 按时间点和扭矩值去重,保留其他列 match1_clean <- dplyr::distinct(match1, Time.m.1, Rel.Torque.m.1, .keep_all = TRUE)
第二步:区分异常值来自图层还是数据
用基础ggplot图层替代sm_raincloud,验证异常点是否依然存在:
ggplot(data = match1, aes(x = Time.m.1, y = Rel.Torque.m.1, fill = Time.m.1)) + geom_violin(alpha = 0.5) + geom_boxplot(width = 0.2, fill = "white") + geom_jitter(width = 0.2, alpha = 1) + labs(x = "Timepoints", y = "Relative Torque (Nm/kg)")
- 如果基础图中没有异常点:说明是
sm_raincloud函数的默认设置导致,比如散点叠加或内部计算的重复点。 - 如果基础图中仍有异常点:确认是数据问题,回到第一步处理。
第三步:排查sm_raincloud的参数细节
尝试关闭散点层,判断异常点来源:
ggplot(data = match1, aes(x = Time.m.1, y = Rel.Torque.m.1, fill = Time.m.1)) + sm_raincloud(sep_level = 3, point.params = list(alpha = 0)) + # 隐藏散点 labs(x = "Timepoints", y = "Relative Torque (Nm/kg)")
- 隐藏散点后若异常点消失:说明是散点重复,可调整
point.params的size或position参数,比如添加position = position_jitter(width = 0.1)避免重叠; - 若异常点仍存在:则是箱线图的极值点,可通过
geom_boxplot(outlier.shape = NA)隐藏(但仅在确认是错误极值时建议使用)。
第四步:替代方案(若sm_raincloud无法解决)
直接用ggplot基础图层组合出类似raincloud的效果,完全控制每个元素:
ggplot(data = match1_clean, aes(x = Time.m.1, y = Rel.Torque.m.1, fill = Time.m.1)) + # 小提琴图 geom_violin(scale = "width", alpha = 0.6) + # 箱线图 geom_boxplot(width = 0.2, fatten = 1, fill = "white", outlier.shape = NA) + # 散点(避免重叠) geom_jitter(width = 0.15, size = 1.5, alpha = 0.8) + labs(x = "Timepoints", y = "Relative Torque (Nm/kg)") + theme_classic()
内容的提问来源于stack exchange,提问作者Hamad
相关产品推荐
相关产品推荐

