moh*_* hs 3 plot r outliers ggplot2 boxplot
我正在尝试自定义boxplot,除了一点之外,我非常成功.我无法理解的一点是我如何使用stat_summary来显示异常值.我在一个大图中有不同的箱形图,并且输出端不显示异常值.但是,如果我修改了我的数据并且仅使用一种类型的数据输入R(仅用于单盒图),我的代码工作正常,我可以在输出中看到我们的清晰度.我感谢任何帮助.
非常感谢,
f <- function(x) {r <- c( quantile(x,probs=c(0.25))-(1.5*(quantile(x,probs=c(0.75))-quantile(x,probs=c(0.25)))) ,quantile(x, probs = c(0.25)), quantile(x, probs = c(0.5)), quantile(x, probs = c(0.75)), quantile(x,probs=c(0.75))+(1.5*(quantile(x,probs=c(0.75))-quantile(x,probs=c(0.25)))) );names(r) <- c('ymin', 'lower', 'middle', 'upper', 'ymax'); r}
o <-function(x) { print(x); if (length(x) > 7) { pp = subset(x, x < (quantile(x, probs = c(0.25)) - (1.5 * (quantile(x, probs = c(0.75)) - quantile(x, probs = c(0.25))))) | x > (quantile(x, probs = c(0.75)) + (1.5 * (quantile(x, probs = c(0.75)) - quantile(x, probs = c(0.25)))))); return (pp)} else { return (NA)} }
dt=read.table("C:/...../test.txt",header=TRUE,sep=",")
data<-data.frame(x=dt$x,day=dt$day)
dev.new();ggplot(data, aes(x,day)) + stat_summary(fun.data=f, geom='boxplot')+stat_summary(fun.data =o, geom='point', col='red')#+ stat_summary(fun.y = o2, geom='point', col='red')
Run Code Online (Sandbox Code Playgroud)
关键是将所有数据保存在同一列中,并添加标签列以区分变量.如果使用自定义函数来检测数据框内的异常值,则可以完全取消stat_summary函数.
改编自R中Boxplots的标记异常值.
library(ggplot2)
library(data.table)
# Generate sample
set.seed(123)
n <- 500
dat <- data.table(group=c(rep("A", n/2) , rep("B", n/2)), value=rnorm(n))
Run Code Online (Sandbox Code Playgroud)
注意我们的样本数据如何在同一列中包含变量A和B,仅由组标识符区分.
# Create outlier function
check_outlier <- function(v, coef=1.5){
quantiles <- quantile(v, probs=c(0.25,0.75) )
IQR <- quantiles[2] - quantiles[1]
res <- (v < ( quantiles[1]- coef*IQR )) | (v > ( quantiles[2]+ coef*IQR ))
return(res)
}
# Apply with data.table "by" method
dat[, outlier:=check_outlier(value), by=group]
Run Code Online (Sandbox Code Playgroud)
这个函数并不常见,它是data.table包的一部分,但重点是将一列添加到数据框中,其中异常值标记为TRUE.
# Plot
ggplot(dat, aes(x=group,y=value)) +
geom_boxplot()
Run Code Online (Sandbox Code Playgroud)
从那里自定义你的情节.