🌲 Séance 2.5 - Visualiser des données avec matplotlib
Cours · Semaine 2 - Programmation modulaire · Mission : Forêt boréale

Compétence 0F01 : Développer des programmes informatiques en vue d'automatiser la résolution de problèmes dans un contexte scientifique.

Objectifs de la séance¶

  • Tracer une courbe avec matplotlib et l'afficher avec plt.show()
  • Habiller un graphique : titre, étiquettes d'axes, grille, légende
  • Choisir le bon type de graphique : courbe, barres, nuage de points, histogramme, secteurs
  • Tracer à partir de données lues dans un fichier

Contenus essentiels¶

  • La bibliothèque matplotlib.pyplot
  • Types de graphiques et quand les utiliser
  • Transformer une série de données en image lisible

Calepin Colab. Exécutez chaque bloc de code avec Maj+Entrée. Chaque graphique s'affiche sous la cellule qui se termine par plt.show(). Modifiez les couleurs, les titres, les données : recommencez et observez.

🧰 Boîte à outils : d'un dictionnaire vers deux listes¶

Vos données arrivent souvent dans un dictionnaire ({clé: valeur}), mais les fonctions de matplotlib (plt.bar, plt.plot...) veulent deux listes séparées : les clés d'un côté, les valeurs de l'autre.

Exécutez la cellule suivante une fois au début : elle définit deux petites fonctions, listerCles et listerValeurs, que vous réutiliserez dans certains exercices.

In [ ]:
def listerCles(dictionnaire):
    cles = [cle for cle, valeur in dictionnaire.items()]
    return cles

def listerValeurs(dictionnaire):
    valeurs = [valeur for cle, valeur in dictionnaire.items()]
    return valeurs

# Petit essai : un dictionnaire d'observations.
observations = {'Mésange': 12, 'Pic': 3, 'Geai': 7}
print('Clés    :', listerCles(observations))
print('Valeurs :', listerValeurs(observations))

📈 1. Afficher une courbe¶

On importe matplotlib.pyplot (par convention plt). On donne à plt.plot(x, y) deux listes de même longueur, puis plt.show() dessine le graphique. Ici, la hauteur d'une épinette au fil des années.

In [ ]:
import matplotlib.pyplot as plt
annees = [1, 2, 3, 4, 5]
hauteur = [0.4, 0.9, 1.7, 2.6, 3.8]
plt.plot(annees, hauteur)
plt.show()

🎨 2. Habiller le graphique¶

Un graphique sans étiquettes ne veut rien dire. On ajoute un titre (plt.title), des noms d'axes (plt.xlabel, plt.ylabel), une grille (plt.grid), et on choisit la couleur et un marqueur.

In [ ]:
import matplotlib.pyplot as plt
annees = [1, 2, 3, 4, 5]
hauteur = [0.4, 0.9, 1.7, 2.6, 3.8]
plt.plot(annees, hauteur, color='green', marker='o')
plt.title('Croissance d\'une épinette')
plt.xlabel('Années')
plt.ylabel('Hauteur (m)')
plt.grid(True)
plt.show()

🪝 3. Comparer deux séries¶

On peut tracer plusieurs courbes sur le même graphique. On donne un label à chacune, puis plt.legend() affiche la légende qui les distingue.

In [ ]:
import matplotlib.pyplot as plt
annees = [1, 2, 3, 4, 5]
epinette = [0.4, 0.9, 1.7, 2.6, 3.8]
sapin = [0.3, 0.7, 1.2, 2.0, 2.9]
plt.plot(annees, epinette, label='Épinette')
plt.plot(annees, sapin, label='Sapin')
plt.xlabel('Années')
plt.ylabel('Hauteur (m)')
plt.legend()
plt.title('Deux conifères')
plt.show()

📊 4. Le diagramme à barres¶

Quand chaque donnée est une catégorie (et non une mesure continue), on utilise plt.bar(categories, valeurs). Idéal pour comparer des quantités étiquetées.

In [ ]:
import matplotlib.pyplot as plt
especes = ['Mésange', 'Pic', 'Geai', 'Sittelle']
nombre = [12, 3, 7, 5]
plt.bar(especes, nombre, color='teal')
plt.title('Oiseaux observés en forêt')
plt.ylabel('Nombre')
plt.show()

✴️ 5. Le nuage de points¶

Pour voir si deux mesures sont liées, on place un point par observation avec plt.scatter(x, y). Ici, le pH du sol et la croissance annuelle des arbres.

