Игнорировать выбросы в 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")
![введите описание изображения здесь]()
Ответы
Ответ 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]()