Diagramme en bâtons avec barres regroupées, barres d’erreur et légende en R

Comment exprimer une variable en fonction de 2 variables croisées pour tracer un diagramme en barres ?

Comment transposer le croisement de ces deux variables pour mettre l'un ou l'autre en abscisse ?

L'essentiel de cette page.

J'ai une variable numérique (exemple le poids) et je souhaite voir comment elle évolue en fonction de deux variables catégorielles (le sexe et le fait de faire du sport). Comment croiser ces deux dernières variables pour arriver à un diagramme en barres avec barres d'erreur et légende ?

Et aussi, comment transposer mes deux variables. Je mets laquelle en abscisse ?

Simulons nos variables pour 100 filles et 100 garçons

poids <- c(rnorm(100,60,7),rnorm(100,70,8)) 

sport <- sample(c("Sport","Pas sport","Ne se prononce pas"),200,replace=TRUE)

sexe <- c(rep("F",100),rep("M",100))


data <- data.frame(poids, sport,sexe) ; head(data)

     poids sexe              sport

1 52.46493    F Ne se prononce pas

2 57.17160    F Ne se prononce pas

3 55.84099    F Ne se prononce pas

4 59.76138    F              Sport

5 55.97607    F          Pas sport

6 64.36113    F          Pas sport

moy <- by(data$poids,data[,c(2,3)],mean) # Moyennes du poids en fonction du croisement des variables 2 et 3.

moy <- ftable(moy) ; moy # Organiser les moyennes en tableau

moy <- as.matrix(moy) ; moy # Pour la reconnaissance de la légende

t(moy)-> moy 

print(moy)

# Calculons les intervalles de confiance pour les barres d'erreur

library(KefiR)

IC  <- by(data$poids,data[,c(2,3)],int.ech)

IC <- ftable(IC) ; IC

IC <- as.matrix(IC) # Pour la reconnaissance de la légende

t(IC) -> IC # Optionnel : basculer le tableau pour mettre le sport en abscisse et le sexe en légende

library(gplots)

bplt <- barplot2(moy,beside=T,plot.ci=T,ci.l=moy-IC,ci.u=IC+moy,col=c("red","blue"))

legend("topleft",legend=levels(as.factor(data[,3])), fill=c("red","blue"))

bplt <- barplot2(moy,beside=T,plot.ci=T,ci.l=moy-IC,ci.u=IC+moy,col=c("red","blue","green"),names.arg=levels(factor(data[,3])))

legend("topleft",legend=levels(as.factor(data[,2])), fill=c("red","blue","green"))

On ajoute très facilement les lettres des catégories de moyennes ou les étoiles de significativité avec la fonction text().