问题:
我有一个包含 2 个变量(x,y)的数据框。y 变量“通常”在“小范围”内变化。数据框中的异常值很少。这是一个例子:
# uniform sample data frame
# y variable "typically" varying in a "small" range between 0 and 1
df = data.frame(
x = 1:100,
y = runif(100)
)
# add 2 outlier to data frame
# yielding a data frame
# with 99 normal values and 1 outlier
df[3, 2] = 50
df[4, 2] = -50
因此,数据框在 y 变量中有 98 个典型值和 2 个异常值,从前 10 行可以看出head(df, 10)
:
x y
1 1 0.9785541
2 2 0.2321611
3 3 50.0000000
4 4 -50.0000000
5 5 0.8316717
6 6 0.1135077
7 7 0.9633120
8 8 0.1473229
9 9 0.1436269
10 10 0.9252299
当将数据框绘制为条形图 (y~x) 时,ggplot2 会自动(正确地)将 y 轴缩放到观察到的 y 值的整个范围:
require("ggplot2")
ggplot(df, aes(x, y)) + geom_bar(stat="identity")
为了专注于“典型”值,我希望 ggplot2 将 y 轴比例保持在“小”比例上,绘制离轴限制的异常值。
这是我的第一次尝试:
lower.cut = quantile(df$y, 0.02)
# = 0.01096518
upper.cut = quantile(df$y, 0.98)
# = 0.9872347
ggplot(df, aes(x, y)) + geom_bar(stat="identity") +
coord_cartesian( ylim = c(-lower.cut*1.1, upper.cut*1.1) )
问题:
第一次尝试的缺点是 0.02 和 0.98 分位数设置有点随意。
是否有一种更智能(不那么随意,更有统计证明)的方法让 ggplot2 自动将其轴限制为典型值,同时允许将异常值绘制到轴限制之外?
我调查的答案:
- 忽略 ggplot2 boxplot 中的异常值:专注于 ggplot2
geom_boxplot
而不是geom_bar
. - ggplot2 barplot 处理 1 个异常值将轴向上推 [重复]:答案暗示使用事实来排除异常值,我不想这样做。该问题也被标记为重复,但链接到类似问题“什么是断轴的替代品?” 仅提供有关如何处理通过异常值的轴延伸的一般挑战的答案,但没有针对我的具体问题的具体解决方案。