In [ ]:
import matplotlib.pyplot as plt
ph = [4.5, 5.0, 5.5, 6.0, 6.5, 7.0]
croissance = [1.2, 1.8, 2.5, 3.1, 2.9, 2.4]
plt.scatter(ph, croissance, color='purple')
plt.title('pH du sol et croissance')
plt.xlabel('pH')
plt.ylabel('Croissance (m/an)')
plt.show()

📉 6. L'histogramme¶

L'histogramme répartit une série de mesures en tranches (bins) et compte combien tombent dans chacune. plt.hist(donnees, bins=...) montre la distribution, par exemple le diamètre des troncs.

In [ ]:
import matplotlib.pyplot as plt
diametres = [12, 15, 18, 22, 14, 19, 25, 30, 17, 21, 16, 28]
plt.hist(diametres, bins=5, edgecolor='black', color='sienna')
plt.title('Diamètre des troncs')
plt.xlabel('Diamètre (cm)')
plt.ylabel('Effectif')
plt.show()

🥧 7. Le diagramme en secteurs¶

Pour montrer des proportions d'un tout, le diagramme en secteurs (plt.pie) découpe un disque. labels nomme les parts, autopct affiche leur pourcentage.

In [ ]:
import matplotlib.pyplot as plt
essences = ['Épinette', 'Sapin', 'Pin', 'Bouleau']
proportions = [45, 25, 18, 12]
plt.pie(proportions, labels=essences, autopct='%1.0f%%')
plt.title('Composition de la forêt')
plt.show()

📌 Rappel : choisir le bon graphique. Une courbe (plot) montre une évolution dans le temps. Des barres (bar) comparent des catégories. Un nuage de points (scatter) révèle un lien entre deux mesures. Un histogramme (hist) montre la répartition d'une série. Un diagramme en secteurs (pie) montre des proportions d'un tout. Programmer un graphique, c'est d'abord choisir le bon type.

🧪 EXERCICES (obligatoires)
Tracer et **habiller** courbes, barres et histogrammes, et tracer à partir d'un **dictionnaire**. Ces **6 exercices sont à remettre**. Complétez les cellules marquées `# A COMPLETER` et terminez toujours par `plt.show()`.

Obligatoire 1. On a mesuré la population de lièvres sur 6 ans : [18, 22, 31, 47, 39, 28]. Tracez cette population en courbe avec plt.plot, puis affichez le graphique avec plt.show().

In [ ]:
# A COMPLETER (obligatoire 1)
import matplotlib.pyplot as plt
annees = [1, 2, 3, 4, 5, 6]
lievres = [18, 22, 31, 47, 39, 28]

Obligatoire 2. Voici la température moyenne par mois (6 mois). Tracez-la en courbe, puis habillez le graphique : un titre, le nom des axes (Mois et Température (°C)) et une grille.

In [ ]:
# A COMPLETER (obligatoire 2)
import matplotlib.pyplot as plt
mois = [1, 2, 3, 4, 5, 6]
temperature = [-12, -8, 0, 9, 16, 21]

Obligatoire 3. Comparez sur le même graphique la température de jour et de nuit sur une semaine. Donnez un label à chaque courbe et affichez la légende avec plt.legend().

In [ ]:
# A COMPLETER (obligatoire 3)
import matplotlib.pyplot as plt
jours = [1, 2, 3, 4, 5, 6, 7]
jour = [14, 16, 15, 18, 20, 19, 17]
nuit = [4, 5, 3, 6, 8, 7, 5]

Obligatoire 4. On a compté les arbres par essence : Épinette 40, Sapin 25, Pin 15, Bouleau 20. Représentez ces nombres avec un diagramme à barres (plt.bar), avec un titre et le nom de l'axe vertical.

In [ ]:
# A COMPLETER (obligatoire 4)
import matplotlib.pyplot as plt
essences = ['Épinette', 'Sapin', 'Pin', 'Bouleau']
nombre = [40, 25, 15, 20]

Obligatoire 5 (depuis un dictionnaire). Vos comptages d'animaux sont rangés dans un dictionnaire animauxObserves, mais plt.bar veut deux listes. Avec listerCles et listerValeurs (la boîte à outils en haut du calepin), extrayez les noms et les nombres, puis tracez le diagramme à barres. (C'est exactement le geste dont vous aurez besoin au projet.)

In [ ]:
# A COMPLETER (obligatoire 5)
import matplotlib.pyplot as plt
animauxObserves = {}
animauxObserves['Lièvre'] = 24
animauxObserves['Renard'] = 8
animauxObserves['Orignal'] = 5
animauxObserves['Castor'] = 13
# Utilisez listerCles et listerValeurs, puis plt.bar.

