web-dev-qa-db-fra.com

Supprimez complètement les valeurs aberrantes de plusieurs boxplots créés avec ggplot2 dans R et affichez les boxplots dans un format étendu

J'ai quelques données ici [dans un fichier .txt] que je lis dans un cadre de données df,

df <- read.table("data.txt", header=T,sep="\t")

Je supprime les valeurs négatives dans la colonne x (car je n'ai besoin que de valeurs positives) de df en utilisant le code suivant,

yp <- subset(df, x>0)

Maintenant, je veux tracer plusieurs boîtes à moustaches dans la même couche. Je fais d'abord fondre le bloc de données df, et le tracé qui en résulte contient plusieurs valeurs aberrantes comme indiqué ci-dessous.

# Melting data frame df    
df_mlt <-melt(df, id=names(df)[1])
    # plotting the boxplots
    plt_wool <- ggplot(subset(df_mlt, value > 0), aes(x=ID1,y=value)) + 
      geom_boxplot(aes(color=factor(ID1))) +
      scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x))) +    
      theme_bw() +
      theme(legend.text=element_text(size=14), legend.title=element_text(size=14))+
      theme(axis.text=element_text(size=20)) +
      theme(axis.title=element_text(size=20,face="bold")) +
      labs(x = "x", y = "y",colour="legend" ) +
      annotation_logticks(sides = "rl") +
      theme(panel.grid.minor = element_blank()) +
      guides(title.hjust=0.5) +
      theme(plot.margin=unit(c(0,1,0,0),"mm")) 
    plt_wool

Boxplot with outliers

Maintenant, je dois avoir un tracé sans aucune valeur aberrante, donc pour ce faire, je calcule d'abord les moustaches de limite inférieure et supérieure J'utilise le code suivant comme suggéré ici ,

sts <- boxplot.stats(yp$x)$stats

Pour supprimer la valeur aberrante, j'ajoute les limites supérieure et inférieure des moustaches comme ci-dessous,

p1 = plt_wool + coord_cartesian(ylim = c(sts*1.05,sts/1.05))

Le tracé résultant est illustré ci-dessous, tandis que la ligne de code ci-dessus supprime correctement la plupart des valeurs aberrantes supérieures, toutes les valeurs aberrantes inférieures demeurent. Quelqu'un pourrait-il suggérer comment supprimer complètement toutes les valeurs aberrantes de ce complot, merci.

enter image description here

14
Amm

Sur la base des suggestions de @Sven Hohenstein, @Roland et @lukeA, j'ai résolu le problème d'affichage de plusieurs boîtes à moustaches sous forme développée sans valeurs aberrantes.

Tracez d'abord les tracés de boîte sans valeurs aberrantes en utilisant outlier.colour=NA Dans geom_boxplot()

plt_wool <- ggplot(subset(df_mlt, value > 0), aes(x=ID1,y=value)) + 
  geom_boxplot(aes(color=factor(ID1)),outlier.colour = NA) +
  scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x))) +
  theme_bw() +
  theme(legend.text=element_text(size=14), legend.title=element_text(size=14))+
  theme(axis.text=element_text(size=20)) +
  theme(axis.title=element_text(size=20,face="bold")) +
  labs(x = "x", y = "y",colour="legend" ) +
  annotation_logticks(sides = "rl") +
  theme(panel.grid.minor = element_blank()) +
  guides(title.hjust=0.5) +
  theme(plot.margin=unit(c(0,1,0,0),"mm"))

Calculez ensuite les moustaches inférieures et supérieures en utilisant boxplot.stats() comme code ci-dessous. Comme je ne prends en compte que des valeurs positives, je les choisis en utilisant la condition dans la subset().

yp <- subset(df, x>0)             # Choosing only +ve values in col x
sts <- boxplot.stats(yp$x)$stats  # Compute lower and upper whisker limits

Maintenant, pour obtenir une vue étendue complète des multiples boîtes à moustaches, il est utile de modifier la limite de l'axe y du tracé à l'intérieur de la fonction coord_cartesian() comme ci-dessous,

p1 = plt_wool + coord_cartesian(ylim = c(sts[2]/2,max(sts)*1.05))

Remarque: Les limites de y doivent être ajustées en fonction du cas spécifique. Dans ce cas, j'ai choisi la moitié de la limite inférieure des moustaches pour ymin.

Le tracé résultant est ci-dessous,

16
Amm

Un exemple reproductible minimal:

library(ggplot2)
p <- ggplot(mtcars, aes(factor(cyl), mpg))
p + geom_boxplot()

Ne pas tracer de valeurs aberrantes:

p + geom_boxplot(outlier.shape=NA)
#Warning message:
#Removed 3 rows containing missing values (geom_point).

(Je préfère recevoir cet avertissement, car dans un an avec un long script, cela me rappellerait que j'ai fait quelque chose de spécial là-bas. Si vous voulez l'éviter, utilisez la solution de Sven.)

20
Roland

Vous pouvez rendre les valeurs aberrantes invisibles avec l'argument outlier.colour = NA:

geom_boxplot(aes(color = factor(ID1)), outlier.colour = NA)
4
Sven Hohenstein

Une autre façon d'exclure les valeurs aberrantes est de les calculer puis de définir la limite y sur ce que vous considérez comme une valeur aberrante.

Par exemple, si vos limites supérieure et inférieure sont Q3 + 1.5 IQR et Q1 - 1.5 IQR, vous pouvez alors utiliser:

upper.limit <- quantile(x)[4] + 1.5*IQR(x)
lower.limit <- quantile(x)[2] - 1.5*IQR(x)

Ensuite, placez des limites sur la plage de l'axe des y:

ggplot + coord_cartesian(ylim=c(lower.limit, upper.limit))
3
Amer
ggplot(df_mlt, aes(x = ID1, y = value)) + 
  geom_boxplot(outlier.size = NA) + 
  coord_cartesian(ylim = range(boxplot(df_mlt$value, plot=FALSE)$stats)*c(.9, 1.1))
3
lukeA