web-dev-qa-db-fra.com

Mettez les extrémités des moustaches sur le boxplot

Je voudrais mettre des lignes perpendiculaires aux extrémités des moustaches comme la fonction boxplot donne automatiquement.

40
user1762299

Comme indiqué mais non implémenté par @Roland, vous pouvez utiliser stat_boxplot pour implémenter cela. L'astuce appelant _boxplot deux fois et consiste à définir geom sur errorbar pour l'un des appels.

Notez que comme R utilise une approche stylo et papier, il est conseillé d'implémenter les barres d'erreur d'abord en dessinant le boxplot traditionnel par-dessus.

Utilisation des données fictives de @ Roland df

ggplot(df, aes(x=cond, y = value))  + 
 stat_boxplot(geom ='errorbar') + 
 geom_boxplot() # shorthand for  stat_boxplot(geom='boxplot')

enter image description here

L'aide pour stat_boxplot (?stat_boxplot) détaille les différentes valeurs calculées et enregistrées dans un data.frame

53
mnel

Pour redimensionner les lignes de moustaches, nous pouvons utiliser l'argument width = 0.5 à l'intérieur de la fonction: stat_boxplot

set.seed(42)
df <- data.frame(cond = factor(rep(c("A", "B"), each = 500)), 
                 value = c(rnorm(500, mean = 1, sd = 0.2), 
                           rnorm(500, mean = 1.5, sd = 0.1))) 

library(ggplot2)
ggplot(df, aes(x = cond, y = value)) +
       stat_boxplot(geom = "errorbar", width = 0.5) +  
       geom_boxplot() 

enter image description here

23
mpalanco

Il pourrait être possible d'utiliser stat_boxplot pour calculer les fins de moustaches, mais je ne suis pas assez _ ggplot2 assistant, donc j'utilise la fonction de base pour cela.

set.seed(42)
df <- data.frame(cond = factor( rep(c("A","B"), each=500) ), 
                 value = c(rnorm(500,mean=1,sd=0.2),rnorm(500, mean=1.5,sd=0.1)))


whisk <- function(df,cond_col=1,val_col=2) {
  require(reshape2)
  condname <- names(df)[cond_col]
  names(df)[cond_col] <- "cond" 
  names(df)[val_col] <- "value"
  b <- boxplot(value~cond,data=df,plot=FALSE)
  df2 <- cbind(as.data.frame(b$stats),c("min","lq","m","uq","max"))
  names(df2) <- c(levels(df$cond),"pos")
  df2 <- melt(df2,id="pos",variable.name="cond")
  df2 <- dcast(df2,cond~pos)  
  names(df2)[1] <- condname
  df2
}



library(ggplot2)

plot1 <- ggplot(df, aes(x=cond)) 
plot1 <- plot1 + geom_errorbar(aes(ymin=min,ymax=max),data=whisk(df),width = 0.5)
plot1 <- plot1 + geom_boxplot(aes(y=value))
plot1

boxplot with horizontal at whisker ends

7
Roland