Obligatoire 6. Voici la hauteur (cm) de 12 jeunes plants : [22, 35, 41, 28, 50, 33, 47, 19, 38, 44, 31, 26]. Tracez l'histogramme de ces hauteurs avec plt.hist (essayez bins=4), avec un titre et le nom des axes.

In [ ]:
# A COMPLETER (obligatoire 6)
import matplotlib.pyplot as plt
hauteurs = [22, 35, 41, 28, 50, 33, 47, 19, 38, 44, 31, 26]
🚀 EXERCICES (intermédiaires, facultatifs)
Nuage de points, secteurs, **barres empilées**, **sous-graphiques** et graphique tracé à partir d'un **fichier CSV**. À faire une fois les obligatoires terminés.

Intermédiaire 1 (nuage de points). On suspecte un lien entre l'humidité du sol et le nombre de champignons. Tracez un nuage de points (plt.scatter) de champignons en fonction de humidite, avec titre et noms d'axes.

In [ ]:
# A COMPLETER (intermédiaire 1)
import matplotlib.pyplot as plt
humidite = [30, 38, 45, 52, 60, 68, 75]
champignons = [2, 4, 5, 9, 12, 15, 14]

Intermédiaire 2 (secteurs). Le temps d'une journée d'observation se répartit ainsi : Marche 50, Notes 20, Photos 15, Pause 15. Affichez un diagramme en secteurs (plt.pie) avec les labels et le pourcentage (autopct='%1.0f%%').

In [ ]:
# A COMPLETER (intermédiaire 2)
import matplotlib.pyplot as plt
activites = ['Marche', 'Notes', 'Photos', 'Pause']
minutes = [50, 20, 15, 15]

Intermédiaire 3 (barres empilées). Pour chaque saison, on a la quantité de pluie et de neige (mm d'eau). Faites un diagramme à barres où la neige est empilée au-dessus de la pluie : deux appels à plt.bar, le second avec bottom=pluie. Ajoutez la légende.

In [ ]:
# A COMPLETER (intermédiaire 3)
import matplotlib.pyplot as plt
saisons = ['Hiver', 'Printemps', 'Été', 'Automne']
pluie = [20, 60, 90, 70]
neige = [120, 40, 0, 30]

Intermédiaire 4 (deux sous-graphiques). Affichez côte à côte la courbe des températures (à gauche) et le diagramme à barres des essences (à droite). Utilisez plt.subplot(1, 2, 1) puis plt.subplot(1, 2, 2), et un seul plt.show() à la fin.

In [ ]:
# A COMPLETER (intermédiaire 4)
import matplotlib.pyplot as plt
mois = [1, 2, 3, 4, 5, 6]
temperature = [-12, -8, 0, 9, 16, 21]
essences = ['Épinette', 'Sapin', 'Pin', 'Bouleau']
nombre = [40, 25, 15, 20]

Intermédiaire 5 (tracer depuis un CSV). La première cellule prépare le fichier releves-foret.csv (colonnes mois,temperature) : exécutez-la sans la modifier. Dans la cellule suivante, lisez ce fichier avec le module csv, reconstruisez les listes mois et temperature, puis tracez la courbe.

In [ ]:
# CELLULE DE PRÉPARATION - exécutez-la sans la modifier (elle crée le fichier).
contenu = 'mois,temperature\n1,-12\n2,-8\n3,0\n4,9\n5,16\n6,21\n'
with open('releves-foret.csv', 'w', encoding='utf-8') as fichier:
    fichier.write(contenu)
import os
print('Fichier releves-foret.csv créé avec succès.')
print('Chemin exact du fichier :', os.path.abspath('releves-foret.csv'))
print('POUR LE VOIR : cliquez sur le dossier 📁 dans la barre de gauche, ce qui ouvre le panneau Fichiers.')
print('Le fichier se trouve dans le dossier /content (le dossier principal affiché). Bouton Actualiser (flèche ronde) au besoin.')
In [ ]:
# A COMPLETER (intermédiaire 5)
import csv
import matplotlib.pyplot as plt
# Lisez releves-foret.csv, remplissez les listes mois et temperature, puis tracez.

Intermédiaire 6 (dictionnaire vers secteurs). Le dictionnaire arbresParEspece donne le nombre d'arbres par espèce. Avec listerCles et listerValeurs, extrayez espèces et nombres, puis montrez leur proportion avec un diagramme en secteurs (plt.pie, labels=..., autopct='%1.0f%%'). Le même geste d'extraction sert pour tous les types de graphiques.

In [ ]:
# A COMPLETER (intermédiaire 6)
import matplotlib.pyplot as plt
arbresParEspece = {}
arbresParEspece['Épinette'] = 71
arbresParEspece['Bouleau'] = 39
arbresParEspece['Sapin'] = 18
# Utilisez listerCles et listerValeurs, puis plt.pie.
🪜 EXERCICES PLUS DIFFICILES (avancés, facultatifs)
**Sauvegarder** une figure, tracer une **fonction** calculée, afficher une **image** (`imshow`), une **grille** de graphiques, un nuage **coloré**, et tracer des **données distantes**. Le dernier exercice nécessite Internet.

Avancé 1 (sauvegarder une figure). Tracez le diagramme à barres des essences, mais au lieu de l'afficher, sauvegardez-le dans un fichier foret.png avec plt.savefig('foret.png'). Affichez ensuite un message de confirmation. (Le fichier apparaît dans le panneau Fichiers.)

In [ ]:
# A COMPLETER (avancé 1)
import matplotlib.pyplot as plt
essences = ['Épinette', 'Sapin', 'Pin', 'Bouleau']
nombre = [40, 25, 15, 20]

Avancé 2 (tracer une fonction). Avec une boucle for et range, calculez les points de la fonction de chute libre distance = 0.5 * 9.8 * t**2 pour t de 0 à 5 s (pas de 0.5 s), puis tracez la courbe distance en fonction de t. Habillez le graphique.

In [ ]:
# A COMPLETER (avancé 2)
import matplotlib.pyplot as plt
temps = []
distances = []
# Remplissez temps et distances avec une boucle, puis tracez.

Avancé 3 (afficher une image). Une image en niveaux de gris n'est qu'une grille de nombres. Affichez la grille fournie avec plt.imshow(grille, cmap='gray') puis plt.colorbar() pour montrer l'échelle.

In [ ]:
# A COMPLETER (avancé 3)
import matplotlib.pyplot as plt
grille = [[0, 50, 100], [150, 200, 255], [80, 130, 30]]

Avancé 4 (grille de graphiques). Affichez quatre graphiques dans une grille 2 × 2 avec plt.subplot(2, 2, n) : une courbe, des barres, un nuage de points et un histogramme (les données de votre choix). Un seul plt.show() à la fin. plt.tight_layout() aère le tout.

In [ ]:
# A COMPLETER (avancé 4)
import matplotlib.pyplot as plt

Avancé 5 (nuage coloré). Tracez un nuage de points pH/croissance où la couleur de chaque point dépend d'une troisième mesure (l'altitude) : plt.scatter(ph, croissance, c=altitude) suivi de plt.colorbar().

