我只是使用这个内置数据集来解释我想要做什么,因为我的数据基本相同。使用bwplot
的标准箱线图显然将第25和第75个优先级作为标准框的顶部和底部绘制。
我有没有办法改变箱形图,这样箱子的顶部和底部就是每个因子的第85和第15百分位?如果这是不可能的 - 有没有办法将它们分别表示为每个因子上方的行?
library(MASS)
data <- ChickWeight[,c("Diet", "weight")]
bwplot(data$weight~data$Diet)
我还希望能够将静态范围绘制为绘图的背景(例如150到250之间的阴影区域) - 我该怎么做?
提前道歉,因为我是R的新手。真的很感谢任何帮助这个简单的任务,我发现很多R文档有点难以理解。
答案 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)
答案 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')