如何在ggplot分组箱线图中基于子集计算并标记异常值ID
解决分组箱线图中按组计算并标记异常值的问题
问题出在你当前的geom_text逻辑里:quantile()和IQR()函数是对整个数据集计算分位数和四分位距的,不是按sex分组计算,所以分组绘图时异常值判断没有遵循每组的统计边界。
解决思路是先在数据预处理阶段,按分组计算每组的异常值标记,再将标记好的结果传入绘图函数:
步骤1:预处理数据,生成分组异常值标记
用dplyr的分组计算功能,为每个数据点判断是否属于所在组的异常值,并生成对应的id标记:
data_processed <- data %>% group_by(sex) %>% mutate( q1 = quantile(whatever, 0.25), q3 = quantile(whatever, 0.75), iqr_val = IQR(whatever), outlier_id = ifelse( whatever > q3 + 1.5*iqr_val | whatever < q1 - 1.5*iqr_val, id, "" ) ) %>% ungroup()
步骤2:使用预处理后的数据绘图
修改plot_sex的代码,直接调用预处理好的outlier_id列作为标签:
plot_sex <- ggplot(data_processed, aes(sex, whatever)) + geom_boxplot() + geom_quasirandom(size = .3, alpha = .3) + geom_text(aes(label = outlier_id), hjust = -1)
这样修改后,plot_sex里的异常值标记就会严格按照每组的四分位数和IQR来判断,而不是用全量数据的统计值。
内容的提问来源于stack exchange,提问作者gernophil
相关产品推荐
相关产品推荐

