自动轴限制在ggplot2中标识异常值

use*_*503 5 plot r ggplot2

问题:

我有一个包含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
Run Code Online (Sandbox Code Playgroud)

因此,数据框在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
Run Code Online (Sandbox Code Playgroud)

当绘制数据框作为条形图(y~x)时,ggplot2会自动(正确地)将y轴缩放到观察到的y值的整个范围:

require("ggplot2")
ggplot(df, aes(x, y)) + geom_bar(stat="identity") 
Run Code Online (Sandbox Code Playgroud)

不需要的情节,2个异常值延伸y比例,y变量的98个数据点看起来几乎相同

为了关注"典型"值,我希望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) )
Run Code Online (Sandbox Code Playgroud)

想要情节外观,但半自动.cut设置

题:

第一次尝试的缺点是0.02和0.98分位数设置是任意的.

有没有更智能(更少任意,更统计证明)的方法让ggplot2自动将其轴限制为典型值,同时允许异常值在轴限制之外绘制?

答案我调查: