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
Calculons les moyennes et intervalles de confiance
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
Affichons le graphique et sa 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"))
Si je veux afficher la version où c'est le sexe en abscisse, je ne fais pas les transpositions ci-dessus (lignes avec la fonction t())
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().