箱线图极端异常值捕获求助:Jitter失效与Stripcharts起始值异常
嘿,这两个问题我刚好碰到过,给你一步步解决:
1. 解决Boxplot中Jitter功能失效的问题
通常抖动失效大概率是参数没配对或者散点和箱线图的x轴位置没对齐。拿R基础绘图举例子,你得确保在stripchart里明确指定这几个关键参数:
# 先造点测试数据 set.seed(456) df <- data.frame( Category = rep(c("X", "Y", "Z"), each=40), Score = c(rnorm(40, 20, 3), rnorm(40, 25, 4), rnorm(40, 18, 2)) ) # 先画箱线图 boxplot(Score ~ Category, data=df, ylab="Score", main="带抖动散点的箱线图") # 叠加抖动散点,重点看这几个参数 stripchart(Score ~ Category, data=df, add=TRUE, # 必须加这个,不然会新开画布 method="jitter", # 指定抖动方法 jitter=0.18, # 调整抖动幅度,避免点太挤 col="#2E86AB", # 散点颜色 pch=16, # 散点形状 at=c(1, 2, 3) # 和箱线图的x轴位置一一对应! )
要是用ggplot2的话更简单,直接用geom_jitter就能搞定,根本不用手动对齐位置:
library(ggplot2) ggplot(df, aes(x=Category, y=Score)) + geom_boxplot(width=0.4) + geom_jitter(width=0.2, color="#F24C3D", size=1.5)
2. 让Stripchart不从0开始
这个问题本质是y轴范围被重置了。解决思路就是让散点图继承箱线图的y轴范围:
基础绘图版:
先计算数据的真实范围,然后在箱线图里指定ylim,这样后续叠加的stripchart就会沿用这个范围:
# 计算数据的y轴极值 y_limits <- range(df$Score) # 画箱线图时指定ylim boxplot(Score ~ Category, data=df, ylab="Score", main="带抖动散点的箱线图", ylim=y_limits) # 再叠加抖动散点,就不会从0开始了 stripchart(Score ~ Category, data=df, add=TRUE, method="jitter", jitter=0.18, col="#2E86AB", pch=16, at=c(1,2,3))
ggplot2版:
用scale_y_continuous控制y轴范围,避免默认包含0:
ggplot(df, aes(x=Category, y=Score)) + geom_boxplot(width=0.4) + geom_jitter(width=0.2, color="#F24C3D", size=1.5) + scale_y_continuous(expand=expansion(mult=c(0.05, 0.05))) # 只在数据两端加小的留白
要是你数据里本身有接近0的值,这个方法也会自动适配,不会强行截断~
内容的提问来源于stack exchange,提问作者Angus
相关产品推荐
相关产品推荐

