Tous les guides
IntermédiaireÀ votre rythmeGuide gratuitSection 30/95

Visualisation — Matplotlib et premiers graphiques

Pratiquez les fondations du développement : programmation, web, API, données et usages de l’IA. Des sections et exercices pour construire vos premiers projets.

💡

Contenu gratuit, accessible sans compte. Les outils et modèles évoluent : consultez le dossier actuel pour vérifier leurs versions. Modèles et sources

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 :

  1. →Barre : nombre de candidatures par entreprise
  2. →Ligne : évolution des candidatures sur 30 jours
  3. →Histogramme : distribution des salaires proposés
  4. →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...
Vérification rapide

Quel type de graphique est le plus adapté pour montrer l'évolution d'une valeur dans le temps ?

Vérification rapide

Que fait plt.savefig('graph.png', dpi=200) ?

Apprendre l’IA, du premier prompt aux agents

15 guides gratuitsQuiz, schémas et ateliersSans compte

Votre progression

Cette progression est déclarative et conservée dans votre navigateur. L’attestation finale ne constitue pas un diplôme ni une évaluation indépendante.

Voir ma progression et mon attestation

Apprendre l’IA, du premier prompt aux agents

15 guides gratuitsQuiz, schémas et ateliersSans compte

Un cas pratique IA dans votre boîte mail

Méthodes, ressources et nouveaux exercices. Gratuit, avec désinscription à tout moment.