Comment pourrais-je ignorer les valeurs aberrantes dans la boîte à moustaches ggplot2? Je ne veux pas simplement qu'elles disparaissent (c'est-à-dire outlier.size = 0), mais je veux qu'elles soient ignorées, de sorte que l'axe des ordonnées indique le premier/troisième percentile. Mes valeurs aberrantes font que la "boîte" se contracte si petite que c'est pratiquement une ligne. Existe-t-il des techniques pour gérer cela?
Edit Voici un exemple:
y = c(.01, .02, .03, .04, .05, .06, .07, .08, .09, .5, -.6)
qplot(1, y, geom="boxplot")
Voici une solution utilisant 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)
Utilisez geom_boxplot(outlier.shape = NA)
pour ne pas afficher les valeurs éloignées et scale_y_continuous(limits = c(lower, upper))
pour modifier les limites d'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 rogner 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 corriger les ruptures d'axe.)
J'ai eu le même problème et précalculé les valeurs pour Q1, Q2, médiane, 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
Le résultat est une boîte à moustaches sans valeurs aberrantes.
Une idée serait de Winsize les données dans une procédure en deux passes:
exécutez une première passe, découvrez quelles sont les limites, par exemple. coupe de au centile donné, ou N écart type au-dessus de la moyenne, ou ...
dans un second passage, définissez les valeurs au-delà de la liaison donnée sur la valeur de cette liaison
Je devrais souligner que c’est une méthode à l’ancienne qui devrait être dominée par un plus grand nombre de techniques robustes modernes mais vous le rencontrez encore souvent.
L'option "coef" de la fonction geom_boxplot permet de modifier le seuil des valeurs aberrantes en termes d'intervalle interquartile. 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 standard), on peut au lieu d’utiliser la valeur par défaut de 1,5 pour spécifier une valeur de seuil 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 de coef
est de 1,5 (la longueur par défaut des moustaches est de 1,5 fois le 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)