gpt4 book ai didi

r - 带有facet_wrap的ggplot boxplot中没有异常值

转载 作者:行者123 更新时间:2023-12-04 01:04:05 25 4
gpt4 key购买 nike

我想用ggplot绘制没有异常值的框线图,只关注框线和晶须

例如:

p1 <- ggplot(diamonds, aes(x=cut, y=price, fill=cut))
p1 + geom_boxplot() + facet_wrap(~clarity, scales="free")


给出带有异常值的多面箱线图



我可以使用outlier.size = NA抑制异常值:

p1 <- ggplot(diamonds, aes(x=cut, y=price, fill=cut))
p1 + geom_boxplot(outlier.size=NA) + facet_wrap(~clarity, scales="free")


这使



此处,y轴比例尺与原始图中的比例尺相同,只是没有出现异常值。现在如何根据晶须的末端在每个面板上修改比例以“放大”?

我可以这样重置ylim

ylim1 = boxplot.stats(diamonds$price)$stats[c(1, 5)]


然后重新绘制

p1 + geom_boxplot(outlier.size=NA) 
+ facet_wrap(~clarity, scales="free")
+ coord_cartesian(ylim = ylim1*1.05)


但这在各个方面都行不通:



有没有办法“ facet_wrap” boxplots.stats函数?

编辑:

我尝试动态计算箱线图统计信息,但这似乎不起作用。

give.stats <- function(x){return(boxplot.stats(x)$stats[c(1,5)])}

p1 + geom_boxplot(outlier.size=NA) +
facet_wrap(~clarity, scales="free") +
coord_cartesian(ylim = give.stats)

> Error in min(x, na.rm = na.rm) : invalid 'type' (list) of argument


任何更多的想法将不胜感激。

最佳答案

可以使用stat_summary和自定义统计信息计算功能来完成:

calc_boxplot_stat <- function(x) {
coef <- 1.5
n <- sum(!is.na(x))
# calculate quantiles
stats <- quantile(x, probs = c(0.0, 0.25, 0.5, 0.75, 1.0))
names(stats) <- c("ymin", "lower", "middle", "upper", "ymax")
iqr <- diff(stats[c(2, 4)])
# set whiskers
outliers <- x < (stats[2] - coef * iqr) | x > (stats[4] + coef * iqr)
if (any(outliers)) {
stats[c(1, 5)] <- range(c(stats[2:4], x[!outliers]), na.rm = TRUE)
}
return(stats)
}

ggplot(diamonds, aes(x=cut, y=price, fill=cut)) +
stat_summary(fun.data = calc_boxplot_stat, geom="boxplot") +
facet_wrap(~clarity, scales="free")


output figure

统计信息计算功能是通用的,因此在绘制之前无需进行数据处理。

也可以将晶须设置为10%和90%:

calc_stat <- function(x) {
coef <- 1.5
n <- sum(!is.na(x))
# calculate quantiles
stats <- quantile(x, probs = c(0.1, 0.25, 0.5, 0.75, 0.9))
names(stats) <- c("ymin", "lower", "middle", "upper", "ymax")
return(stats)
}

ggplot(diamonds, aes(x=cut, y=price, fill=cut)) +
stat_summary(fun.data = calc_stat, geom="boxplot") +
facet_wrap(~clarity, scales="free")


Output figure with 10% and 90% whiskers

关于r - 带有facet_wrap的ggplot boxplot中没有异常值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25124895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com