Graphiques à barres Matplotlib en Python — Guide complet
Créez des graphiques à barres verticaux, horizontaux, groupés et empilés en Python avec Matplotlib. Couleurs, largeurs, barres d'erreur et enregistrement inclus.
Les fonctions bar() et barh() de Matplotlib vous permettent de créer des graphiques à barres pour comparer des quantités entre différentes catégories. Ce chapitre couvre tout, du graphique simple à une seule série jusqu'aux dispositions groupées et empilées, avec des options de personnalisation pratiques que vous utiliserez dans de vrais projets : couleurs, largeur des barres, style des bordures, barres d'erreur et enregistrement du résultat dans un fichier.
Avant de commencer, assurez-vous que Matplotlib est installé :
pip install matplotlibSi vous découvrez la bibliothèque, consultez d'abord les chapitres Introduction à Matplotlib et Prise en main.
Qu'est-ce qu'un graphique à barres ?
Un graphique à barres utilise des barres rectangulaires dont la longueur représente une valeur numérique, ce qui facilite la comparaison de quantités entre des catégories discrètes — par exemple, le chiffre d'affaires mensuel, la population par pays ou les notes par matière.
Utilisez un graphique à barres lorsque :
- Vous comparez une seule métrique entre différentes catégories (graphique à barres simple).
- Vous souhaitez montrer comment un total se décompose en parties (graphique à barres empilées).
- Vous devez comparer plusieurs métriques côte à côte pour les mêmes catégories (graphique à barres groupées).
- Vos étiquettes de catégories sont longues et se lisent mieux horizontalement (graphique à barres horizontal).
Créer un graphique à barres verticales de base
La fonction plt.bar(x, height) prend une séquence d'étiquettes de catégories (ou de positions numériques) et une séquence correspondante de hauteurs de barres.
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D', 'E']
values = [10, 24, 36, 40, 15]
plt.bar(categories, values)
plt.title('Sample Bar Chart')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
plt.show()plt.tight_layout() empêche les étiquettes d'axe d'être tronquées — une bonne habitude à adopter avant chaque appel à show() ou savefig().
Personnaliser l'apparence des barres
Couleur
Passez un nom de couleur, une chaîne hexadécimale ou une liste de couleurs par barre au paramètre color :
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D', 'E']
values = [10, 24, 36, 40, 15]
# One color for all bars
plt.bar(categories, values, color='steelblue')
plt.title('Steelblue Bars')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
plt.show()Pour colorer chaque barre différemment, passez une liste :
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D', 'E']
values = [10, 24, 36, 40, 15]
colors = ['#e74c3c', '#3498db', '#2ecc71', '#f39c12', '#9b59b6']
plt.bar(categories, values, color=colors)
plt.title('Multi-Color Bar Chart')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
plt.show()Largeur des barres et couleur de bordure
La valeur par défaut de width est 0.8 (80 % de l'espace entre les positions des graduations). Diminuez-la pour un rendu plus aéré ou augmentez-la pour remplir davantage l'espace. edgecolor trace un contour autour de chaque barre :
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D', 'E']
values = [10, 24, 36, 40, 15]
plt.bar(
categories, values,
width=0.5,
color='cornflowerblue',
edgecolor='navy',
linewidth=1.2,
)
plt.title('Custom Width and Edge')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
plt.show()Ajouter une légende
Passez une chaîne label à bar() puis appelez plt.legend() :
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D', 'E']
values = [10, 24, 36, 40, 15]
plt.bar(categories, values, color='teal', label='2024 Sales')
plt.legend()
plt.title('Bar Chart with Legend')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
plt.show()Rotation des étiquettes de graduation
Les noms de catégories longs se chevauchent s'ils ne sont pas pivotés avec plt.xticks(rotation=...) :
import matplotlib.pyplot as plt
months = ['January', 'February', 'March', 'April', 'May', 'June']
sales = [120, 95, 140, 160, 130, 175]
plt.bar(months, sales, color='darkorange')
plt.xticks(rotation=45, ha='right') # ha='right' aligns the labels nicely
plt.title('Monthly Sales')
plt.xlabel('Month')
plt.ylabel('Units Sold')
plt.tight_layout()
plt.show()Graphiques à barres horizontales
plt.barh(y, width) trace des barres qui s'étendent horizontalement. C'est particulièrement utile lorsque les étiquettes de catégories sont longues, car elles apparaissent sur l'axe y avec suffisamment d'espace horizontal.
import matplotlib.pyplot as plt
languages = ['Python', 'JavaScript', 'Java', 'C#', 'TypeScript']
popularity = [30.3, 25.1, 17.8, 12.4, 9.6]
plt.barh(languages, popularity, color='mediumseagreen')
plt.title('Programming Language Popularity (%)')
plt.xlabel('Share (%)')
plt.ylabel('Language')
plt.tight_layout()
plt.show()Conseil : triez les données avant de les tracer pour que la catégorie la plus populaire apparaisse en haut :
import matplotlib.pyplot as plt
languages = ['Python', 'JavaScript', 'Java', 'C#', 'TypeScript']
popularity = [30.3, 25.1, 17.8, 12.4, 9.6]
# Sort ascending so the highest bar ends up at the top after barh reversal
pairs = sorted(zip(popularity, languages))
popularity_sorted, languages_sorted = zip(*pairs)
plt.barh(languages_sorted, popularity_sorted, color='mediumseagreen')
plt.title('Programming Language Popularity (sorted)')
plt.xlabel('Share (%)')
plt.tight_layout()
plt.show()Graphiques à barres groupées
Un graphique à barres groupées (côte à côte) compare deux séries ou plus pour le même ensemble de catégories. Matplotlib ne dispose pas de fonction dédiée pour cela — vous le créez en décalant les positions x de chaque série à l'aide de NumPy :
import matplotlib.pyplot as plt
import numpy as np
categories = ['Q1', 'Q2', 'Q3', 'Q4']
sales_2023 = [120, 135, 150, 170]
sales_2024 = [140, 160, 145, 195]
x = np.arange(len(categories)) # [0, 1, 2, 3]
width = 0.35 # width of each individual bar
fig, ax = plt.subplots()
bars1 = ax.bar(x - width / 2, sales_2023, width, label='2023', color='steelblue')
bars2 = ax.bar(x + width / 2, sales_2024, width, label='2024', color='darkorange')
ax.set_title('Quarterly Sales Comparison')
ax.set_xlabel('Quarter')
ax.set_ylabel('Units Sold')
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()
plt.tight_layout()
plt.show()Points clés :
x - width / 2décale la première série vers la gauche ;x + width / 2décale la deuxième série vers la droite, de sorte que les barres se trouvent côte à côte.ax.set_xticks(x)etax.set_xticklabels(categories)placent les étiquettes de catégories au centre de chaque groupe.- L'API orientée objet (
fig, ax = plt.subplots()) est préférable pour les graphiques groupés car elle vous donne un contrôle explicite sur chaque axe.
Ajouter des étiquettes de valeur sur les barres
Vous pouvez annoter chaque barre avec sa valeur à l'aide de ax.bar_label() (ajouté dans Matplotlib 3.4) :
import matplotlib.pyplot as plt
import numpy as np
categories = ['Q1', 'Q2', 'Q3', 'Q4']
sales_2023 = [120, 135, 150, 170]
sales_2024 = [140, 160, 145, 195]
x = np.arange(len(categories))
width = 0.35
fig, ax = plt.subplots()
bars1 = ax.bar(x - width / 2, sales_2023, width, label='2023', color='steelblue')
bars2 = ax.bar(x + width / 2, sales_2024, width, label='2024', color='darkorange')
ax.bar_label(bars1, padding=3)
ax.bar_label(bars2, padding=3)
ax.set_title('Quarterly Sales with Labels')
ax.set_xlabel('Quarter')
ax.set_ylabel('Units Sold')
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()
plt.tight_layout()
plt.show()Graphiques à barres empilées
Un graphique à barres empilées place les séries les unes sur les autres, montrant comment les parties individuelles contribuent à un total. Utilisez le paramètre bottom pour indiquer à Matplotlib où chaque série doit commencer :
import matplotlib.pyplot as plt
import numpy as np
categories = ['A', 'B', 'C', 'D', 'E']
series1 = [10, 24, 36, 40, 15]
series2 = [ 5, 12, 15, 20, 10]
series3 = [ 8, 6, 10, 12, 7]
x = np.arange(len(categories))
plt.bar(x, series1, label='Group 1', color='steelblue')
plt.bar(x, series2, label='Group 2', color='darkorange',
bottom=series1)
plt.bar(x, series3, label='Group 3', color='seagreen',
bottom=np.array(series1) + np.array(series2))
plt.xticks(x, categories)
plt.title('Stacked Bar Chart')
plt.xlabel('Category')
plt.ylabel('Total Value')
plt.legend()
plt.tight_layout()
plt.show()Le bottom de la troisième série correspond à la somme élément par élément des deux premières, de sorte que chaque barre commence exactement là où la précédente s'est terminée. L'utilisation de np.array() garantit que l'addition fonctionne correctement avec des listes.
Barres d'erreur
Lorsque vos données présentent une incertitude ou une variabilité (par exemple, l'écart type sur des mesures répétées), ajoutez des barres d'erreur avec le paramètre yerr :
import matplotlib.pyplot as plt
import numpy as np
categories = ['Control', 'Treatment A', 'Treatment B', 'Treatment C']
means = [5.2, 7.8, 6.1, 9.4]
std_devs = [0.5, 0.8, 0.6, 1.1]
plt.bar(
categories, means,
yerr=std_devs,
capsize=5, # width of the error bar caps
color='cornflowerblue',
edgecolor='black',
linewidth=0.8,
)
plt.title('Experimental Results with Error Bars')
plt.xlabel('Group')
plt.ylabel('Mean Value')
plt.tight_layout()
plt.show()capsize contrôle les caps horizontaux en haut et en bas de chaque barre d'erreur ; une valeur de 4 à 6 est généralement lisible.
Enregistrer un graphique à barres dans un fichier
Utilisez plt.savefig() à la place de plt.show() (ou appelez-le avant show()). Vous pouvez spécifier le format via l'extension du fichier :
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D', 'E']
values = [10, 24, 36, 40, 15]
plt.bar(categories, values, color='steelblue')
plt.title('Saved Bar Chart')
plt.xlabel('Category')
plt.ylabel('Value')
plt.tight_layout()
# Save as PNG at 150 dpi
plt.savefig('bar_chart.png', dpi=150)
# Save as vector PDF (ideal for publications)
plt.savefig('bar_chart.pdf')
plt.show()Options de format courantes : png, pdf, svg, eps. Utilisez svg ou pdf lorsque vous avez besoin d'une image vectorielle prête pour l'impression.
Contrôler la taille de la figure
Par défaut, Matplotlib crée une figure de 6,4 × 4,8 pouces. Passez figsize=(width, height) à plt.figure() ou plt.subplots() pour la modifier :
import matplotlib.pyplot as plt
categories = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
values = [80, 70, 95, 110, 130, 150, 160, 155, 120, 100, 85, 90]
fig, ax = plt.subplots(figsize=(12, 5)) # wider figure for 12 months
ax.bar(categories, values, color='tomato')
ax.set_title('Monthly Data')
ax.set_xlabel('Month')
ax.set_ylabel('Value')
plt.tight_layout()
plt.savefig('monthly_bar_chart.png', dpi=150)
plt.show()Référence rapide
| Tâche | Code |
|---|---|
| Graphique à barres verticales | plt.bar(x, y) |
| Graphique à barres horizontales | plt.barh(y, width) |
| Changer la couleur | plt.bar(x, y, color='steelblue') |
| Changer la largeur | plt.bar(x, y, width=0.5) |
| Barres empilées | plt.bar(x, y2, bottom=y1) |
| Barres d'erreur | plt.bar(x, y, yerr=errors, capsize=5) |
| Ajouter des étiquettes de valeur | ax.bar_label(bars, padding=3) |
| Pivoter les étiquettes x | plt.xticks(rotation=45, ha='right') |
| Enregistrer dans un fichier | plt.savefig('file.png', dpi=150) |
Chapitres connexes
- Introduction à Matplotlib — présentation de la bibliothèque et installation
- Courbes Matplotlib — tendances de données continues
- Nuages de points Matplotlib — relations entre deux variables
- Histogrammes Matplotlib — distribution d'une seule variable
- Graphiques en secteurs Matplotlib — proportions partie par rapport au tout
- Étiquettes Matplotlib — étiquettes d'axe, titres et annotations
- Grille Matplotlib — ajout et stylisation des lignes de grille
- Sous-graphiques Matplotlib — plusieurs graphiques dans une seule figure