gpt4 book ai didi

r - 如何使用 geom_boxplot(stat = "identity") 模拟带有异常值的 geom_boxplot()

转载 作者:行者123 更新时间:2023-12-04 11:12:55 26 4
gpt4 key购买 nike

我想预先计算数据的按变量摘要(使用 plyr 并传递 quantile 函数),然后使用 geom_boxplot(stat = "identity") 绘图.这很好用,除了它 (a) 不将异常值绘制为点和 (b) 将“ mustache ”扩展到正在绘制的数据的最大值和最小值。

例子:

library(plyr)
library(ggplot2)

set.seed(4)
df <- data.frame(fact = sample(letters[1:2], 12, replace = TRUE),
val = c(1:10, 100, 101))
df
# fact val
# 1 b 1
# 2 a 2
# 3 a 3
# 4 a 4
# 5 b 5
# 6 a 6
# 7 b 7
# 8 b 8
# 9 b 9
# 10 a 10
# 11 b 100
# 12 a 101

by.fact.df <- ddply(df, c("fact"), function(x) quantile(x$val))

by.fact.df
# fact 0% 25% 50% 75% 100%
# 1 a 2 3.25 5.0 9.00 101
# 2 b 1 5.50 7.5 8.75 100

# What I can do...with faults (a) and (b) above
ggplot(by.fact.df,
aes(x = fact, ymin = `0%`, lower = `25%`, middle = `50%`,
upper = `75%`, ymax = `100%`)) +
geom_boxplot(stat = "identity")

# What I want...
ggplot(df, aes(x = fact, y = val)) +
geom_boxplot()

我能做什么...上面提到的错误(a)和(b):

Plot 01

我想获得什么,但仍然通过 plyr 利用预计算(或其他方法):

Plot 02

初步想法:也许有某种方法可以在没有异常值的情况下预先计算 mustache 的真实终点?然后,对异常值的数据进行子集化并将它们作为 geom_point() 传递?

动机:在处理更大的数据集时,我发现利用 plyr 更快、更实用。 , dplyr ,和/或 data.table预先计算统计数据然后绘制它们而不是让 ggplot2到计算。

更新

我可以使用以下 dplyr 的组合来提取我需要的内容和 plyr代码,但我不确定这是否是最有效的方法:
df %>%
group_by(fact) %>%
do(ldply(boxplot.stats(.$val), data.frame))

Source: local data frame [6 x 3]
Groups: fact

fact .id X..i..
1 a stats 2
2 a stats 4
3 a stats 10
4 a stats 13
5 a stats 16
6 a n 9

最佳答案

这是我的答案,使用内置函数 quantileboxplot.stats .
geom_boxplot boxplot 的计算与 boxplot.stats 略有不同.阅读 ?geom_boxplot?boxplot.stats了解我在下面的实现

#Function to calculate boxplot stats to match ggplot's implemention as in geom_boxplot.
my_boxplot.stats <-function(x){
quantiles <-quantile(x, c(0, 0.25, 0.5, 0.75, 1))
labels <-names(quantile(x))
#replacing the upper whisker to geom_boxplot
quantiles[5] <-boxplot.stats(x)$stats[5]
res <-data.frame(rbind(quantiles))
names(res) <-labels
res$out <-boxplot.stats(x)$out
return(res)
}

计算统计数据并绘制它的代码
library(dplyr)
df %>% group_by(fact) %>% do(my_boxplot.stats(.$val)) %>%
ggplot(aes(x=fact, y=out, ymin = `0%`, lower = `25%`, middle = `50%`,
upper = `75%`, ymax = `100%`)) +
geom_boxplot(stat = "identity") + geom_point()

关于r - 如何使用 geom_boxplot(stat = "identity") 模拟带有异常值的 geom_boxplot(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30078797/

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