W3docs

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 matplotlib

Si 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 / 2 décale la première série vers la gauche ; x + width / 2 décale la deuxième série vers la droite, de sorte que les barres se trouvent côte à côte.
  • ax.set_xticks(x) et ax.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âcheCode
Graphique à barres verticalesplt.bar(x, y)
Graphique à barres horizontalesplt.barh(y, width)
Changer la couleurplt.bar(x, y, color='steelblue')
Changer la largeurplt.bar(x, y, width=0.5)
Barres empiléesplt.bar(x, y2, bottom=y1)
Barres d'erreurplt.bar(x, y, yerr=errors, capsize=5)
Ajouter des étiquettes de valeurax.bar_label(bars, padding=3)
Pivoter les étiquettes xplt.xticks(rotation=45, ha='right')
Enregistrer dans un fichierplt.savefig('file.png', dpi=150)

Chapitres connexes

Was this page helpful?