Semaine 2 - Jour 5 - 420-SN1

LES GRAPHIQUES

Donner a voir les donnees - un dessin vaut mille nombres

Les nombres seuls ne parlent pas

Une liste brute de 50 hauteurs d'arbres : 12, 18, 9, 22, 15, 11, 7, 25... Impossible de voir la tendance d'un coup d'oeil.

Un graphique transforme ces chiffres en image : on voit immediatement le maximum, le minimum, les anomalies et la tendance generale.

En sciences, visualiser = comprendre. La fourmi compte ; l'aigle survole.

hauteurs (m)

La bibliotheque des graphiques

# convention universelle import matplotlib.pyplot as plt

Par convention, on importe matplotlib.pyplot sous le nom court plt. Tout le monde sur Terre utilise ce raccourci - autant le garder !

matplotlib est la bibliotheque standard pour tracer des graphiques en Python.

Elle est installee dans tous les environnements scientifiques (Colab, Anaconda, Jupyter).

Le sous-module pyplot offre une interface simple, inspiree de MATLAB, pour creer des figures en quelques lignes.

Section 1

HABILLER UN GRAPHIQUE

Preparer les donnees, afficher, etiqueter, titrer, legender, colorer - une etape a la fois

Preparer les donnees : x et y

# l'axe horizontal : les jours jours = [1, 2, 3, 4, 5] # l'axe vertical : ce qu'on mesure hauteurs = [12, 18, 9, 22, 15]

Un graphique a besoin de deux listes : les valeurs de l'axe x (horizontal) et celles de l'axe y (vertical).

  • x = la variable qu'on fait varier (le temps, l'espece...)
  • y = la grandeur qu'on mesure (la hauteur...)
  • les deux listes ont exactement la meme longueur

L'afficher : plot puis show

plt.plot(jours, hauteurs) plt.show()

plot(x, y) relie les points dans l'ordre. show() affiche la figure. Sans show(), rien n'apparait. Le graphique est la... mais tout nu : on ne sait pas ce qu'on regarde.

Etiqueter les axes

plt.plot(jours, hauteurs) plt.xlabel("Jour") plt.ylabel("Hauteur (m)") plt.show()
Jour Hauteur (m)

