All guides
IntermediateSelf-pacedFree GuideSection 30/95

Visualisation — Matplotlib et premiers graphiques

Practise development foundations: programming, web, APIs, data and AI tools. Work through sections and exercises to build your first projects.

The full lessons for this course are currently available in French. Use the section menu to navigate the French course.

💡

Free content, available without an account. Tools and models change: use the current model guide to check their versions. Models and 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...
Quick Check

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

Quick Check

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

Learn AI, from prompts to agents

15 free guidesQuizzes, diagrams and workshopsNo account needed

Your progress

Progress is self-reported and stored in your browser. The final completion record is not a qualification or an independent assessment.

View progress and completion record

Learn AI, from prompts to agents

15 free guidesQuizzes, diagrams and workshopsNo account needed

One practical AI workflow in your inbox

Methods, resources and new exercises. Free, unsubscribe at any time.