You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 13:45:20