xlabel et ylabel nomment les axes. Le lecteur sait enfin ce qui est mesure et dans quelle unite (toujours mettre l'unite entre parentheses).

Donner un titre

plt.plot(jours, hauteurs) plt.xlabel("Jour") plt.ylabel("Hauteur (m)") plt.title("Croissance d'un sapin") plt.show()
Croissance d'un sapin Jour Hauteur (m)

title coiffe la figure d'une phrase qui dit ce qu'elle montre. Titre + deux axes nommes = le trio obligatoire de tout graphique scientifique.

La legende : plusieurs courbes

plt.plot(jours, sapin, label="Sapin") plt.plot(jours, erable, label="Erable") plt.legend() plt.show()
Sapin Erable

Quand on trace plusieurs courbes, on donne a chacune un label. Puis legend() affiche la petite boite qui dit quelle couleur correspond a quoi.

Choisir les couleurs

plt.plot(jours, hauteurs, color="teal", marker="o", linewidth=3) plt.show()

Noms : "red", "teal", "orange"... ou un code "#0E7490".

color change la couleur du trace, marker="o" dessine un point a chaque donnee, linewidth regle l'epaisseur. La couleur n'est pas que jolie : elle distingue et met en valeur.

Ajouter une grille de reperes

plt.plot(jours, hauteurs) plt.grid(True) plt.show()
plt.grid( True, color="gray", linestyle="--", # tirets (--), pointille (:), plein (-) linewidth=0.5, # epaisseur des traits alpha=0.7 # transparence entre 0 et 1 )

grid(True) affiche un quadrillage qui aide a lire la valeur en face de chaque point. On le decore avec la couleur, le style de trait ("--" tirets, ":" pointille, "-" plein), l'epaisseur et la transparence alpha - discret, pour ne pas voler la vedette aux donnees.

Le bon dosage de la grille

❌ alpha=0.9
elle ecrase la courbe
✅ alpha=0.3
elle guide l'oeil, discrete
❌ alpha=0.05
elle ne sert a rien

Une grille legere (alpha=0.3) aide l'oeil a lire les valeurs sans voler la vedette aux donnees. Trop foncee, elle ecrase la courbe ; trop pale, elle ne sert a rien. C'est exactement la nuance du verbe habiller : on decore pour clarifier, pas pour surcharger.

Afficher... ou enregistrer

Voir a l'ecran
plt.plot(jours, hauteurs) plt.show()
Garder dans un fichier
plt.plot(jours, hauteurs) plt.savefig("foret.png")

show() ouvre la figure a l'ecran ; savefig("foret.png") l'enregistre dans un fichier image - pratique quand on veut garder un graphique pour le glisser dans un rapport, par exemple pour presenter les graphiques du Projet 3. Attention : appelle savefig avant show(), sinon le fichier ressort vide.

Choisir le format

Plusieurs possibilites, juste avant le .show()
plt.savefig("mon-graphique.png", dpi=300, bbox_inches="tight") # haute resolution plt.savefig("mon-graphique.png") # image classique plt.savefig("mon-graphique.jpg") # photo plt.savefig("mon-graphique.pdf") # vectoriel, parfait pour imprimer

L'extension du nom de fichier choisit le format : .png, .jpg, .pdf... Pour un rapport propre, dpi=300 donne une image bien nette et bbox_inches="tight" coupe les marges blanches inutiles.

L'ordre : dessiner, habiller, montrer

1
DESSINER
plt.plot(x, y)
On pose la courbe sur la feuille. Sans ce geste, le cadre reste vide.
2
HABILLER
plt.title("...") plt.xlabel("...") plt.ylabel("...") plt.grid(True)
Titre, axes, grille : on decore pour clarifier.
3
MONTRER
plt.show()
Tout a la fin, on affiche. Garde les parentheses : show sans () n'affiche rien.

Toujours le meme refrain : dessinerhabillermontrer. Le piege le plus frequent : tout habiller mais oublier plt.plot → le graphique s'affiche... mais tout nu, avec des axes de 0 a 1 et aucune courbe.

Section 2

LES TYPES DE GRAPHIQUES

Lignes, points, histogramme, tarte - chaque forme de donnees a son graphique

Les lignes - plt.plot

Temperature au fil des jours 010203040 Temperature (°C) J1J2J3J4J5J6J7 Jour
plt.plot(jours, temperatures)
Bonnes donnees Une grandeur qui evolue le long d'un axe continu (le temps, une distance). On relie les points pour montrer la tendance.

Les barres - plt.bar

Nombre d'arbres par espece 020406080 Nombre d'arbres 713918 EpinettesBouleauxSapins
plt.bar(especes, nombres)
Bonnes donnees Des categories distinctes (especes, mois...) qu'on veut comparer. Une barre par categorie ; sa hauteur = sa valeur.

Les points - plt.scatter

Masse selon la taille Masse (kg) Taille (cm)
plt.scatter(tailles, masses)
Bonnes donnees Deux mesures independantes prises sur les memes individus. On cherche un lien (correlation) : ici, plus c'est grand, plus c'est lourd.

L'histogramme - plt.hist

Combien d'arbres par tranche de hauteur 01020304050 Nombre d'arbres 6224134187 0-55-1010-1515-2020-2525-30 Hauteur (m)
plt.hist(hauteurs, bins=6)
Bonnes donnees Une seule longue liste de mesures. Python la range en tranches et compte combien tombent dans chacune : c'est la distribution.

La tarte - plt.pie

Repartition de la foret 70 % 30 % Coniferesepinettes + sapins - 89Feuillusbouleaux - 39
plt.pie(parts, labels=noms)
Bonnes donnees Des parts d'un tout (des pourcentages qui font 100 %). A reserver a peu de categories : au-dela de 5 ou 6 pointes, ca devient illisible.

Quel graphe pour quelle question ?

GraphiquePour faire voir...La question posee
plt.plotune evolution continue"comment ca change dans le temps ?"
plt.barcomparer des categories"laquelle est la plus grande ?"
plt.histune distribution"comment ca se repartit ?"
plt.scatterun lien entre deux mesures"x et y vont-ils ensemble ?"
plt.piedes parts d'un tout"quelle proportion du total ?"

Le bon graphique depend de la question, pas seulement des donnees. Demande-toi d'abord ce que tu veux faire voir - le type de graphe en decoule.

Section 2 - le pont

DU DICTIONNAIRE
AUX BARRES

Tes donnees sont rangees dans un dictionnaire ? plt.bar reclame deux listes - voici le pont entre les deux

Mes donnees sont dans un dictionnaire

# un comptage range par espece graphiqueArbreParEspece = {} graphiqueArbreParEspece["epinettes"] = 71 graphiqueArbreParEspece["bouleaux"] = 39 graphiqueArbreParEspece["sapins"] = 18

Un dictionnaire colle ensemble une cle et sa valeur : "epinettes" va avec 71.

Mais plt.bar(x, y) reclame deux listes separees : les etiquettes d'un cote, les hauteurs de l'autre.

Il faut donc defaire le dictionnaire en deux listes bien alignees.

Separer les cles et les valeurs

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

Raccourci tout fait : list(dictionnaire.keys()) et list(dictionnaire.values()) donnent exactement la meme chose.

dictionnaire.items() sort les paires (cle, valeur) une par une ; on ne garde que la moitie qui nous interesse.

cles = ['epinettes', 'bouleaux', 'sapins'] valeurs = [71, 39, 18]

Tracer : plt.bar(cles, valeurs)

cles = listerCles(graphiqueArbreParEspece) print(cles) # ['epinettes', 'bouleaux', 'sapins'] valeurs = listerValeurs(graphiqueArbreParEspece) print(valeurs) # [71, 39, 18] import matplotlib.pyplot as plt plt.bar(cles, valeurs) plt.show()
Nombre d'arbres par espece 020406080 Nombre d'arbres 713918 epinettesbouleauxsapins

Les cles deviennent les etiquettes sous chaque barre, les valeurs deviennent les hauteurs. La 1re liste donne l'axe x, la 2e l'axe y - et sans plt.show(), rien ne s'affiche !

Section 2 - bonus

LES DIAGRAMMES AVANCES

Faire parler la couleur : une 3e information, bandes et barres empilees, finitions d'histogramme, et le nuancier des couleurs par leur nom

Des points colores - une 3e donnee

Arbres : taille, masse et age (couleur) Masse (kg) Taille (cm) Age vieux jeune
plt.scatter(tailles, masses, c=ages) plt.colorbar()
L'idee Avec c=, la couleur de chaque point porte une 3e mesure. colorbar() ajoute l'echelle de couleurs a droite. Trois informations sur un seul graphique !

Colorer les bandes une a une

Nombre d'arbres par espece 020406080 Nombre d'arbres 6448553020 ErablePinCheneSapinBouleau
couleurs = ["teal","cyan","gold","orange","green"] plt.bar(especes, nombres, color=couleurs)
L'idee On passe une liste de couleurs a color= : une teinte par bande. Utile pour identifier les categories d'un coup d'oeil.

Ecrire l'effectif au-dessus de chaque barre

Nombre d'arbres par espece 0246 Nombre d'arbres 655 epinettebouleausapin
barres = plt.bar(especes, nombres, color=couleurs) plt.bar_label(barres, padding=3)
L'idee On range d'abord les barres dans une variable : barres = plt.bar(...). Puis bar_label(barres) ecrit la hauteur de chaque barre juste au-dessus, d'un coup et sans boucle. padding=3 decolle un peu le nombre du sommet.

Les barres empilees (comme le projet)

Composition de la foret selon l'age 0204060 Nombre d'arbres Jeunes0-30 ansMatures30-70 ansVieux70-120 ans EpinettesBouleauxSapins
plt.bar(ages, epinettes) plt.bar(ages, bouleaux, bottom=epinettes) plt.bar(ages, sapins, bottom=...)
L'idee Avec bottom=, chaque barre se pose sur la precedente. Une barre = un total ; les couleurs empilees montrent sa composition. C'est le graphique bonus du Projet 2.

Detacher les barres de l'histogramme

❌ sans rien
les 4 barres egales fusionnent
✅ edgecolor="black"
chaque tranche a son contour
✅ rwidth=0.8
un espace separe les barres
plt.hist(hauteurs, bins=5, edgecolor="black") plt.hist(hauteurs, bins=5, rwidth=0.8)
L'idee Par defaut, les barres d'un histogramme se touchent : si plusieurs ont la meme hauteur, elles forment un seul bloc et on ne les compte plus. edgecolor="black" trace le contour de chaque tranche ; rwidth=0.8 retrecit les barres a 80 % et laisse un espace.

Les effectifs au-dessus d'un histogramme

plt.hist ne te rend pas les barres directement : il rend un trio. Et bar_label veut la 3e case de ce trio.

histogramme[0]
les effectifs
[2, 3, 2, 2, 3]
histogramme[1]
les bornes
ou coupent les classes
histogramme[2]
les barres
✅ ce que bar_label veut
1. Par l'indice
histogramme = plt.hist(hauteurs, bins=5) barres = histogramme[2] plt.bar_label(barres)
2. Par desemballage
effectifs, bornes, barres = plt.hist(hauteurs, bins=5) plt.bar_label(barres)

Memes resultats. Dans les deux cas, bar_label prend les barres, jamais les chiffres : chaque barre connait deja sa hauteur et y lit l'effectif.

Les verts de la foret

Tu veux...CouleurLe nom a ecrire
Vert fonce'darkgreen'
Vert moyen'green'
Vert foret (tres joli pour des arbres 🌲)'forestgreen'
Vert olive'olive'
Vert mer'seagreen'

Le nom s'ecrit entre guillemets, comme tout texte : plt.bar(especes, nombres, color="forestgreen"). matplotlib comprend environ 140 noms de couleurs en anglais.

Les bruns : troncs et sol

Tu veux...CouleurLe nom a ecrire
Brun ecorce'saddlebrown'
Brun terre'sienna'
Brun chaud'chocolate'
Sable du sentier'peru'
Beige clair'tan'

Parfaits pour un tronc, un sol ou un sentier - ou pour distinguer une serie "bois" d'une serie "feuillage" dans le meme graphique.

Les bleus : ciel et riviere

Tu veux...CouleurLe nom a ecrire
Ciel clair'skyblue'
Bleu acier'steelblue'
Bleu riviere'royalblue'
Bleu profond'navy'
Bleu-vert du lac'teal'

Pour l'eau, le ciel, ou une grandeur "fraiche" (temperature, humidite). Astuce : choisis des couleurs contrastees entre series pour qu'on les distingue d'un coup d'oeil.

Feuille synthese : la palette

Verts - feuillage
'darkgreen'
'green'
'forestgreen'
'olive'
'seagreen'
Bruns - troncs et sol
'saddlebrown'
'sienna'
'chocolate'
'peru'
'tan'
Bleus - ciel et eau
'skyblue'
'steelblue'
'royalblue'
'navy'
'teal'

Une couleur = un nom entre guillemets, ou un code hexadecimal : color="#228B22". Garde cette feuille a portee de main pour habiller tes graphiques de foret !

Section 3

DU CSV AU GRAPHIQUE

Chaque type de graphique veut ses donnees dans une forme precise - voici les recettes pour les preparer a partir d'un fichier

Point de depart : lire les colonnes

# foret.csv : une espece et une hauteur par ligne especes = [] hauteurs = [] with open("foret.csv") as fichier: for ligne in fichier: champs = ligne.strip().split(",") especes.append(champs[0]) hauteurs.append(float(champs[1]))

Lire un CSV (souviens-toi du jour 4), c'est remplir une liste par colonne : ici especes et hauteurs.

A partir de ces listes, chaque graphique a sa petite recette de preparation. En voici trois, de la plus simple a la plus rusee.

Recette 1 - courbe ou nuage de points

# deux colonnes deja numeriques jours = [1, 2, 3, 4, 5] hauteurs = [12, 18, 9, 22, 15] plt.plot(jours, hauteurs) plt.scatter(tailles, masses)
La recette Aucune transformation : deux colonnes alignees et numeriques deviennent directement le x et le y. Le seul soin a prendre : float(champs[i]) pour passer du texte du CSV aux nombres.

C'est la recette la plus simple : la forme du CSV correspond deja a ce que plot et scatter attendent.

Recette 2 - barres : compter par categorie

# combien d'arbres de chaque espece ? compteParEspece = {} for espece in especes: if espece in compteParEspece: compteParEspece[espece] = compteParEspece[espece] + 1 else: compteParEspece[espece] = 1 cles = listerCles(compteParEspece) valeurs = listerValeurs(compteParEspece) plt.bar(cles, valeurs)
La recette Un dictionnaire accumulateur : on parcourt la colonne et on ajoute 1 a la bonne case (ou on la cree a 1 la premiere fois). Puis on reprend le pont cles / valeurs pour nourrir plt.bar.

Recette 3 - l'histogramme a la main

# ranger les hauteurs en 3 tranches petits = 0 # moins de 10 m moyens = 0 # de 10 a 20 m grands = 0 # 20 m et plus for hauteur in hauteurs: if hauteur < 10: petits = petits + 1 elif hauteur < 20: moyens = moyens + 1 else: grands = grands + 1 plt.bar(["petits", "moyens", "grands"], [petits, moyens, grands])
La recette Une boucle sur toutes les donnees, un accumulateur par tranche et des if pour choisir ou compter. C'est exactement ce que plt.hist(hauteurs, bins=3) fait tout seul - le faire a la main, c'est comprendre ce qui se passe dessous.

Une recette par graphique

Tu veux faire voir...La preparation des donneesLe trace
une evolution, un liendeux colonnes numeriques alignees (float)plot / scatter
comparer des categoriescompter par categorie - dico accumulateurbar
une distributionla liste brute... ou compter par tranche (if)hist / bar
des parts d'un toutadditionner par categorie, garder les totauxpie

Toujours la meme demarche : 1. lire les colonnes du CSV, 2. les remodeler selon le graphe vise (boucle, accumulateurs, if), 3. appeler la fonction matplotlib. Le plus dur n'est pas de tracer - c'est de preparer !

Section 4

IMAGES ET GRILLES

Afficher une image, puis ranger plusieurs images ou graphiques dans une grille avec subplots

Afficher une image - deux methodes

Methode 1 - matplotlib seul
photo = plt.imread("erable.png") plt.imshow(photo) plt.axis("off") plt.show()
erable.png
Methode 2 - avec PIL (Pillow)
from PIL import Image photo = Image.open("erable.png") plt.imshow(photo) plt.axis("off") plt.show()

plt.imread lit l'image comme un tableau 2D de pixels (souvenez-vous du jour 3). PIL (la bibliotheque Pillow) ouvre plus de formats et permet en plus de redimensionner, recadrer ou pivoter avant l'affichage. plt.axis("off") enleve la regle graduee, inutile pour une photo.

Plusieurs images dans une grille

from PIL import Image fichiers = ["erable.png", "pin.png", "chene.png", "bouleau.png"] figure, cases = plt.subplots(2, 2) for case, fichier in zip(cases.flat, fichiers): case.imshow(Image.open(fichier)) case.axis("off") case.set_title(fichier) plt.show()
erable.png pin.png chene.png bouleau.png

plt.subplots(2, 2) cree une grille de cases dans une seule figure. La boucle remplit chaque case : cases.flat les parcourt une a une, zip apparie chaque case a son fichier, imshow y pose l'image et set_title la nomme. Parfait pour comparer d'un coup d'oeil.

Une grille de graphiques

figure, cases = plt.subplots(2, 2) cases[0][0].plot(jours, temperatures) cases[0][1].bar(especes, nombres) cases[1][0].scatter(tailles, masses) cases[1][1].hist(hauteurs) plt.tight_layout() plt.show()

Avec subplots(2, 2), cases devient un tableau 2D : cases[ligne][colonne]. Chaque case recoit son propre graphique. tight_layout() evite que les titres se chevauchent. Un vrai tableau de bord !

A TOI DE JOUER

Trace le graphique de tes donnees forestieres dans ton calepin Colab. Choisis le bon type, ajoute un titre, des axes, une legende et des couleurs.

colab.research.google.com

AU TRAVAIL !

Seance 2-5 - trace le graphique de ta foret : bon type, titre, axes, legende, couleurs
⤺ Refermer le diaporama