Section 11.2.10 : Visualisation — Matplotlib et premiers graphiques
🎯 Objectif pédagogique
Créer des graphiques avec Matplotlib pour visualiser vos données. Vous serez capable de produire des barres, lignes, camemberts et histogrammes — la base de toute analyse visuelle de données.
Pourquoi visualiser les données ?
Marc avait un tableau de 200 candidatures. En le regardant, impossible de voir les tendances. Un seul histogramme lui a montré que 70% de ses candidatures étaient concentrées sur 2 semaines. Les graphiques transforment les chiffres en histoires.
"En finance, on dit : 'un graphique vaut mille tableaux croisés dynamiques'. En data, c'est la même chose."
Matplotlib — La base de la visualisation Python
import matplotlib.pyplot as plt
import numpy as np
# Graphique basique
x = [1, 2, 3, 4, 5]
y = [10, 25, 15, 30, 20]
plt.plot(x, y)
plt.title("Mon premier graphique")
plt.xlabel("Jours")
plt.ylabel("Candidatures")
plt.show()
Les 4 graphiques essentiels
1. Graphique en barres (comparaison)
import pandas as pd
df = pd.DataFrame(\{
'status': ['Applied', 'Interview', 'Offer', 'Rejected'],
'count': [15, 5, 2, 8]
\})
plt.figure(figsize=(8, 5))
plt.bar(df['status'], df['count'], color=['#3b82f6', '#f59e0b', '#22c55e', '#ef4444'])
plt.title("Candidatures par statut")
plt.ylabel("Nombre")
plt.xlabel("Statut")
# Ajouter les valeurs sur les barres
for i, v in enumerate(df['count']):
plt.text(i, v + 0.3, str(v), ha='center', fontweight='bold')
plt.tight_layout()
plt.savefig('status_chart.png', dpi=150)
plt.show()
2. Graphique en ligne (évolution)
days = pd.date_range('2026-03-01', periods=30)
candidatures = np.random.poisson(3, 30) # Moyenne 3/jour
cumul = candidatures.cumsum()
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))
ax1.plot(days, candidatures, marker='o', markersize=3, color='#3b82f6')
ax1.set_title("Candidatures par jour")
ax1.set_xlabel("Date")
ax1.set_ylabel("Nombre")
ax1.tick_params(axis='x', rotation=45)
ax2.plot(days, cumul, color='#22c55e', linewidth=2)
ax2.fill_between(days, cumul, alpha=0.3, color='#22c55e')
ax2.set_title("Candidatures cumulées")
ax2.set_xlabel("Date")
ax2.set_ylabel("Total")
ax2.tick_params(axis='x', rotation=45)
plt.tight_layout()
plt.show()
3. Histogramme (distribution)
salaries = np.random.normal(65000, 15000, 100).astype(int)
plt.figure(figsize=(8, 5))
plt.hist(salaries, bins=15, color='#8b5cf6', edgecolor='white', alpha=0.8)
plt.axvline(np.mean(salaries), color='red', linestyle='--', label=f'Moyenne: \{np.mean(salaries):,.0f\}€')
plt.axvline(np.median(salaries), color='orange', linestyle='--', label=f'Médiane: \{np.median(salaries):,.0f\}€')
plt.legend()
plt.title("Distribution des salaires (offres d'emploi)")
plt.xlabel("Salaire annuel (€)")
plt.ylabel("Fréquence")
plt.tight_layout()
plt.show()
4. Camembert (proportions)
labels = ['Applied', 'Interview', 'Offer', 'Rejected']
sizes = [15, 5, 2, 8]
colors = ['#3b82f6', '#f59e0b', '#22c55e', '#ef4444']
explode = (0, 0, 0.1, 0) # Détacher "Offer"
plt.figure(figsize=(7, 7))
plt.pie(sizes, labels=labels, colors=colors, explode=explode,
autopct='%1.1f%%', startangle=90, shadow=True)
plt.title("Répartition des candidatures")
plt.show()
Personnalisation
# Style global
plt.style.use('seaborn-v0_8-whitegrid') # Style propre
# Figure et axes
fig, ax = plt.subplots(figsize=(10, 6))
# Graphique
ax.bar(['Q1', 'Q2', 'Q3', 'Q4'], [12, 18, 25, 8], color='#0891b2')
# Personnaliser
ax.set_title("Candidatures par trimestre", fontsize=16, fontweight='bold')
ax.set_xlabel("Trimestre 2026", fontsize=12)
ax.set_ylabel("Nombre de candidatures", fontsize=12)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tight_layout()
plt.savefig('quarterly_report.png', dpi=200, bbox_inches='tight')
plt.show()
plt vs ax — Deux interfaces
Matplotlib a deux modes : plt.plot() (rapide, scripts) et fig, ax = plt.subplots() (contrôle total). Pour des graphiques simples, plt suffit. Pour des subplots ou un contrôle fin, utilisez ax. La convention pro est d'utiliser fig, ax.
🏋️ Exercice pratique (20 minutes)
Créez 4 graphiques pour votre recherche d'emploi :
- →Barre : nombre de candidatures par entreprise
- →Ligne : évolution des candidatures sur 30 jours
- →Histogramme : distribution des salaires proposés
- →Camembert : répartition par statut
# Données
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.DataFrame(\{
'company': ['Google','Meta','Stripe','Datadog','Mistral AI','OVH','Vercel','BNP','Doctolib','Alan'],
'status': ['interview','applied','offer','rejected','applied','applied','interview','interview','applied','offer'],
'salary': [75000,80000,70000,65000,90000,45000,85000,55000,60000,72000],
\})
# Votre code ici...
Quel type de graphique est le plus adapté pour montrer l'évolution d'une valeur dans le temps ?
Que fait plt.savefig('graph.png', dpi=200) ?
Apprendre l’IA, du premier prompt aux agents