如何用ggplot2为箱线图中的极端异常值设置不同颜色
解决ggplot2箱线图异常值分色问题
你的问题根源在于重复绘制了极端异常值:
geom_boxplot(outlier.colour='red')会自动把所有符合1.5*IQR规则的异常值(包括普通异常值和你定义的极端异常值)都标红;- 叠加的
geom_point又单独绘制了is_extreme识别的极端异常值并赋予蓝色,导致极端异常值同时有红色底层和蓝色上层,视觉上可能让你误以为非极端异常值有两种红色,实际是极端点的颜色叠加效果。
修正方案
核心思路是:关闭箱线图默认的异常值显示,自己计算并标记所有异常值的类型,再用点图层统一着色。
步骤1:给数据添加异常值类型标记
先基于箱线图默认规则(1.5*IQR)和你的is_extreme函数,给每个观测标记类型:
library(dplyr) # 按分组(Phase)计算异常值阈值,标记类型 Mooney_data <- Mooney_data %>% group_by(Phase) %>% mutate( # 标记箱线图默认异常值(1.5*IQR范围外) is_default_outlier = RT < quantile(RT, 0.25) - 1.5*IQR(RT) | RT > quantile(RT, 0.75) + 1.5*IQR(RT), # 标记你定义的极端异常值 is_extreme_outlier = is_extreme(RT) ) %>% ungroup()
步骤2:重新绘制箱线图
关闭箱线图的默认异常值,用点图层绘制所有异常值并按类型着色:
ggplot(Mooney_data) + # 箱线图不显示默认异常值 geom_boxplot(aes(x = Phase, y = RT), outlier.shape = NA) + # 只绘制异常值,按是否极端分色 geom_point( data = filter(Mooney_data, is_default_outlier), aes(x = Phase, y = RT, color = is_extreme_outlier) ) + # 自定义颜色:普通异常值红,极端异常值蓝 scale_color_manual(values = c("FALSE" = "red", "TRUE" = "blue")) + theme(legend.position = "none") + mytheme
修改后即可实现:普通异常值显示红色,极端异常值显示蓝色,不会出现颜色重叠的问题。
内容的提问来源于stack exchange,提问作者SilvaC
相关产品推荐
相关产品推荐