In [ ]:
# A COMPLETER (avancé 5)
import matplotlib.pyplot as plt
ph = [4.5, 5.0, 5.5, 6.0, 6.5, 7.0]
croissance = [1.2, 1.8, 2.5, 3.1, 2.9, 2.4]
altitude = [200, 350, 500, 650, 800, 950]

Avancé 6 (données distantes). Avec pandas.read_csv, chargez le jeu iris depuis son URL, puis tracez un nuage de points de petal_length en fonction de sepal_length. (Nécessite une connexion Internet.)

In [ ]:
# A COMPLETER (avancé 6)
import pandas as pd
import matplotlib.pyplot as plt
url = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv'

Avancé 7 (dictionnaire et courbe). Le dictionnaire temperatureParMois associe un mois à sa température moyenne. Avec listerCles et listerValeurs, extrayez les mois et les températures et tracez la courbe. Ensuite, trouvez et affichez le mois le plus chaud (la clé dont la valeur est la plus grande).

In [ ]:
# A COMPLETER (avancé 7)
import matplotlib.pyplot as plt
temperatureParMois = {}
temperatureParMois['Janvier'] = -12
temperatureParMois['Avril'] = 9
temperatureParMois['Juillet'] = 21
temperatureParMois['Octobre'] = 6
# Tracez la courbe, puis cherchez le mois le plus chaud.

SOLUTIONS (document de la prof)¶

Cette section contient les corrigés. Pour produire la version étudiante, supprimez toutes les cellules à partir d'ici.

🚀 Solutions - intermédiaires¶

🪜 Solutions - avancés¶


Lien avec le projet de la semaine¶

Le Projet 2 se termine par une figure : une fois les données lues et analysées (jour 4), un graphique bien choisi et bien habillé raconte le résultat d'un seul coup d'œil. Courbe, barres empilées ou histogramme : c'est le geste final qui rend votre analyse lisible.

Pour aller plus loin (facultatif)¶

  • Essayez plt.style.use('seaborn-v0_8') au début pour changer l'allure.
  • Avec pandas, un DataFrame se trace directement : tableau.plot().
  • Comparez plt.scatter (couleur/taille variables) et plt.plot (relié).