Променете изчислението на отклонение в Box plot, като използвате ggplot в R

Опитвам се да персонализирам 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')

person Mohsen Sichani    schedule 24.03.2016    source източник


Отговори (2)


Ключът е да запазите всичките си данни в една и съща колона и да добавите колона с етикети, за да разграничите променливите. Можете напълно да премахнете функцията stat_summary, ако използвате персонализирана функция за откриване на извънредни стойности в рамката на данните.

Адаптирано от Labeling Outliers of Boxplots в R.

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))

Забележете как нашите примерни данни включват променливите 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]

Тази функция не е често срещана и е част от пакета data.table, но основната точка е, че добавя колона към рамката с данни, където извънредните стойности имат етикет TRUE.

# Plot
ggplot(dat, aes(x=group,y=value)) + 
  geom_boxplot()

Персонализирайте своя сюжет от там.

person Chris Conlan    schedule 24.03.2016
comment
Здравей Крис, благодаря ти за отговора. Оценявам. Какъв срам, току що го видях, не съм защо не съм получил известие. - person Mohsen Sichani; 20.06.2017
comment
@mohsenhs няма проблем, радвам се да помогна. - person Chris Conlan; 20.06.2017

Благодаря Крис за помощта.

Проблемът беше свързан с функцията ми o,

 o <-function(x)  {    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))))));if(length(pp)<1){pp=c(1);return(pp)}else { return (NA)}}
person Mohsen Sichani    schedule 28.03.2016