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")

entrez la description de l'image ici

97
demandé sur Max Ghenis 2011-04-15 18:00:58

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)
115
répondu Ramnath 2011-04-15 14:22:02

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.)

142
répondu Richie Cotton 2016-10-03 06:17:24

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

Le résultat est un boxplot sans valeurs aberrantes. entrez la description de l'image ici

10
répondu Matthias Munz 2016-03-25 23:44:31

Une idée serait de winsoriser les données dans un deux-pass:

  1. 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...

  2. 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.

8
répondu Dirk Eddelbuettel 2011-04-15 14:06:15

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)
2
répondu eckart 2017-11-08 16:44:57

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)

image de p0

image de p1

1
répondu IggyM 2018-02-23 21:38:48
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)
}
-3
répondu Shicheng Guo 2016-10-27 02:25:42