🔝 Retour au Sommaire
Matplotlib est la bibliothèque de visualisation de données la plus populaire en Python. Elle permet de créer une grande variété de graphiques statiques, animés et interactifs. Dans ce chapitre, nous allons découvrir les bases de Matplotlib et apprendre à créer les graphiques les plus courants.
Avant de commencer, assurez-vous que Matplotlib est installé :
pip install matplotlibLa convention standard pour importer Matplotlib est la suivante :
import matplotlib.pyplot as plt
import numpy as np # Souvent utilisé avec Matplotlib pyplot est le module de Matplotlib qui fournit une interface simple pour créer des graphiques.
Avant de créer nos premiers graphiques, il est important de comprendre la structure de base :
- Figure : C'est la fenêtre ou la page entière où tout est dessiné
- Axes : Ce sont les zones de tracé où vos données sont affichées (un graphique peut contenir plusieurs axes)
- Axis : Les axes x et y avec leurs graduations et étiquettes
# Création d'une figure et d'un axe
fig, ax = plt.subplots()
# fig est la figure entière
# ax est l'axe où on trace nos donnéesLe graphique en ligne est le type de graphique le plus basique et le plus utilisé. Il est idéal pour visualiser l'évolution d'une variable dans le temps.
import matplotlib.pyplot as plt
# Données
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
# Création du graphique
plt.plot(x, y)
plt.xlabel('Axe X')
plt.ylabel('Axe Y')
plt.title('Mon premier graphique')
plt.show() import matplotlib.pyplot as plt
import numpy as np
# Données
x = np.linspace(0, 10, 100) # 100 points entre 0 et 10
y = np.sin(x)
# Création du graphique avec personnalisation
plt.figure(figsize=(10, 6)) # Taille de la figure
plt.plot(x, y, color='blue', linewidth=2, linestyle='-', label='sin(x)')
plt.plot(x, np.cos(x), color='red', linewidth=2, linestyle='--', label='cos(x)')
# Personnalisation
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Fonctions trigonométriques')
plt.legend() # Affiche la légende
plt.grid(True) # Affiche la grille
plt.show() Options de style de ligne courantes :
'-': ligne continue (par défaut)'--': ligne pointillée'-.': ligne point-tiret':': ligne en pointillés'o': marqueurs ronds's': marqueurs carrés'^': marqueurs triangulaires
Les diagrammes à barres sont parfaits pour comparer des catégories différentes.
import matplotlib.pyplot as plt
# Données
categories = ['Produit A', 'Produit B', 'Produit C', 'Produit D']
valeurs = [23, 45, 56, 78]
# Création du graphique
plt.figure(figsize=(10, 6))
plt.bar(categories, valeurs, color='skyblue', edgecolor='navy')
plt.xlabel('Produits')
plt.ylabel('Ventes')
plt.title('Ventes par produit')
plt.show() import matplotlib.pyplot as plt
# Données
categories = ['Produit A', 'Produit B', 'Produit C', 'Produit D']
valeurs = [23, 45, 56, 78]
# Création du graphique
plt.figure(figsize=(10, 6))
plt.barh(categories, valeurs, color='lightcoral')
plt.xlabel('Ventes')
plt.ylabel('Produits')
plt.title('Ventes par produit (horizontal)')
plt.show() import matplotlib.pyplot as plt
import numpy as np
# Données
categories = ['Q1', 'Q2', 'Q3', 'Q4']
ventes_2023 = [20, 35, 30, 35]
ventes_2024 = [25, 32, 34, 40]
# Position des barres
x = np.arange(len(categories))
largeur = 0.35
# Création du graphique
fig, ax = plt.subplots(figsize=(10, 6))
barres1 = ax.bar(x - largeur/2, ventes_2023, largeur, label='2023', color='steelblue')
barres2 = ax.bar(x + largeur/2, ventes_2024, largeur, label='2024', color='orange')
# Personnalisation
ax.set_xlabel('Trimestre')
ax.set_ylabel('Ventes (en milliers)')
ax.set_title('Comparaison des ventes 2023 vs 2024')
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()
plt.show()Les nuages de points sont utilisés pour visualiser la relation entre deux variables continues.
import matplotlib.pyplot as plt
import numpy as np
# Données
x = np.random.rand(50) * 100
y = np.random.rand(50) * 100
# Création du graphique
plt.figure(figsize=(10, 6))
plt.scatter(x, y, c='purple', alpha=0.5, s=100)
plt.xlabel('Variable X')
plt.ylabel('Variable Y')
plt.title('Nuage de points')
plt.grid(True, alpha=0.3)
plt.show() Paramètres importants :
s: taille des pointsc: couleur des pointsalpha: transparence (0 = transparent, 1 = opaque)marker: forme des marqueurs
import matplotlib.pyplot as plt
import numpy as np
# Données
n = 50
x = np.random.rand(n) * 100
y = np.random.rand(n) * 100
couleurs = np.random.rand(n)
tailles = np.random.rand(n) * 1000
# Création du graphique
plt.figure(figsize=(10, 6))
scatter = plt.scatter(x, y, c=couleurs, s=tailles, alpha=0.5, cmap='viridis')
plt.colorbar(scatter, label='Intensité')
plt.xlabel('Variable X')
plt.ylabel('Variable Y')
plt.title('Nuage de points avec couleurs et tailles variables')
plt.show() Les histogrammes permettent de visualiser la distribution d'une variable numérique.
import matplotlib.pyplot as plt
import numpy as np
# Données : distribution normale
data = np.random.randn(1000)
# Création de l'histogramme
plt.figure(figsize=(10, 6))
plt.hist(data, bins=30, color='steelblue', edgecolor='black', alpha=0.7)
plt.xlabel('Valeur')
plt.ylabel('Fréquence')
plt.title('Histogramme d\'une distribution normale')
plt.grid(True, alpha=0.3)
plt.show() Paramètres importants :
bins: nombre de barres (intervalles)edgecolor: couleur des borduresalpha: transparence
import matplotlib.pyplot as plt
import numpy as np
# Données
data1 = np.random.normal(100, 15, 1000)
data2 = np.random.normal(120, 15, 1000)
# Création du graphique
plt.figure(figsize=(10, 6))
plt.hist(data1, bins=30, alpha=0.5, label='Groupe A', color='blue')
plt.hist(data2, bins=30, alpha=0.5, label='Groupe B', color='red')
plt.xlabel('Valeur')
plt.ylabel('Fréquence')
plt.title('Comparaison de deux distributions')
plt.legend()
plt.show() Les diagrammes circulaires sont utilisés pour montrer des proportions ou des pourcentages.
import matplotlib.pyplot as plt
# Données
labels = ['Python', 'JavaScript', 'Java', 'C++', 'Autres']
tailles = [30, 25, 20, 15, 10]
# Création du graphique
plt.figure(figsize=(8, 8))
plt.pie(tailles, labels=labels, autopct='%1.1f%%', startangle=90)
plt.title('Langages de programmation les plus utilisés')
plt.show() Paramètres importants :
autopct: format d'affichage des pourcentagesstartangle: angle de départ (en degrés)explode: distance pour détacher une portion
import matplotlib.pyplot as plt
# Données
labels = ['Python', 'JavaScript', 'Java', 'C++', 'Autres']
tailles = [30, 25, 20, 15, 10]
couleurs = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#ff99cc']
explode = (0.1, 0, 0, 0, 0) # "Explose" la première portion
# Création du graphique
plt.figure(figsize=(10, 8))
plt.pie(tailles, explode=explode, labels=labels, colors=couleurs,
autopct='%1.1f%%', shadow=True, startangle=90)
plt.title('Langages de programmation les plus utilisés', fontsize=16)
plt.axis('equal') # Assure un cercle parfait
plt.show() Matplotlib permet de créer plusieurs graphiques dans une même figure avec subplots().
import matplotlib.pyplot as plt
import numpy as np
# Données
x = np.linspace(0, 10, 100)
# Création d'une figure avec 4 sous-graphiques (2 lignes, 2 colonnes)
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# Premier graphique (ligne)
axes[0, 0].plot(x, np.sin(x))
axes[0, 0].set_title('Graphique en ligne')
# Deuxième graphique (barres)
axes[0, 1].bar(['A', 'B', 'C', 'D'], [3, 7, 2, 5])
axes[0, 1].set_title('Diagramme à barres')
# Troisième graphique (scatter)
axes[1, 0].scatter(np.random.rand(50), np.random.rand(50))
axes[1, 0].set_title('Nuage de points')
# Quatrième graphique (histogramme)
axes[1, 1].hist(np.random.randn(1000), bins=30)
axes[1, 1].set_title('Histogramme')
# Ajustement de l'espacement
plt.tight_layout()
plt.show() Matplotlib propose des styles prédéfinis pour changer rapidement l'apparence de vos graphiques :
import matplotlib.pyplot as plt
import numpy as np
# Liste des styles disponibles
print(plt.style.available)
# Utilisation d'un style
plt.style.use('seaborn-v0_8-darkgrid')
# Création d'un graphique
x = np.linspace(0, 10, 100)
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))
plt.title('Graphique avec style personnalisé')
plt.show() Styles populaires :
'default': style par défaut'seaborn-v0_8-darkgrid': grille sombre'ggplot': style ggplot (de R)'fivethirtyeight': style du site FiveThirtyEight
Pour sauvegarder un graphique au lieu de l'afficher :
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))
plt.title('Mon graphique')
# Sauvegarde
plt.savefig('mon_graphique.png', dpi=300, bbox_inches='tight')
# dpi : résolution (dots per inch)
# bbox_inches='tight' : supprime les marges blanchesFormats supportés : PNG, PDF, SVG, JPG, etc.
- Toujours étiqueter vos axes :
xlabel()etylabel() - Ajouter un titre explicite :
title() - Utiliser des légendes quand vous avez plusieurs séries :
legend() - Choisir des couleurs adaptées et accessibles
- Ajuster la taille de la figure pour une meilleure lisibilité :
figsize=(largeur, hauteur) - Utiliser
plt.tight_layout()pour éviter les chevauchements - Sauvegarder en haute résolution pour les publications :
dpi=300
Voici un exemple complet qui combine plusieurs concepts :
import matplotlib.pyplot as plt
import numpy as np
# Génération de données
np.random.seed(42)
mois = ['Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Jun',
'Jul', 'Aoû', 'Sep', 'Oct', 'Nov', 'Déc']
ventes = np.random.randint(50, 150, 12)
objectifs = np.full(12, 100)
# Création de la figure avec subplots
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
fig.suptitle('Tableau de bord des ventes annuelles', fontsize=16, fontweight='bold')
# 1. Graphique en ligne : Évolution des ventes
axes[0, 0].plot(mois, ventes, marker='o', linewidth=2, color='steelblue', label='Ventes réelles')
axes[0, 0].plot(mois, objectifs, linestyle='--', color='red', label='Objectif')
axes[0, 0].set_title('Évolution mensuelle des ventes')
axes[0, 0].set_xlabel('Mois')
axes[0, 0].set_ylabel('Ventes')
axes[0, 0].legend()
axes[0, 0].grid(True, alpha=0.3)
# 2. Diagramme à barres : Ventes par mois
couleurs_barres = ['green' if v >= 100 else 'orange' for v in ventes]
axes[0, 1].bar(mois, ventes, color=couleurs_barres, alpha=0.7)
axes[0, 1].axhline(y=100, color='red', linestyle='--', label='Objectif')
axes[0, 1].set_title('Ventes mensuelles')
axes[0, 1].set_xlabel('Mois')
axes[0, 1].set_ylabel('Ventes')
axes[0, 1].legend()
# 3. Histogramme : Distribution des ventes
axes[1, 0].hist(ventes, bins=8, color='purple', alpha=0.7, edgecolor='black')
axes[1, 0].axvline(x=np.mean(ventes), color='red', linestyle='--',
linewidth=2, label=f'Moyenne: {np.mean(ventes):.1f}')
axes[1, 0].set_title('Distribution des ventes')
axes[1, 0].set_xlabel('Ventes')
axes[1, 0].set_ylabel('Fréquence')
axes[1, 0].legend()
# 4. Diagramme circulaire : Répartition par trimestre
q1 = sum(ventes[0:3])
q2 = sum(ventes[3:6])
q3 = sum(ventes[6:9])
q4 = sum(ventes[9:12])
trimestres = ['Q1', 'Q2', 'Q3', 'Q4']
ventes_trimestres = [q1, q2, q3, q4]
axes[1, 1].pie(ventes_trimestres, labels=trimestres, autopct='%1.1f%%',
startangle=90, colors=['#ff9999', '#66b3ff', '#99ff99', '#ffcc99'])
axes[1, 1].set_title('Répartition par trimestre')
# Ajustement et affichage
plt.tight_layout()
plt.show() Matplotlib est un outil puissant et flexible pour créer des visualisations en Python. Les types de graphiques que nous avons vus dans ce chapitre couvrent la majorité des besoins courants :
- Graphiques en ligne : pour les tendances et évolutions
- Diagrammes à barres : pour comparer des catégories
- Nuages de points : pour visualiser des relations
- Histogrammes : pour les distributions
- Diagrammes circulaires : pour les proportions
Dans le prochain chapitre, nous découvrirons Plotly, qui permet de créer des visualisations interactives.