如何用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
相关产品推荐
相关产品推荐

