Ignorer les valeurs aberrantes dans ggplot2 boxplot
Comment ignorer les valeurs aberrantes dans ggplot2 boxplot? Je ne veux pas simplement qu'ils disparaissent (c'est-à-dire aberrant.size=0), mais je veux qu'ils soient ignorés de telle sorte que l'axe des ordonnées s'échelonne pour montrer le 1er / 3ème percentile. Mes valeurs aberrantes font que la "boîte" se rétrécit si petite que c'est pratiquement une ligne. Y a-t-il des techniques pour faire face à cela?
Modifier Voici un exemple:
y = c(.01, .02, .03, .04, .05, .06, .07, .08, .09, .5, -.6)
qplot(1, y, geom="boxplot")
7 réponses
Voici une solution utilisant boxplot.les statistiques
# 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)
Utiliser geom_boxplot(outlier.shape = NA)
pour ne pas afficher les valeurs aberrantes et scale_y_continuous(limits = c(lower, upper))
pour modifier les limites de l'axe.
Un exemple.
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
En fait, comme Ramnath l'a montré dans sa réponse (et Andrie aussi dans les commentaires), il est plus logique de recadrer les échelles après avoir calculé la statistique, via coord_cartesian
.
coord_cartesian(ylim = quantile(dfr$y, c(0.1, 0.9)))
(Vous aurez probablement encore besoin d'utiliser scale_y_continuous
pour fixer l'axe des pauses.)
J'ai eu le même problème et précalculé les valeurs pour Q1, Q2, median, ymin, Ymax en utilisant 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
Une idée serait de winsoriser les données dans un deux-pass:
Exécutez un premier passage, apprenez quelles sont les limites, par exemple la Coupe de Au percentile donné, ou n écart-type au-dessus de la moyenne, ou...
-
Dans un deuxième passage, définissez les valeurs au-delà de la limite donnée à la valeur de cette limite
Je dois souligner que c'est une méthode démodée qui devrait être dominée par plus de moderne robuste techniques mais vous rencontrez encore beaucoup.
L'option "coef" de la fonction geom_boxplot permet de modifier la coupure aberrante en termes de plages interquartiles. Cette option est documentée pour la fonction stat_boxplot. Pour désactiver les valeurs aberrantes (en d'autres termes, elles sont traitées comme des données régulières), on peut au lieu d'utiliser la valeur par défaut de 1.5 spécifier une valeur de coupure très élevée:
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)
Si vous voulez forcer les moustaches à s'étendre aux valeurs max et min, vous pouvez modifier l'argument coef
. La valeur par défaut pour coef
est 1.5 (c'est-à-dire que la longueur par défaut des moustaches est 1.5 fois L'IQR).
# Load package and create a dummy data frame with outliers
#(using example from Ramnath's 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)
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)
}