Подтвердить что ты не робот

Игнорировать выбросы в ggplot2 boxplot

Как я могу игнорировать выбросы в ggplot2 boxplot? Я не просто хочу, чтобы они исчезли (т.е. Outlier.size = 0), но я хочу, чтобы их игнорировали, так что ось y масштабируется, чтобы показать 1/3 процентиль. Мои выбросы заставляют "коробку" сжиматься настолько малой, что ее практически линия. Существуют ли какие-то методы для решения этой проблемы?

Edit Вот пример:

y = c(.01, .02, .03, .04, .05, .06, .07, .08, .09, .5, -.6)
qplot(1, y, geom="boxplot")

введите описание изображения здесь

4b9b3361

Ответ 1

Вот решение, использующее boxplot.stats

# create a dummy data frame with outliers
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))


# compute lower and upper whiskers
ylim1 = boxplot.stats(df$y)$stats[c(1, 5)]

# scale y limits based on ylim1
p1 = p0 + coord_cartesian(ylim = ylim1*1.05)

Ответ 2

Используйте geom_boxplot(outlier.shape = NA), чтобы не отображать выбросы и scale_y_continuous(limits = c(lower, upper)), чтобы изменить пределы оси.

Пример.

n <- 1e4L
dfr <- data.frame(
  y = exp(rlnorm(n)),  #really right-skewed variable
  f = gl(2, n / 2)
)

p <- ggplot(dfr, aes(f, y)) + 
  geom_boxplot()
p   # big outlier causes quartiles to look too slim

p2 <- ggplot(dfr, aes(f, y)) + 
  geom_boxplot(outlier.shape = NA) +
  scale_y_continuous(limits = quantile(dfr$y, c(0.1, 0.9)))
p2  # no outliers plotted, range shifted

На самом деле, как показал Рамнат в своем ответе (и Андри тоже в комментариях), имеет смысл обрезать весы после вычисления статистики через coord_cartesian.

coord_cartesian(ylim = quantile(dfr$y, c(0.1, 0.9)))

(Возможно, вам все равно придется использовать scale_y_continuous для исправления разрывов осей.)

Ответ 3

У меня была та же проблема, и я предварительно вычислил значения для Q1, Q2, медианы, ymin, ymax, используя boxplot.stats:

# Load package and generate data
library(ggplot2)
data <- rnorm(100)

# Compute boxplot statistics
stats <- boxplot.stats(data)$stats
df <- data.frame(x="label1", ymin=stats[1], lower=stats[2], middle=stats[3], 
                 upper=stats[4], ymax=stats[5])

# Create plot
p <- ggplot(df, aes(x=x, lower=lower, upper=upper, middle=middle, ymin=ymin, 
                    ymax=ymax)) + 
    geom_boxplot(stat="identity")
p

В результате получается коробочный участок без выбросов. enter image description here

Ответ 4

Одна идея заключалась бы в winsorize данные в двухпроходной процедуре:

  • выполните первый проход, узнайте, каковы границы, например. разрезанный при заданном процентили, или стандартное отклонение N выше среднего, или...

  • во втором проходе установите значения за пределами данной привязки к значению этой связанной

Я должен подчеркнуть, что это старомодный метод, в котором должны доминировать более современные надежные методы, но вы все равно сталкиваетесь с ним много.

Ответ 5

Опция "coef" функции geom_boxplot позволяет изменить обрезку выброса в терминах межквартильных диапазонов. Эта опция документирована для функции stat_boxplot. Чтобы деактивировать выбросы (другими словами, они рассматриваются как обычные данные), вместо использования значения по умолчанию 1.5 укажите очень высокое значение отсечки:

library(ggplot2)
# generate data with outliers:
df = data.frame(x=1, y = c(-10, rnorm(100), 10)) 
# generate plot with increased cutoff for outliers:
ggplot(df, aes(x, y)) + geom_boxplot(coef=1e30)

Ответ 6

Если вы хотите, чтобы усы расширялись до максимальных и минимальных значений, вы можете настроить аргумент coef. Значение по умолчанию для coef равно 1,5 (т.е. длина по умолчанию усов в 1,5 раза больше IQR).

# Load package and create a dummy data frame with outliers 
#(using example from Ramnath answer above)
library(ggplot2)
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))

# create boxplot where whiskers extend to max and min values
p1 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)), coef = 500)

image of p0

image of p1

Ответ 7

for( i in match(rownames(TT),rownames(data))){
  File=paste('HNSC-',rownames(data)[i],".png",sep="")
  Name<-unlist(lapply(colnames(data),function(x) unlist(strsplit(x,"-TCGA"))[1]))
  type<-unlist(lapply(Name,function(x) unlist(strsplit(x,"-"))[2]))
  input<-data.frame(lncRNA=as.numeric(as.character(data[i,])),Name,type)
  p<-ggplot(input,aes(Name,lncRNA,fill=factor(type)))
  p<-p+geom_boxplot(outlier.shape=NA)
  max<-max(tapply(input$lncRNA,input$Name,function(x) quantile(x,0.975)))
  min<-min(tapply(input$lncRNA,input$Name,function(x) quantile(x,0)))
  p<-p+coord_flip(ylim = c(min, max))
  p
  ggsave(File)
}

Ответ 8

Ipaper :: geom_boxplot2 это то, что вы хотите.

# devtools::install_github('kongdd/Ipaper')
library(Ipaper)
library(ggplot2)
p <- ggplot(mpg, aes(class, hwy))
p + geom_boxplot2(width = 0.8, width.errorbar = 0.5)

enter image description here