如何在R中创建一个箱形图,框中代表第15和第85百分位,而不是默认的第25和第75百分位?

时间:2015-03-16 06:27:05

标签: r

我只是使用这个内置数据集来解释我想要做什么,因为我的数据基本相同。使用bwplot的标准箱线图显然将第25和第75个优先级作为标准框的顶部和底部绘制。

我有没有办法改变箱形图,这样箱子的顶部和底部就是每个因子的第85和第15百分位?如果这是不可能的 - 有没有办法将它们分别表示为每个因子上方的行?

    library(MASS)
    data <- ChickWeight[,c("Diet", "weight")] 
    bwplot(data$weight~data$Diet)

enter image description here

我还希望能够将静态范围绘制为绘图的背景(例如150到250之间的阴影区域) - 我该怎么做?

提前道歉,因为我是R的新手。真的很感谢任何帮助这个简单的任务,我发现很多R文档有点难以理解。

2 个答案:

答案 0 :(得分:2)

bwplot使用函数fivenum来生成boxplot分位数。您可以通过创建自己的函数版本boxplot.stats来更改此设置。在这里,我只更改了一行,你可以看到它被注释掉了。您可以在my.panel函数中添加所需的阴影:

library(MASS)
library(lattice)

my.boxplot.stats <- function (x, coef = 1.5, do.conf = TRUE, do.out = TRUE) {
if (coef < 0) 
    stop("'coef' must not be negative")
nna <- !is.na(x)
n <- sum(nna)
#stats <- stats::fivenum(x, na.rm = TRUE)
stats <- quantile(x, probs = c(0.0, 0.15, 0.5, 0.85, 1.0), na.rm = TRUE)
iqr <- diff(stats[c(2, 4)])
if (coef == 0) 
    do.out <- FALSE
else {
    out <- if (!is.na(iqr)) {
                x < (stats[2L] - coef * iqr) | x > (stats[4L] + coef * 
                            iqr)
            }
            else !is.finite(x)
    if (any(out[nna], na.rm = TRUE)) 
        stats[c(1, 5)] <- range(x[!out], na.rm = TRUE)
}
conf <- if (do.conf) 
    stats[3L] + c(-1.58, 1.58) * iqr/sqrt(n)
list(stats = stats, n = n, conf = conf, out = if (do.out) x[out & 
                                    nna] else numeric())
}

my.panel <- function (x,y,...) {
    panel.rect(xleft = 0, xright = 5, ybottom = 150, ytop = 250, col="lightgrey", border = 0)
panel.bwplot(x, y, ...)
}

data <- ChickWeight[,c("Diet", "weight")] 
bwplot(data$weight~data$Diet, stats = my.boxplot.stats, panel= my.panel)

enter image description here

答案 1 :(得分:1)

在此处查看答案:Adding Different Percentiles in boxplots in R

基本上,您需要先手动计算分位数并手动添加线段。这是最强大的解决方案。

或者,您可以使用ggplot2快速执行此操作而不使用异常值。如果确实需要,可以手动添加异常值。

library(ggplot2)
library(MASS)
library(plyr)
data <- ChickWeight[,c("Diet", "weight")] 

data2 <- ddply(data,.(Diet),
            summarize,
            ymin = min(weight),
            ymax = max(weight),
            middle = median(weight),
            lower = quantile(weight,0.15),
            upper = quantile(weight,0.85))


ggplot(data2,aes(x = Diet)) + geom_boxplot(aes(ymin = ymin,ymax = ymax,middle = middle,upper = upper,lower= lower), stat = 'identity')