【发布时间】:2015-07-16 17:04:33
【问题描述】:
我想预先计算按变量汇总的数据(使用plyr 并传递quantile 函数),然后使用geom_boxplot(stat = "identity") 进行绘图。这很好用,除了它 (a) 不会将异常值绘制为点,并且 (b) 将“胡须”扩展到正在绘制的数据的最大值和最小值。
例子:
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):
我想获得什么,但仍然通过plyr(或其他方法)利用预计算:
初步想法:也许有一些方法可以预先计算出没有异常值的胡须的真实端点?然后,对异常值的数据进行子集化并将它们作为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
【问题讨论】:
-
使用 dplyr(比 plyr 快)并查找
?boxplot.stats并将其合并到您的函数中 -
@infominer 这很有帮助,关于如何处理
boxplot.stats输出异常值的任何想法?也就是说,每个因素都可能有不同长度的异常值? -
只是写下我的答案! @shadow 的回答很好,它负责 boxplot 的 gggplot 实现