有人可以向我解释为什么我用普通的boxplot命令和ggplot2的outliers
得到了不同数量的geom_boxplot
吗?
这里有一个例子:
x <- c(280.9, 135.9, 321.4, 333.7, 0.2, 71.3, 33.0, 102.6, 126.8, 194.8, 35.5,
107.3, 45.1, 107.2, 55.2, 28.1, 36.9, 24.3, 68.7, 163.5, 0.8, 31.8, 121.4,
84.7, 34.3, 25.2, 101.4, 203.2, 194.1, 27.9, 42.5, 47.0, 85.1, 90.4, 103.8,
45.1, 94.0, 36.0, 60.9, 97.1, 42.5, 96.4, 58.4, 174.0, 173.2, 164.1, 92.1,
41.9, 130.2, 94.7, 121.5, 261.4, 46.7, 16.3, 50.7, 112.9, 112.2, 242.5, 140.6,
112.6, 31.2, 36.7, 97.4, 140.5, 123.5, 42.9, 59.4, 94.5, 37.4, 232.2, 114.6,
60.7, 27.8, 115.5, 111.9, 60.1)
data <- data.frame(x)
boxplot(data$x)
ggplot(data, aes(y=x)) + geom_boxplot()
答案 0 :(得分:12)
?geom_boxplot
我们可以看到
上下铰链分别对应第一和第三四分位数 (第25和第75个百分位)。这与方法略有不同 由boxplot()函数使用,在较小的情况下可能很明显 样品。有关如何铰链的更多信息,请参见boxplot.stats()。 计算boxplot()的位置。
如果您想要相同的结果,则可以让ggplot使用boxplot.stats
# Function to use boxplot.stats to set the box-and-whisker locations
f.bxp = function(x) {
bxp = boxplot.stats(x)[["stats"]]
names(bxp) = c("ymin","lower", "middle","upper","ymax")
bxp
}
# Function to use boxplot.stats for the outliers
f.out = function(x) {
data.frame(y=boxplot.stats(x)[["out"]])
}
要在ggplot中使用这些功能:
ggplot(data, aes(0, y=x)) +
stat_summary(fun.data=f.bxp, geom="boxplot") +
stat_summary(fun.data=f.out, geom="point")
如果您想复制ggplot本机使用的统计信息,这些内容将在?geom_boxplot
中进行如下解释:
ymin =下晶须=大于或等于的最小观察值 下铰链-1.5 * IQR
下部 =下部铰链,25%的分位数
下限 =缺口的下边缘=中位数-1.58 * IQR / sqrt(n)
中间 =中位数,分位数50%
缺口 =缺口的上边缘=中位数+ 1.58 * IQR / sqrt(n)
上部 =上铰链,75%的分位数
ymax =晶须上限=小于或等于上限的最大观测值 铰链+ 1.5 * IQR
我们可以据此进行计算:
y = sort(x)
iqr = quantile(y,0.75) - quantile(y,0.25)
ymin = y[which(y >= quantile(y,0.25) - 1.5*iqr)][1]
ymax = tail(y[which(y <= quantile(y,0.75) + 1.5*iqr)],1)
lower = quantile(y,0.25)
upper = quantile(y,0.75)
middle = quantile(y,0.5)
ggplot(data, aes(y=x)) +
geom_boxplot() +
geom_hline(aes(yintercept=c(ymin)), color='red', linetype='dashed') +
geom_hline(aes(yintercept=c(ymax)), color='red', linetype='dashed') +
geom_hline(aes(yintercept=c(lower)), color='red', linetype='dashed') +
geom_hline(aes(yintercept=c(upper)), color='red', linetype='dashed') +
geom_hline(aes(yintercept=c(middle)), color='red', linetype='dashed')
我们还可以使用ggplot_build
p <- ggplot(data, aes(y=x)) + geom_boxplot()
ggplot_build(p)$data[1:5]
# ymin lower middle upper ymax
# 1 0.2 42.5 93.05 122 232.2