Les diagrammes en barres comparent des catégories
Un diagramme en barres répond à « combien de chaque ? » - une barre par catégorie, la longueur de la barre indiquant la valeur de la catégorie. En R, la fonction de base est barplot(), et son entrée est simplement un vecteur de hauteurs. Donne des noms au vecteur et ces noms deviennent les étiquettes sous les barres :
visits <- c(Mon = 42, Tue = 51, Wed = 47, Thu = 60, Fri = 78)
barplot(visits,
main = "Store visits by day",
ylab = "Visits")
Cinq barres grises, étiquetées par jour, montant d'un lundi modeste à un pic du vendredi presque deux fois plus haut. Rien à installer, rien à configurer - si tu sais construire un vecteur nommé, tu sais le tracer.
Les éditeurs exécutables de cette page n'affichent que du texte, donc les appels à barplot() ici sont des extraits statiques à coller dans une session R locale - mais l'étape de comptage qui les précède s'exécute très bien, et c'est l'étape qui compte le plus.
Le vrai déroulé : table() d'abord, barplot() ensuite
En pratique tu as rarement des hauteurs déjà comptées et bien rangées. Tu as une colonne brute d'étiquettes de catégories - une ligne par réponse d'enquête, par commande, par utilisateur - et le comptage est le vrai travail. table() le fait en un appel, et sa sortie est un vecteur nommé d'effectifs, c'est-à-dire exactement ce que veut barplot() :
Puis le graphique tient en une ligne de plus :
barplot(sort(t, decreasing = TRUE),
main = "Survey responses",
ylab = "Count")
Ces deux étapes - table() puis barplot() - constituent le flux de diagramme en barres le plus courant en R. Trier la table d'abord est une amélioration à bas prix : des barres ordonnées par hauteur se lisent plus vite que des barres ordonnées alphabétiquement, sauf si les catégories ont un ordre naturel (jours, mois, niveaux de dose) - auquel cas un facteur aux niveaux correctement ordonnés empêche table() de les classer par ordre alphabétique. Pour des barres qui demandent une vraie agrégation - des sommes ou des moyennes par groupe plutôt que des effectifs de lignes - fais d'abord l'étape grouper et résumer et donne le résultat à barplot().
Étiquettes et style
Les étiquettes viennent normalement des noms du vecteur, mais names.arg les remplace - utile quand les codes des données ne conviennent pas à un public :
barplot(visits,
names.arg = c("Monday", "Tuesday", "Wednesday",
"Thursday", "Friday"),
col = "steelblue",
border = NA,
main = "Store visits by day",
las = 2)
colremplit les barres ; passe un vecteur pour colorer chaque barre individuellement, mais résiste à l'arc-en-ciel par défaut - la couleur devrait signifier quelque chose, comme mettre en avant la seule barre dont tu parles.border = NAsupprime les contours des barres pour un rendu plus propre.las = 2fait pivoter les étiquettes d'axe perpendiculairement à l'axe - la solution quand de longs noms de catégories se chevauchent. Combine-le avec une marge inférieure plus grande (par(mar = c(8, 4, 4, 2))) si les noms sont vraiment longs.
Barres groupées et empilées à partir d'une matrice
Pour montrer deux dimensions catégorielles d'un coup - disons les ventes par canal et par trimestre - donne une matrice à barplot(). Chaque colonne devient une position sur l'axe des catégories, et les lignes deviennent les sous-barres :
sales <- matrix(c(12, 18, 15, 22, 20, 19, 24, 27),
nrow = 2,
dimnames = list(c("Online", "Retail"),
c("Q1", "Q2", "Q3", "Q4")))
# Grouped: rows stand next to each other within each quarter
barplot(sales, beside = TRUE,
col = c("steelblue", "orange"),
legend.text = rownames(sales),
main = "Sales by channel and quarter")
# Stacked: rows pile up into one total bar per quarter (the default)
barplot(sales, beside = FALSE,
col = c("steelblue", "orange"),
legend.text = rownames(sales))
beside = TRUE met les deux canaux épaule contre épaule dans chaque trimestre - idéal quand tu veux comparer directement les canaux. L'empilement par défaut met l'accent sur le total par trimestre, avec la répartition montrée à l'intérieur de chaque barre ; c'est honnête pour les totaux mais rend les segments internes difficiles à comparer d'une barre à l'autre, puisque leurs lignes de base se décalent. legend.text = rownames(sales) ajoute la légende qui rend l'une ou l'autre version lisible.
Un interrupteur de plus : horiz = TRUE couche les barres le long de l'axe horizontal. C'est la disposition la plus aimable pour de nombreuses catégories aux noms longs - chaque étiquette est sur sa propre ligne à côté de sa barre, aucune rotation nécessaire.
Diagramme en barres ou histogramme ?
Les gens confondent constamment les deux, et la distinction vaut trente secondes : un diagramme en barres compare des catégories distinctes - l'axe est un ensemble d'étiquettes, les barres sont séparées, et les réordonner est légitime. Un histogramme découpe une variable numérique en classes - l'axe est une échelle continue, les barres se touchent parce que les classes sont des intervalles consécutifs, et les réordonner n'aurait aucun sens. Si ta colonne contient des mots (« Yes », « Chrome », « Q3 »), tu veux barplot(table(x)). Si elle contient des mesures (tailles, prix, temps de réponse), tu veux l'histogramme et hist(x).
ggplot2 : geom_col ou geom_bar
La version ggplot2 vient en deux geoms, selon que le comptage est déjà fait ou non :
library(ggplot2)
# geom_bar(): raw observations in, counting done for you
ggplot(survey, aes(x = response)) +
geom_bar(fill = "steelblue")
# geom_col(): heights already computed, one row per bar
totals <- data.frame(day = c("Mon", "Tue", "Wed", "Thu", "Fri"),
visits = c(42, 51, 47, 60, 78))
ggplot(totals, aes(x = day, y = visits)) +
geom_col(fill = "steelblue")
geom_bar() est le table() intégré au graphique : il prend une ligne par observation et dénombre. geom_col() prend des données déjà agrégées et associe une colonne y à la hauteur des barres - l'équivalent du barplot() classique. Donner des données déjà comptées à geom_bar() est le piège standard du débutant : il compte les lignes (une chacune) et toutes les barres sortent à la même hauteur.
Ce que tu retiens
barplot(heights)trace un vecteur nommé - ettable(x)produit exactement cette forme à partir de données de catégories brutes, doncbarplot(table(x))est l'idiome central.- Trie la table (ou fixe les niveaux du facteur) avant de tracer ; l'ordre des barres fait partie du message.
- Une matrice donne des barres groupées (
beside = TRUE) ou empilées (par défaut) ; ajoutelegend.text = rownames(m). names.arg,col,las = 2ethoriz = TRUEgèrent l'étiquetage ; les barres horizontales sont idéales pour les noms longs.- Catégories → diagramme en barres ; classes numériques → histogramme. En ggplot2 : lignes brutes →
geom_bar(), hauteurs calculées →geom_col().
Prochaine étape : ggplot2 lui-même - la grammaire qui construit tous ces graphiques, et bien d'autres, à partir des mêmes quelques pièces combinables.
Questions fréquentes
Comment faire un diagramme en barres en R ?
Appelle barplot() sur un vecteur de hauteurs. Donne des noms au vecteur - ou construis-le avec table(), dont la sortie est déjà nommée - et chaque élément devient une barre étiquetée : barplot(table(df$category)).
Comment faire un barplot groupé ou empilé en R ?
Passe une matrice. Chaque colonne devient une position sur l'axe des catégories ; beside = TRUE dessine les lignes comme des barres côte à côte (groupées), tandis que le beside = FALSE par défaut les empile. Ajoute legend.text = rownames(m) pour que les lecteurs distinguent les lignes.
Quelle est la différence entre barplot() et hist() en R ?
barplot() compare des catégories distinctes - une barre par catégorie, barres séparées. hist() découpe une variable numérique en intervalles consécutifs - les barres se touchent parce que l'axe est une échelle continue. Si ta variable est faite de mots, tu veux barplot(table(x)) ; si ce sont des nombres, tu veux hist(x).
Dois-je utiliser geom_bar ou geom_col dans ggplot2 ?
geom_bar() compte pour toi - donne-lui des observations brutes et il dénombre chaque catégorie. geom_col() trace des valeurs que tu as déjà calculées - donne-lui une ligne par barre plus une colonne de hauteurs. Des données déjà comptées avec geom_bar() est l'erreur classique ; il faut geom_col().