Python Matplotlib Seaborn expliqué simplement (avec schémas et vrai code)
Python Matplotlib Seaborn : l'essentiel en un article — vrai code, schémas et étapes concrètes, extraits d'un cours de 37 leçons.
Un guide qui va droit au but : Python Matplotlib Seaborn décortiqué avec des schémas, des exemples concrets et des commandes testées. Tout vient d'un cours structuré de 11 chapitres — en voici le meilleur.
- Introduction et Installation
- Bases de Matplotlib
- Graphiques essentiels Matplotlib
- Personnalisation et styles
- Subplots et figures complexes
Exploration et visualisations initiales (EDA)
Pourquoi une EDA avant le dashboard ?
Dans cette leçon, nous allons créer 5 graphiques exploratoires pour comprendre :
Setup commun
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns sns.set_theme( style="whitegrid", context="notebook", palette="viridis", font_scale=1.05, ) df = pd.read_csv("ventes_2024.csv", parse_dates=["date"]) print(df.info()) print(df.describe())
Graphique 1 : Distribution du panier moyen
fig, ax = plt.subplots(figsize=(10, 5)) sns.histplot(data=df, x="vente_eur", kde=True, bins=40, color="#7c3aed", ax=ax) mean_vente = df["vente_eur"].mean() median_vente = df["vente_eur"].median() ax.axvline(mean_vente, color="red", linestyle="--", linewidth=2, label=f"Moyenne : {mean_vente:.0f} EUR") ax.axvline(median_vente, color="orange", linestyle="--", linewidth=2, label=f"Mediane : {median_vente:.0f} EUR") ax.set_title("Distribution du panier moyen", fontweight="bold") ax.set_xlabel("Montant de la commande (EUR)") ax.set_ylabel("Nombre de transactions") ax.legend() sns.despine() plt.tight_layout() plt.show()
Graphique 2 : Évolution mensuelle du CA
monthly = df.groupby("mois").agg( ca=("vente_eur", "sum"), nb_cmd=("vente_eur", "count"), ).reset_index() fig, ax = plt.subplots(figsize=(11, 5)) sns.lineplot(data=monthly, x="mois", y="ca", marker="o", linewidth=2.5, color="#7c3aed", ax=ax) ax.fill_between(monthly["mois"], monthly["ca"], alpha=0.15, color="#7c3aed") best_month = monthly.loc[monthly["ca"].idxmax()] ax.annotate( f"Pic : {best_month['ca']:,.0f} EUR", xy=(best_month["mois"], best_month["ca"]), xytext=(best_month["mois"], best_month["ca"] + 1500), ha="center", fontsize=11, fontweight="bold", color="red", arrowprops=dict(arrowstyle="->", color="red") ) ax.set_title("Evolution mensuelle du chiffre d'affaires 2024", fontweight="bold") ax.set_xlabel("Mois"); ax.set_ylabel("CA (EUR)") ax.set_xticks(range(1, 13)) sns.despine() plt.tight_layout() plt.show()
Graphique 3 : Performance par catégorie
cat_perf = df.groupby("categorie").agg( ca=("vente_eur", "sum"), marge=("marge_eur", "sum"), ).reset_index().sort_values("ca", ascending=True) fig, ax = plt.subplots(figsize=(10, 5)) y_pos = range(len(cat_perf)) ax.barh(y_pos, cat_perf["ca"], color="#a78bfa", label="CA", alpha=0.8) ax.barh(y_pos, cat_perf["marge"], color="#7c3aed", label="Marge", alpha=0.9) for i, (ca, marge) in enumerate(zip(cat_perf["ca"], cat_perf["marge"])): ax.text(ca + 2000, i, f"{ca:,.0f} EUR", va="center", fontsize=10, fontweight="bold") ax.set_yticks(y_pos) ax.set_yticklabels(cat_perf["categorie"]) ax.set_title("CA et marges par categorie produit", fontweight="bold") ax.set_xlabel("Montant (EUR)") ax.legend(loc="lower right") sns.despine() plt.tight_layout() plt.show()
Graphique 4 : Performance par magasin (boxplot)
fig, ax = plt.subplots(figsize=(11, 5)) order = df.groupby("magasin")["vente_eur"].median().sort_values(ascending=False).index sns.boxplot(data=df, x="magasin", y="vente_eur", order=order, palette="viridis", hue="magasin", legend=False, ax=ax) sns.stripplot(data=df, x="magasin", y="vente_eur", order=order, color="black", alpha=0.15, size=2, ax=ax) ax.set_title("Distribution des paniers par magasin (trie par mediane)", fontweight="bold") ax.set_xlabel("Magasin"); ax.set_ylabel("Panier (EUR)") sns.despine() plt.tight_layout() plt.show()
Graphique 5 : Corrélations numériques (heatmap)
numeric_cols = ["vente_eur", "marge_eur", "nb_articles", "mois", "trimestre"] corr = df[numeric_cols].corr() fig, ax = plt.subplots(figsize=(8, 6)) sns.heatmap(corr, annot=True, fmt=".2f", cmap="vlag", center=0, square=True, linewidths=0.5, cbar_kws={"shrink": 0.7}, ax=ax) ax.set_title("Matrice de correlation des variables numeriques", fontweight="bold") plt.tight_layout() plt.show()
Premier script de visualisation
Objectifs pédagogiques
import numpy as np et import matplotlib.pyplot as plt.Le script complet : 8 lignes pour un premier graphique
Voici le script que nous allons décortiquer ensemble. Copiez-le dans un nouveau notebook Jupyter :
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2 * np.pi, 100) y = np.sin(x) plt.plot(x, y) plt.title("Ma premiere fonction sinus") plt.xlabel("x (radians)") plt.ylabel("sin(x)") plt.grid(True) plt.show()
Exécutez la cellule (touche Shift + Enter). Vous devez voir apparaître une belle courbe sinusoïdale qui ondule entre −1 et +1.
Décortication ligne par ligne
Lignes 1-2 : les imports
import numpy as np import matplotlib.pyplot as plt
Deux conventions universelles :
import matplotlib.pyplot as plt et jamais import matplotlib as plt. Le module pyplot contient toutes les fonctions plot(), title(), etc.Ligne 3 : générer l’axe x
x = np.linspace(0, 2 * np.pi, 100)
np.linspace(début, fin, n) retourne un tableau de n valeurs régulièrement espacées entre début et fin. Ici : 100 points entre 0 et 2π (soit environ 6,28).
Résultat : x = [0.0, 0.063, 0.127, 0.190, ..., 6.283]
Ligne 4 : calculer y = sin(x)
y = np.sin(x)
NumPy applique sin() à chaque élément du tableau x en une seule opération. C’est la magie vectorielle de NumPy : pas de boucle, super rapide.
Résultat : y = [0.0, 0.063, 0.127, ..., -0.0]
Ligne 5 : tracer la courbe
plt.plot(x, y)
plt.plot(x, y) dessine une ligne reliant chaque point (x[i], y[i]). C’est la fonction la plus utilisée de tout Matplotlib.
Lignes 6-8 : titre, labels et grille
plt.title("Ma premiere fonction sinus") plt.xlabel("x (radians)") plt.ylabel("sin(x)") plt.grid(True)
Premier graphique en ligne avec des données réelles
Objectifs pédagogiques
Notre dataset : ventes mensuelles fictives
Pour cet exercice, on crée un petit DataFrame avec 12 mois de ventes pour 3 produits différents :
import pandas as pd import matplotlib.pyplot as plt data = { "Mois": ["Jan", "Fev", "Mar", "Avr", "Mai", "Juin", "Juil", "Aout", "Sep", "Oct", "Nov", "Dec"], "Produit A": [120, 135, 148, 160, 175, 210, 250, 245, 200, 170, 140, 290], "Produit B": [80, 85, 90, 95, 100, 110, 130, 135, 120, 100, 90, 180], "Produit C": [50, 55, 60, 70, 85, 100, 120, 115, 95, 75, 60, 150], } df = pd.DataFrame(data) print(df.head())
Résultat affiché :
Mois Produit A Produit B Produit C 0 Jan 120 80 50 1 Fev 135 85 55 2 Mar 148 90 60 3 Avr 160 95 70 4 Mai 175 100 85
Tracer une seule colonne
fig, ax = plt.subplots(figsize=(10, 5)) ax.plot(df["Mois"], df["Produit A"], color="purple", linewidth=2) ax.set_title("Ventes mensuelles du Produit A", fontsize=14) ax.set_xlabel("Mois") ax.set_ylabel("Unites vendues") ax.grid(True, alpha=0.3) plt.tight_layout() plt.show()
Vous obtenez un graphique propre montrant la saisonnalité des ventes (pic en juillet, explosion en décembre).
Tracer plusieurs séries sur le même graphique
fig, ax = plt.subplots(figsize=(12, 6)) ax.plot(df["Mois"], df["Produit A"], label="Produit A", linewidth=2, marker="o") ax.plot(df["Mois"], df["Produit B"], label="Produit B", linewidth=2, marker="s") ax.plot(df["Mois"], df["Produit C"], label="Produit C", linewidth=2, marker="^") ax.set_title("Ventes mensuelles par produit", fontsize=14, pad=15) ax.set_xlabel("Mois", fontsize=12) ax.set_ylabel("Unites vendues", fontsize=12) ax.legend(loc="upper left", fontsize=11) ax.grid(True, alpha=0.3) plt.tight_layout() plt.show()
Trois nouvelles techniques appliquées :
Marqueurs disponibles
| Code | Marqueur | Code | Marqueur |
|---|---|---|---|
"o" | Cercle | "s" | Carré |
"^" | Triangle haut | "v" | Triangle bas |
"<" | Triangle gauche | ">" | Triangle droite |
"D" | Diamant | "d" | Diamant fin |
"*" | Étoile | "+" | Plus |
"x" | Croix | "." | Point |
"P" | Plus rempli | "X" | Croix remplie |
Charger un vrai fichier CSV
Dans la vraie vie, vos données sont dans un fichier .csv. Voici comment le charger :
# Si le fichier est dans le meme dossier df = pd.read_csv("ventes.csv") # Si le fichier est sur le web url = "https://raw.githubusercontent.com/exemple/data/main/ventes.csv" df = pd.read_csv(url) # Avec un autre separateur (point-virgule) df = pd.read_csv("ventes.csv", sep=";") # Avec parsing automatique des dates df = pd.read_csv("ventes.csv", parse_dates=["date"]) print(df.head()) print(df.dtypes)
df.dtypes après un chargement. Si une colonne attendue en nombre est en object, c’est qu’il y a des virgules décimales françaises ou des cellules vides à nettoyer.Astuce Pandas + Matplotlib : raccourci intégré
Pandas a son propre wrapper Matplotlib. Vous pouvez tracer directement depuis un DataFrame :
df.set_index("Mois").plot(figsize=(10, 5), marker="o") plt.title("Ventes par produit (style Pandas)") plt.ylabel("Unites") plt.grid(True, alpha=0.3) plt.show()
Cet article couvre les extraits les plus utiles — le cours complet Python Matplotlib Seaborn (11 chapitres, 37 leçons, exercices corrigés et projet final) t'emmène jusqu'au bout.
./acceder-au-cours-complet cours gratuit : Maîtriser Claude CodeFAQ
Combien de temps pour apprendre Python Matplotlib Seaborn ?
Faut-il des prérequis ?
Par où commencer concrètement ?
📬 Tu veux recevoir ce type de guide chaque semaine ? Abonne-toi gratuitement — code réel, zéro blabla.