Измените расчет выбросов в блочной диаграмме с помощью ggplot In 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, если используете пользовательскую функцию для обнаружения выбросов во фрейме данных.

Взято из Маркировка выбросов блочных диаграмм в 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