在 r 中显示 80% 线箱线图

Showing 80% line Boxplot in r

我有一个只有数字的大型数据集(25,00 条记录),我想知道它的 80% 阈值。每当我尝试 运行 boxplot(data) 时,结果都不清楚,因为我有太多的值:

我试着绕过它并想出了 boxplot(data, outline = FALSE) 结果如下:

所以基本上我想知道两件事:

1) 第二张图上面的那条线代表75%正确?如果是这样,那么我如何将 75% 更改为 80%。

2) 我不显示异常值的方法是否正确?或者也许有更简单的方法来显示 80% 的阈值?

很抱歉没有提供可重现的示例,但如果有必要,我会进行编辑。

您可以通过自己生成统计数据并使用 bxp 绘制它来实现这一点。

x <- rnorm(1000)
myBox <- list(stats = matrix(quantile(x, c(0, 0.2, 0.5, 0.8, 1), ncol = 1)), n = 1000)
bxp(myBox)

这将在第 20 和第 80 个百分位数处有铰链,在最小值和最大值处有胡须。对于您的数据,您可能需要替代晶须,您可以使用替代分位数或相对于第 20 和第 80 个百分位数之间的范围创建一些距离。对于后者,你可以这样做:

myBox2 <- list(stats = matrix(quantile(x, c(0, 0.2, 0.5, 0.8, 1), ncol = 1)), n = 1000)
myBox2$stats[c(1, 5)] <- myBox2$stats[c(2, 4)] + seq(-1, 1, 2) * diff(llmyBox2$stats[c(2, 4)])

补充一点,我完全同意 Gavin 的观点,即您需要向查看此修改后的箱线图的任何人解释它与通常的解释不同。

并不是我建议您这样做,但您可以更改用于绘制箱线图的统计摘要,并用您自己的统计信息替换任何统计信息。

例如,按照您的要求在 x 分布的 0.8 分位数处(而不是在上铰链处)绘制框的上限,那么我们会做:

set.seed(10)
x <- rnorm(1000)
bps <- boxplot(x, plot = FALSE)

bps 现在包含:

> bps
$stats
             [,1]
[1,] -2.643849768
[2,] -0.677466940
[3,] -0.003001333
[4,]  0.728515646
[5,]  2.700636623

$n
[1] 1000

$conf
            [,1]
[1,] -0.07324983
[2,]  0.06724716

$out
[1] -3.001431  3.541140  3.012906 -3.012164

$group
[1] 1 1 1 1

$names
[1] "1"

这是我们要更改的 stats 组件

## Replace the 4th statistic (upper box)
bps$stats[4, 1] <- quantile(x, probs = 0.8)

现在我们使用 bxp() 函数来绘图 - boxplot() 在内部使用这个函数,所以我们在这里没有做任何不同的事情

bxp(bps)

这会给我们:

红线是使用

添加的
abline(h = fivenum(x)[4], col = "red", lty = "dashed", lwd = 2)

and 是上铰链,即 boxplot() 会绘制框的上边缘。

我之所以说我不建议你这样做,是因为它改变了人们对情节的预期解读。如果您确实修改了箱线图,则需要向展示该图的人解释您的新约定。

如果我们对此更加小心,我们现在也会将胡须推得更远,因为盒子的尺寸增加了。这将替换上下胡须

bps$stats[c(1,5), 1] <- bps$stats[c(2,4), 1] + 
    (c(-1,1) * (1.5 * diff(bps$stats[c(2,4), 1])))

并重绘:

bxp(bps)
abline(h = fivenum(x)[4], col = "red", lty = "dashed", lwd = 2)

给予

虽然现在你有异常值的问题。所以我们也应该解决这个问题

ind <- bps$out > bps$stats[1,1] & bps$out < bps$stats[5,1]
bps$out <- bps$out[!ind]
bps$group <- bps$group[!ind]

最终产生

将所有这些放在一起我们有:

set.seed(10)
x <- rnorm(1000)
bps <- boxplot(x, plot = FALSE)
bps$stats[4, 1] <- quantile(x, probs = 0.8)
bps$stats[c(1,5), 1] <- bps$stats[c(2,4), 1] + 
    (c(-1,1) * (1.5 * diff(bps$stats[c(2,4), 1])))
ind <- bps$out > bps$stats[1,1] & bps$out < bps$stats[5,1]
bps$out <- bps$out[!ind]
bps$group <- bps$group[!ind]

答案 1:方框上方的垂直线显示第三个四分位数,它可以但不必与 75% 的分位数相差很大(请参阅下面的评论)。如果您不确定,请检查 fivenum(data[,1])quantile(data[,1])。 Nick K 和 Gavin Simpson 在他们的回答中向您展示了如何更改它,我同意他们的看法,如果您不知道箱线图,那么这样做是很危险的。最标准的做法是更改 boxplotrange 参数,但您需要指出这一点。

答案 2:为了公平对待您的数据,您应该显示两个图:第一个记录异常值,第二个记录您的分位数。 为了更好地在一个图中表示所有数据,您可以尝试对数刻度:

boxplot(data, log="y")

这会给你一个 0 值的错误(你可能有)所以你可以先修改你的数据:

data[which(data<= 1e-3)] = 1e-3
boxplot(data, log="y")

你必须检查你的数据,如果这能给你一个很好的情节。