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

如何用ggplot2为箱线图中的“极端异常值”设置独特图标?

为箱线图中指定组的极端异常值设置独特标记

要实现这个需求,我们可以通过预处理数据标记异常类型,再分别绘制箱线图(隐藏默认异常点)和不同类型的异常点来实现。具体步骤如下:

1. 数据预处理:标记异常值类型

先计算每个气缸组的四分位数、IQR以及外栅栏(极端异常值的阈值),然后给每个数据点打上标签,区分普通异常值、极端异常值,以及仅标记8缸组的极端异常值:

library(ggplot2)
library(dplyr)

# 计算每组的异常值阈值
thresholds <- mtcars %>%
  group_by(cyl) %>%
  summarize(
    Q1 = quantile(drat, 0.25),
    Q3 = quantile(drat, 0.75),
    IQR_val = IQR(drat),
    lf = Q1 - 3*IQR_val,  # 外栅栏下限
    uf = Q3 + 3*IQR_val,  # 外栅栏上限
    inner_lf = Q1 - 1.5*IQR_val,  # 内栅栏下限(普通异常值阈值)
    inner_uf = Q3 + 1.5*IQR_val   # 内栅栏上限
  )

# 合并阈值到原数据,标记异常类型
mtcars_annotated <- mtcars %>%
  left_join(thresholds, by = "cyl") %>%
  mutate(
    # 标记是否为普通异常值(在内、外栅栏之间)
    is_normal_outlier = (drat < inner_lf | drat > inner_uf) & !(drat < lf | drat > uf),
    # 标记是否为8缸组的极端异常值
    is_8cyl_extreme = (cyl == 8) & (drat < lf | drat > uf)
  )

2. 绘制箱线图与自定义异常点

使用geom_boxplot()的outlier.shape = NA隐藏默认异常点,然后分别用geom_point()绘制普通异常值和8缸组的极端异常值:

ggplot(mtcars_annotated, aes(x = factor(cyl), y = drat)) +
  # 绘制箱线图,隐藏默认异常点
  geom_boxplot(outlier.shape = NA) +
  # 绘制普通异常值,使用默认实心点(shape=16)
  geom_point(
    data = filter(mtcars_annotated, is_normal_outlier),
    shape = 16, size = 2
  ) +
  # 绘制8缸组的极端异常值,使用星号标记(shape=8)
  geom_point(
    data = filter(mtcars_annotated, is_8cyl_extreme),
    shape = 8, size = 3, color = "red"  # 可选:添加颜色增强区分度
  ) +
  labs(x = "气缸数", y = "传动比(drat)")

补充说明

  • 通过手动标记异常值类型,实现了对特定组极端异常值的样式自定义;
  • shape=8对应星号标记,你可以根据需求调整size、color等参数;
  • 普通异常值保留了原生箱线图的默认实心点样式,保持视觉一致性。

内容的提问来源于stack exchange,提问作者Steven Ouellette

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:50:27