Guide Pratique Matplotlib
Guide Pratique Matplotlib
Édition
2026
Formateur En Applications Informatiques
Patrice REY
4435-199 RIO TINTO
PORTUGAL
© 2026 Patrice REY
email ʇ patricerey33@[Link]
site web ʇ [Link]
Amazon auteur ʇ [Link]/3fXLGqa
Linkedin auteur ʇ [Link]/3fe5YhD
Cours personnalisé ʇ reypatrice@[Link]
(C# - WPF - Python - Java - EXCEL)
Table des matières
Avant toute utilisation, il faut importer les modules nécessaires en utilisant les instructions
suivantes (le module pyplot est importé sous l’alias plt).
Syntaxe générale
La signature simplifiée de la fonction plot() est la suivante : [Link]([x], [y], [fmt], **kwargs). Les
paramètres principaux sont :
• x : séquence de valeurs pour l’axe des abscisses (optionnel).
• y : séquence de valeurs pour l’axe des ordonnées (obligatoire).
• fmt : chaîne de format abrégée combinant couleur, style de ligne et marqueur (optionnel).
• **kwargs : arguments nommés supplémentaires pour un contrôle fin de l’apparence.
Remarque : Si x est omis, Matplotlib utilise automatiquement les indices de y (c’est-à-dire 0,
1, 2, ..., n-1) comme abscisses.
Premier exemple
Ce code trace la fonction y = x2 sur cinq points. L’appel à [Link]() est indispensable dans un
script Python pour a icher la fenêtre graphique. Dans un notebook Jupyter, l’a ichage se fait
automatiquement à la fin de la cellule.
La chaîne de format fmt est un raccourci pratique combinant trois éléments : couleur, style de
ligne et marqueur. Sa syntaxe générale est fmt = ‘[marker][line][color]’.
Principales couleurs
Code Couleur
‘c’ cyan
‘m’ magenta
Code Style
Principaux marqueurs
Code Marqueur
‘.’ point
‘o’ cercle
‘*’ étoile
‘+’ plus
8 La fonction plot()
‘x’ croix
Pour un contrôle plus fin, on utilise des arguments nommés. Ils o rent plus de lisibilité et
permettent d’accéder à l’ensemble des options disponibles. Les plus utilisés :
• color ou c : couleur (nom, code hexadécimal, tuple RGB, etc.).
• linestyle ou ls : style de ligne (‘-’, ‘--’, etc.).
• linewidth ou lw : épaisseur du trait (valeur numérique).
• marker : type de marqueur.
• markersize ou ms : taille des marqueurs.
• markerfacecolor ou mfc : couleur de remplissage des marqueurs.
• markeredgecolor ou mec : couleur du bord des marqueurs.
• label : libellé a iché dans la légende.
• alpha : transparence entre 0 (invisible) et 1 (opaque).
Exemple détaillé
import numpy as np
import [Link] as plt
x = [Link](0, 2 * [Link], 50
y = [Link](x)
[Link](x, y,
color=’purple’,
linestyle=’--’,
linewidth=2,
marker=’o’,
markersize=6,
markerfacecolor=’yellow’,
La fonction plot() 9
markeredgecolor=’black’,
label=’sin(x)’,
alpha=0.8
[Link](‘x’)
[Link](‘sin(x)’)
[Link](‘Fonction sinus’)
[Link]()
[Link](True)
[Link]()
Il existe deux approches pour a icher plusieurs courbes sur le même graphique.
Cette forme est concise mais devient vite illisible. On lui préfère généralement la première
approche.
x = [Link](-5, 5, 200
y = x**2 2*x + 1
[Link](x, y, ‘b-’, linewidth=2
[Link](0, color=’gray’, linestyle=’:’)
[Link](0, color=’gray’, linestyle=’:’)
[Link](‘y = x² 2x + 1’)
[Link](True)
[Link]()
Bonnes pratiques
• Toujours étiqueter les axes avec [Link]() et [Link]() : un graphique sans étiquettes
est di icilement interprétable.
• Utiliser label= et [Link]() dès qu’il y a plusieurs courbes, plutôt que d’expliquer les
couleurs dans le texte.
• Préférer les arguments nommés aux chaînes de format pour les graphiques destinés à
être lus par d’autres : color=’red’, linestyle=’--’ est plus explicite que ‘r--’.
• Utiliser [Link]() pour générer les abscisses de fonctions continues : cela donne un
tracé lisse avec peu d’e ort.
• Appeler [Link]() en début de script pour contrôler la taille : [Link](figsize=(10, 6)).
• Sauvegarder avec [Link](‘[Link]’, dpi=300) avant [Link](), sinon la figure peut
être e acée.
Conclusion
La fonction plot() est l’outil fondamental de Matplotlib pour visualiser des données. Sa force
réside dans sa double accessibilité : on peut l’utiliser en une ligne pour un tracé rapide, ou
exploiter ses nombreux paramètres pour produire des graphiques de qualité publication.
Pour aller plus loin, Matplotlib propose d’autres fonctions spécialisées : scatter() pour les
nuages de points, bar() pour les diagrammes en barres, hist() pour les histogrammes, ou
encore subplot() pour organiser plusieurs graphiques dans une même figure. La maîtrise de
plot() constitue néanmoins un socle solide pour aborder l’ensemble de la bibliothèque.
Les fonctions bar() et barh() F02
Les diagrammes en barres sont parmi les représentations graphiques les plus utilisées pour
visualiser des données catégorielles ou comparer des valeurs discrètes. Matplotlib propose
deux fonctions complémentaires pour les produire : bar() pour des barres verticales et barh()
pour des barres horizontales (le h signifiant horizontal).
Le choix entre les deux orientations n’est pas purement esthétique : les barres horizontales
sont particulièrement adaptées lorsque les étiquettes des catégories sont longues, ou
lorsqu’on compare un grand nombre de catégories (les étiquettes restent lisibles empilées
verticalement). Les barres verticales, plus traditionnelles, conviennent aux séries temporelles
et aux comparaisons avec peu de catégories.
Syntaxe générale
La fonction bar() a comme signature [Link](x, height, width=0.8, bottom=None, **kwargs). Les
paramètres principaux sont :
• x : positions des barres sur l’axe horizontal (catégories ou valeurs numériques).
• height : hauteurs des barres (valeurs à représenter).
• width : largeur des barres (par défaut 0.8).
• bottom : base des barres (utile pour les barres empilées).
La fonction barh() a comme signature [Link](y, width, height=0.8, left=None, **kwargs). Les
paramètres sont analogues mais avec des axes inversés :
• y : positions des barres sur l’axe vertical.
• width : longueurs des barres (valeurs à représenter).
• height : épaisseur des barres (par défaut 0.8).
• left : base gauche des barres (pour les barres empilées).
Attention : la nomenclature peut surprendre. Dans barh(), width désigne la longueur de la
barre (donc la valeur représentée), tandis que height désigne son épaisseur. Ce n’est pas
intuitif mais cohérent avec l’orientation du graphique.
Premiers exemples
Astuce : avec barh(), les catégories sont a ichées du bas vers le haut. Pour obtenir un ordre
décroissant visuellement (la plus grande valeur en haut), on inverse l’axe par [Link]().invert_
yaxis().
Les principaux arguments nommés pour contrôler l’apparence des barres sont :
Argument Description
align Alignement des barres par rapport aux positions (‘center’ ou ‘edge’)
Exemple personnalisé
alpha=0.8,
width=0.6
[Link](‘Diagramme personnalise’)
[Link]()
Barres groupées
Pour comparer plusieurs séries côte à côte, on décale manuellement les positions des
barres. La technique consiste à générer un tableau de positions avec [Link](), puis à tracer
chaque série en appliquant un décalage égal à la largeur des barres.
import numpy as np
import [Link] as plt
categories = [‘Q1’, ‘Q2’, ‘Q3’, ‘Q4’]
produit_a = [20, 35, 30, 35
produit_b = [25, 32, 34, 20
positions = [Link](len(categories))
largeur = 0.35
[Link](positions - largeur/2, produit_a, largeur, label=’Produit A’)
[Link](positions + largeur/2, produit_b, largeur, label=’Produit B’)
[Link](positions, categories)
[Link](‘Trimestre’)
[Link](‘Ventes’)
[Link](‘Comparaison trimestrielle’)
[Link]()
[Link]()
Les fonctions bar() et barh() 17
Principe : chaque série est décalée de largeur/2 par rapport au centre. La fonction [Link]()
permet ensuite de remplacer les positions numériques par les noms des catégories.
Barres empilées
Pour empiler plusieurs séries sur une même barre, on utilise le paramètre bottom qui indique
la base de chaque barre. La deuxième série démarre au sommet de la première.
Pour plus de deux séries, on additionne les séries précédentes avec Numpy.
A icher la valeur au sommet de chaque barre améliore la lisibilité. Matplotlib fournit pour
cela la méthode bar_label().
plt.bar_label(barres, padding=3
[Link](‘Valeurs affichees’)
[Link]()
Valeurs négatives
Les barres supportent naturellement les valeurs négatives. On peut colorer di éremment les
barres positives et négatives.
Histogramme de fréquences
Bien que [Link]() soit dédié aux histogrammes, bar() permet de tracer un diagramme de
fréquences à partir de données déjà comptées.
Bonnes pratiques
• Choisir l’orientation en fonction des étiquettes : utiliser barh() dès que les noms de
catégories sont longs ou nombreux.
• Trier les données pour les classements : un diagramme trié (croissant ou décroissant) est
beaucoup plus lisible qu’un ordre alphabétique arbitraire.
• Éviter les graphiques 3D et les e ets décoratifs : ils déforment la perception des valeurs
sans rien apporter.
• Commencer l’axe des valeurs à zéro : tronquer l’axe rend les di érences visuellement
trompeuses. C’est une règle fondamentale des diagrammes en barres.
• Utiliser bar_label() quand la précision des valeurs compte, surtout si les barres sont
proches.
• Préférer des couleurs sobres : une seule couleur pour une série simple. Réserver les
couleurs multiples à des catégories qualitativement distinctes.
• Pour les barres groupées, limiter à 3 ou 4 séries : au-delà, la lecture devient di icile.
Envisager alors des sous-graphiques séparés.
Conclusion
Les fonctions bar() et barh() sont les outils fondamentaux de Matplotlib pour la représentation
de données catégorielles. Leur API est très proche : le passage de l’une à l’autre se fait
20 Les fonctions bar() et barh()
en échangeant les rôles des axes, ce qui permet d’adapter rapidement l’orientation aux
contraintes de lisibilité.
Combinées aux paramètres bottom (ou left pour barh()) et à des décalages manuels, elles
permettent également de produire des graphiques plus élaborés (barres empilées, barres
groupées) sans recourir à des bibliothèques tierces. Pour des besoins plus spécifiques, on
pourra se tourner vers stackplot() pour les empilements continus, ou vers des bibliothèques
comme Seaborn qui o rent des raccourcis pour les diagrammes en barres statistiques.
La fonction scatter() F03
La fonction scatter() de Matplotlib permet de tracer des nuages de points (scatter plots), c’est-
à-dire une représentation où chaque point du graphique correspond à un couple de valeurs (x,
y). Contrairement à plot() qui relie les points par des segments, scatter() a iche uniquement
les points, ce qui la rend particulièrement adaptée à l’exploration de données.
Son principal intérêt réside dans sa capacité à encoder jusqu’à quatre dimensions
simultanément sur un graphique 2D : deux dimensions pour la position (axes x et y), une
troisième pour la taille des points, et une quatrième pour leur couleur. Cela en fait un outil
privilégié pour visualiser des corrélations, détecter des regroupements (clusters) ou mettre en
évidence des valeurs atypiques.
Syntaxe générale
Premier exemple
L’appel à [Link](42) fixe la graine du générateur aléatoire : cela garantit que le même
code produit toujours le même résultat, ce qui est utile pour reproduire un exemple.
Le paramètre s contrôle la taille des points (unité : points au carré). Sa valeur par défaut est
36.
La fonction scatter() 23
Taille uniforme
Taille variable
Quand s est un tableau de même longueur que x, chaque point reçoit sa propre taille. On
encode ainsi une troisième variable.
[Link](0)
x = [Link](30)
y = [Link](30)
tailles = [Link](20, 400, size=30
[Link](x, y, s=tailles, alpha=0.6
[Link](‘Taille variable’)
[Link]()
Astuce : pour que la taille soit proportionnelle à une variable métier (population, chi re
d’a aires, etc), on multiplie par un facteur d’échelle pour rester dans une plage visuellement
lisible.
Couleur uniforme
[Link](x, y, c=’red’)
[Link](x, y, c=’#2E86AB’)
[Link](x, y, c=’steelblue’)
Couleur catégorielle
24 La fonction scatter()
Pour colorer les points par groupe, on passe une liste de couleurs (une par point).
C’est l’utilisation la plus puissante : quand c est un tableau de nombres, Matplotlib les
convertit en couleurs via une carte de couleurs (colormap) définie par cmap.
[Link](1)
x = [Link](100)
y = [Link](100)
valeurs = [Link](100)
[Link](x, y, c=valeurs, cmap=’viridis’, s=80
[Link](label=’Intensite’)
[Link](‘Nuage colore selon une variable’)
[Link]()
‘jet’, ‘rainbow’
Classiques
à éviter : perception non uniforme
Recommandation : privilégier ‘viridis’ (carte par défaut depuis Matplotlib 2.0) pour les données
continues : elle est lisible en noir et blanc, accessible aux daltoniens, et perçue de façon
uniforme par l’œil humain.
Le paramètre marker permet de choisir la forme des points. Les principales formes disponibles
dans Matplotlib sont :
Code Forme
‘o’ cercle (par défaut)
‘s’ carré
‘^’ triangle vers le haut
‘v’ triangle vers le bas
‘D’ losange
‘*’ étoile
‘+’ plus
‘x’ croix
‘p’ pentagone
‘h’ hexagone
Limitation : contrairement à c et s, marker n’accepte pas une liste de formes dans un seul
appel. Pour a icher plusieurs formes, il faut faire un appel à scatter() par catégorie.
[Link](x, y,
s=150,
c=’skyblue’,
edgecolors=’navy’,
linewidths=1.5
Un contour noir fin rend les points plus nets, surtout quand ils se chevauchent ou sur fond
clair.
C’est l’usage canonique du nuage de points : visualiser la relation entre deux grandeurs
numériques.
[Link](2)
taille = [Link](170, 10, 100
poids = 0.8 * taille - 70 [Link](0, 5, 100
[Link](taille, poids, alpha=0.6, edgecolors=’black’)
[Link](‘Taille (cm)’)
[Link](‘Poids (kg)’)
[Link](‘Correlation taille / poids’)
[Link](True, alpha=0.3
[Link]()
[Link](3)
pib = [Link](5, 50, 20 # axe x
esperance_vie = [Link](60, 85, 20 # axe y
population = [Link](1, 100, 20 # taille
continent = [Link](20) # couleur
[Link](pib, esperance_vie,
s=population * 10,
c=continent,
La fonction scatter() 27
cmap=’tab10’,
alpha=0.7,
edgecolors=’black’)
[Link](‘PIB par habitant (k$)’)
[Link](‘Esperance de vie (annees)’)
[Link](‘Graphique a bulles’)
[Link](label=’Continent’)
[Link]()
Pour a icher plusieurs groupes avec une légende, on fait un appel par catégorie.
[Link](4)
groupe_a_x = [Link](2, 0.5, 30
groupe_a_y = [Link](3, 0.5, 30
groupe_b_x = [Link](4, 0.5, 30
groupe_b_y = [Link](5, 0.5, 30
groupe_c_x = [Link](6, 0.5, 30
groupe_c_y = [Link](2, 0.5, 30
[Link](groupe_a_x, groupe_a_y, c=’red’, marker=’o’, label=’Groupe A’)
[Link](groupe_b_x, groupe_b_y, c=’blue’, marker=’s’, label=’Groupe B’)
[Link](groupe_c_x, groupe_c_y, c=’green’, marker=’^’, label=’Groupe C’)
[Link]()
[Link](‘Classification en 3 groupes’)
[Link]()
On combine scatter() et plot() pour ajouter une régression linéaire aux données.
[Link](5)
x = [Link](0, 10, 50
y = 2 * x + 1 [Link](0, 2, 50
# Regression lineaire
coefficients = [Link](x, y, 1
droite = np.poly1d(coefficients)
[Link](x, y, alpha=0.6, label=’Donnees’)
28 La fonction scatter()
Bonnes pratiques
• Utiliser alpha quand les points se chevauchent : une transparence de 0.5 à 0.7 permet de
visualiser la densité là où les points s’accumulent.
• Ajouter un contour avec edgecolors=’black’ améliore la lisibilité, en particulier pour les
points clairs ou nombreux.
• Toujours accompagner cmap d’une colorbar() : une couleur sans échelle est ininterprétable.
• Privilégier ‘viridis’ ou ‘plasma’ pour les données continues et éviter ‘jet’ et ‘rainbow’ qui
déforment la perception.
• Choisir plot(x, y, ‘o’) plutôt que scatter() quand tous les points ont la même taille et la
même couleur : c’est plus rapide à tracer pour de grands jeux de données.
• Pour des nuages très denses (plusieurs milliers de points), envisager [Link]() ou plt.
hist2d() qui a ichent la densité plutôt que les points individuels.
• Étiqueter les axes avec leur unité : un nuage de points sans contexte est peu informatif.
Conclusion
La fonction scatter() est l’un des outils les plus expressifs de Matplotlib. En exploitant position,
taille, couleur et forme, elle permet de visualiser simultanément plusieurs dimensions d’un
jeu de données sur un seul graphique. C’est la fonction de choix pour explorer des données,
détecter des corrélations, identifier des regroupements ou repérer des valeurs aberrantes.
Au-delà de scatter(), l’écosystème Matplotlib o re des variantes spécialisées : hexbin() et
hist2d() pour les très grands nuages, errorbar() pour ajouter des barres d’erreur, ou encore
des bibliothèques comme Seaborn qui proposent des nuages de points statistiques avec
régression intégrée via regplot() ou pairplot().
La fonction pie() F04
La fonction pie() de Matplotlib permet de tracer des diagrammes circulaires, appelés aussi
camemberts (pie charts). Ce type de graphique représente la décomposition d’un tout en
plusieurs parts, chaque part étant un secteur angulaire dont la surface est proportionnelle
à la valeur qu’il représente. Les diagrammes circulaires sont appropriés pour visualiser des
proportions (pourcentages, répartitions, parts de marché), à condition que :
• Les catégories forment un ensemble exhaustif (leur somme a un sens).
• Le nombre de catégories reste raisonnable (idéalement moins de 7).
• Les di érences de taille entre les parts sont su isamment marquées pour être
perceptibles visuellement.
Il est à noter que la communauté de la visualisation de données est souvent critique envers
les diagrammes circulaires. L’œil humain compare mal les angles, et un diagramme en barres
est fréquemment plus lisible. Il reste néanmoins utile pour les communications grand public.
Syntaxe générale
Premier exemple
Par défaut, Matplotlib peut produire un diagramme légèrement elliptique si les axes n’ont pas
la même échelle. Pour garantir un cercle parfait, on ajoute [Link](‘equal’).
Alternative équivalente : utiliser l’argument autopct sur la figure, Matplotlib respecte
alors automatiquement le rapport d’aspect. En pratique, on prend l’habitude d’ajouter
systématiquement [Link](‘equal’).
Le paramètre autopct permet d’a icher automatiquement la valeur (en pourcentage) sur
La fonction pie() 31
chaque secteur. Il accepte une chaîne de format de type printf() ou une fonction.
Format simple
Format Résultat
Pour a icher à la fois le pourcentage et la valeur absolue, on passe une fonction à autopct.
# fonction
def formater_etiquette(pourcentage, valeurs_totales=quantites):
total = sum(valeurs_totales)
valeur_absolue = int(round(pourcentage * total / 100
return f’{pourcentage:.1f}%\n({valeur_absolue})’
# visualisation
[Link](quantites, labels=categories, autopct=formater_etiquette)
[Link](‘equal’)
[Link]()
Personnalisation
Couleurs
Les couleurs sont passées sous forme de liste : couleurs = [‘#FF6B6B’, ‘#4ECDC4’, ‘#45B7D1’,
‘#FFA07A’].
couleurs = [Link].Pastel1([Link](len(categories)))
[Link](quantites, labels=categories, colors=couleurs, autopct=’%1.1f%%’)
[Link](‘equal’)
[Link]()
Par défaut, le premier secteur commence à l’angle 0 (à droite, équivalent à 3h sur une horloge)
et tourne dans le sens anti-horaire. Pour démarrer en haut (position 12h) et tourner dans le
sens horaire.
[Link](quantites,
labels=categories,
autopct=’%1.1f%%’,
startangle=90, # demarre en haut
counterclock=False) # sens horaire
[Link](‘equal’)
[Link]()
Convention : la disposition la plus lisible place le plus grand secteur en haut à droite et tourne
dans le sens horaire, car c’est le sens naturel de lecture. On trie donc généralement les
données par ordre décroissant.
[Link](quantites,
labels=categories,
autopct=’%1.1f%%’,
wedgeprops={‘edgecolor’: ‘white’, ‘linewidth’ 2
[Link](‘equal’)
[Link]()
[Link](quantites,
labels=categories,
autopct=’%1.1f%%’,
wedgeprops={‘width’ 0.4, ‘edgecolor’: ‘white’})
[Link](‘equal’)
[Link](‘Diagramme en anneau’)
[Link]()
total = sum(quantites)
[Link](quantites, labels=categories, autopct=’%1.1f%%’,
wedgeprops={‘width’ 0.4, ‘edgecolor’: ‘white’})
[Link](0, 0, f’Total\n{total}’, ha=’center’, va=’center’, fontsize=16, fontweight=’bold’)
[Link](‘equal’)
[Link]()
Valeurs de retour
La fonction pie() retourne un tuple qui permet de manipuler finement les éléments graphiques
après la création.
Répartition budgétaire
Bonnes pratiques
Conclusion
Syntaxe générale
Premier exemple
Par défaut, hist() découpe les données en 10 intervalles de largeur uniforme. Les paramètres
loc et scale de [Link]() définissent respectivement la moyenne et l’écart-type de
la loi.
La fonction hist() 41
Le choix du nombre de classes est crucial : trop peu de classes masquent les détails de la
distribution, trop de classes produisent un graphique bruité et irrégulier. C’est souvent le
paramètre sur lequel on ajuste le plus.
Nombre fixe
Bornes personnalisées
On peut passer une liste explicite des bornes d’intervalles. Les classes peuvent alors être de
largeurs di érentes.
Méthodes automatiques
Méthode Description
Par défaut, l’axe vertical représente les e ectifs (nombre de valeurs dans chaque intervalle).
Le paramètre density permet de changer d’échelle.
[Link](donnees, bins=30
[Link](‘Effectif’)
Densité de probabilité
Avec density=True, les barres sont normalisées de sorte que l’aire totale sous l’histogramme
soit égale à 1. Cela permet de comparer l’histogramme à une densité théorique.
Attention : avec density=True, les hauteurs ne sont pas des pourcentages. Ce sont des
densités, dont la valeur dépend de la largeur des classes. Pour obtenir des fréquences en
pourcentage, il faut calculer manuellement ou utiliser weights.
La fonction hist() 43
Fréquences en pourcentage
Histogramme cumulé
Avec cumulative=True, chaque barre a iche le cumul des e ectifs (ou de la densité) depuis le
début. La dernière barre atteint donc le total (ou 1 si density=True).
[Link](donnees, bins=30,
cumulative=True,
density=True,
histtype=’step’,
linewidth=2
[Link](‘Frequence cumulee’)
[Link](‘Fonction de repartition empirique’)
[Link](True, alpha=0.3
[Link]()
Valeur Rendu
[Link](0)
echantillon_a = [Link](100, 15, 1000
echantillon_b = [Link](110, 20, 1000
[Link](echantillon_a, bins=30, alpha=0.5, label=’Groupe A’, color=’blue’)
[Link](echantillon_b, bins=30, alpha=0.5, label=’Groupe B’, color=’red’)
[Link](‘Valeur’)
[Link](‘Effectif’)
[Link]()
[Link](‘Comparaison de deux distributions’)
[Link]()
Contours superposés
Pour une comparaison plus lisible, on utilise histtype=’step’.
[Link]([echantillon_a, echantillon_b],
bins=20,
La fonction hist() 45
label=[‘Groupe A’, ‘Groupe B’],
color=[‘steelblue’, ‘salmon’])
[Link]()
[Link]()
Comme mentionné plus haut, hist() retourne un tuple de trois éléments : e ectifs, bornes,
rectangles = [Link](donnees, bins=20).
• e ectifs : tableau des e ectifs (ou densités) de chaque classe.
• bornes : tableau des bornes d’intervalles (longueur = nombre_de_classes + 1).
• rectangles : liste des objets graphiques (utiles pour les modifier individuellement).
Exemple : colorer en rouge la classe la plus peuplée (le mode).
[Link](7)
tailles = [Link](175, 8, 500
[Link](tailles, bins=’auto’, density=True, edgecolor=’black’, alpha=0.7, color=’skyblue’)
# Moyenne et ecart-type observes
moyenne = [Link]()
ecart_type = [Link]()
abscisses = [Link]([Link](), [Link](), 200
densite =
1 / (ecart_type * [Link](2 * [Link]))) * [Link](-0.5 * ((abscisses - moyenne) / ecart_type) ** 2
[Link](abscisses, densite, ‘r-’, linewidth=2, label=f’N({moyenne:.1f}, {ecart_type:.1f})’)
46 La fonction hist()
[Link](‘Taille (cm)’)
[Link](‘Densite’)
[Link]()
[Link]()
[Link](1)
donnees_normales = [Link](50, 10, 990
valeurs_aberrantes = [Link]([150, 160, 155, 148, 165, 170, 175, 168, 155, 160
donnees_completes = [Link]([donnees_normales, valeurs_aberrantes])
[Link](donnees_completes, bins=50, edgecolor=’black’)
[Link](donnees_completes.mean() + 3 * donnees_completes.std(),
color=’red’, linestyle=’--’, label=’Moyenne + 3 sigma’)
[Link]()
[Link](‘Detection de valeurs aberrantes’)
[Link]()
Distribution bimodale
Un histogramme révèle la présence de plusieurs modes (sommets) dans une distribution,
signe possible de deux sous-populations mélangées.
# données
[Link](2)
sous_population_1 [Link](40, 5, 500
sous_population_2 [Link](70, 8, 500
melange = [Link]([sous_population_1, sous_population_2
[Link](melange, bins=40, edgecolor=’black’, color=’mediumseagreen’)
# personnalisation
[Link](‘Valeur’)
[Link](‘Effectif’)
[Link](‘Distribution bimodale’)
[Link]()
La fonction hist() 47
Bonnes pratiques
• Toujours a icher le contour des barres avec edgecolor=’black’ : sans contour, les barres
adjacentes se confondent visuellement.
• Tester plusieurs valeurs de classes : la forme apparente d’une distribution dépend
fortement du nombre de classes. Commencer par bins=’auto’ puis ajuster.
• Utiliser density=True pour comparer des échantillons de tailles di érentes : sinon, le plus
grand écrase le plus petit.
• Pour superposer plusieurs histogrammes : préférer histtype=’step’ (contours), ou
alpha=0.5 pour la transparence.
• Ne pas confondre histogramme et diagramme en barres : pour des catégories discrètes,
utiliser bar(), pas hist().
• Étiqueter l’axe des ordonnées sans ambiguïté : "E ectif", "Fréquence (%)" ou "Densité"
selon le choix de normalisation.
• Penser à fixer range quand on compare plusieurs histogrammes : sans cela, chacun
utilise ses propres bornes et la comparaison devient trompeuse.
Conclusion
La fonction grid()
La fonction grid() a iche une grille en arrière-plan du graphique. Cette grille aide le lecteur
à évaluer plus précisément les valeurs numériques en prolongeant mentalement les lignes
jusqu’aux axes. Par défaut, elle est désactivée.
Sa syntaxe est [Link](visible=None, which=’major’, axis=’both’, **kwargs). Les paramètres
principaux sont :
• visible : True pour a icher, False pour masquer.
• which : sur quelles graduations (ticks) s’appliquer (‘major’, ‘minor’ ou ‘both’).
• axis : axe concerné (‘x’, ‘y’ ou ‘both’).
• **kwargs : arguments de ligne (color, linestyle, linewidth, alpha).
Utilisation simple
Un simple appel à [Link]() (sans argument) bascule l’état de la grille. On lui préfère plt.
grid(True) pour plus de clarté.
Personnalisation
Une grille trop marquée distrait l’œil. On la veut généralement discrète.
[Link](x, y)
[Link](True,
color=’gray’,
linestyle=’--’,
linewidth=0.5,
alpha=0.7
[Link]()
Grille partielle
On peut n’a icher la grille que sur un axe.
Habiller un graphique 51
[Link](x, y)
[Link](True, axis=’y’) # grille horizontale uniquement
[Link]()
Cette option est particulièrement utile pour les diagrammes en barres verticales : seules les
lignes horizontales sont pertinentes, les verticales n’apportent rien.
Matplotlib distingue les ticks majeurs (les graduations principales, numérotées) et les ticks
mineurs (subdivisions plus fines). On peut avoir une grille di érente pour chacun.
[Link](x, y)
plt.minorticks_on() # active les ticks mineurs
[Link](True, which=’major’, color=’gray’, linestyle=’-’, linewidth=0.8
[Link](True, which=’minor’, color=’lightgray’, linestyle=’:’, linewidth=0.5
[Link]()
La fonction legend()
La fonction legend() a iche un encart explicatif indiquant à quelle série correspond chaque
couleur, style ou marqueur. C’est un élément indispensable dès qu’un graphique contient
plusieurs séries, et le seul moyen conventionnel d’éviter de commenter les couleurs dans le
texte explicatif.
Sa syntaxe est [Link](handles=None, labels=None, loc=’best’, title=None, fontsize=None,
frameon=True, ncol=1, **kwargs).
La façon la plus propre d’utiliser legend() est de passer un argument label à chaque appel de
plot() (ou scatter(), bar(), etc), puis d’appeler legend() sans argument.
Astuce : les séries sans label (ou dont le label commence par un underscore ‘_’) sont
automatiquement ignorées par la légende. C’est pratique pour exclure par exemple une
courbe de référence.
Positionnement
Le paramètre loc contrôle la position de la légende. Les valeurs possibles sont :
Valeur Position
‘best’ placement automatique (par défaut)
‘upper right’ en haut à droite
‘upper left’ en haut à gauche
‘lower right’ en bas à droite
‘lower left’ en bas à gauche
‘center’ au centre
‘center left’ centrée sur le bord gauche
‘center right’ centrée sur le bord droit
‘upper center’ centrée en haut
‘lower center’ centrée en bas
[Link](loc=’upper right’)
[Link](loc=’lower left’)
Personnalisation
Plusieurs paramètres a inent l’apparence :
• title : titre de la légende elle-même.
• fontsize : taille du texte.
• frameon : False pour supprimer l’encadrement.
• ncol : nombre de colonnes (utile quand il y a beaucoup d’entrées).
• shadow : ombre portée.
• framealpha : transparence de l’arrière-plan.
[Link](x, [Link](x))
[Link](x, [Link](x))
[Link]([‘Sinus’, ‘Cosinus’])
[Link]()
Attention - Cette syntaxe est positionnelle : l’ordre des libellés doit correspondre exactement
à l’ordre des tracés. La méthode avec label= reste plus robuste aux modifications ultérieures
du code.
54 Habiller un graphique
La fonction title()
La fonction title() ajoute un titre au-dessus du graphique. Le titre doit résumer en quelques
mots le sujet du graphique, répondant à la question : "qu’est-ce que je regarde ?". Un bon titre
est court, explicite et autonome (compréhensible sans le texte qui l’entoure).
Sa syntaxe est [Link](label, fontdict=None, loc=’center’, pad=None, **kwargs). Les paramètres
principaux sont :
• label : texte du titre.
• loc : alignement horizontal (‘center’, ‘left’, ‘right’).
• pad : espacement entre le titre et le graphique (en points).
• fontsize, fontweight, color, fontstyle : mise en forme du texte.
Utilisation simple
[Link](x, [Link](x))
[Link](‘Courbe du sinus’)
[Link]()
[Link](x, [Link](x))
[Link](‘Courbe du sinus’,
fontsize=16,
fontweight=’bold’,
color=’navy’,
pad=15
[Link]()
Alignement
Remarque : trois appels successifs à title() avec des loc di érents permettent d’a icher
simultanément un titre à gauche, au centre et à droite (par exemple un titre principal au centre
et une date à droite).
Habiller un graphique 55
Titres multi-lignes
Matplotlib supporte une syntaxe de type LaTeX pour a icher des formules mathématiques. Le
texte mathématique est délimité par des $.
[Link](x, [Link](x) ** 2
[Link](r’Courbe de $f(x) = \sin^2(x)$’)
[Link]()
Le préfixe r avant la chaîne la transforme en raw string : les caractères backslash sont
interprétés littéralement, ce qui est indispensable pour les commandes LaTeX comme \sin, \
alpha, \sum, etc.
# sous-graphiques
[Link](1, 2, 1
[Link](x, [Link](x))
[Link](‘Sinus’)
[Link](1, 2, 2
[Link](x, [Link](x))
[Link](‘Cosinus’)
# graphique global
[Link](‘Fonctions trigonometriques’, fontsize=16
plt.tight_layout()
[Link]()
56 Habiller un graphique
Exemple combiné
Les trois fonctions sont systématiquement utilisées ensemble pour produire un graphique
soigné.
import numpy as np
import [Link] as plt
# Donnees fictives : ventes trimestrielles
trimestres = [‘T1’, ‘T2’, ‘T3’, ‘T4’]
produit_a = [120, 145, 160, 180
produit_b = [100, 130, 155, 175
produit_c = [80, 95, 110, 130
[Link](figsize=(10, 6
[Link](trimestres, produit_a, ‘o-’, linewidth=2, label=’Produit A’)
[Link](trimestres, produit_b, ‘s--’, linewidth=2, label=’Produit B’)
[Link](trimestres, produit_c, ‘^:’, linewidth=2, label=’Produit C’)
[Link](‘Evolution des ventes trimestrielles’, fontsize=14, fontweight=’bold’, pad=15
[Link](‘Trimestre’, fontsize=12
[Link](‘Ventes (milliers d\’unites)’, fontsize=12
[Link](True, linestyle=’--’, alpha=0.5, axis=’y’)
[Link](title=’Gamme’, loc=’upper left’, fontsize=10, framealpha=0.9
plt.tight_layout()
[Link]()
Cet exemple combine l’ensemble des bonnes pratiques : titre explicite et mis en valeur,
légende titrée et bien positionnée, grille horizontale discrète facilitant la lecture des valeurs,
et étiquettes d’axes claires avec unités.
Bonnes pratiques
Pour grid() :
• Toujours utiliser une grille discrète : lignes fines, couleur grise, transparence alpha=0.3 à
alpha=0.5. Une grille trop visible distrait de la donnée.
• Grille horizontale uniquement pour les barres verticales : les lignes verticales sont
superflues sur un bar() classique.
• Éviter la grille sur les camemberts et nuages de points denses : elle ajoute du bruit visuel
sans aider la lecture.
Habiller un graphique 57
Pour legend() :
• Toujours utiliser label= dans les appels de tracé plutôt que de passer les libellés à legend()
positionnellement.
• Préférer loc=’best’ dans un premier temps : Matplotlib choisit la zone la moins occupée.
Ajuster manuellement seulement si le résultat n’est pas satisfaisant.
• Placer la légende à l’extérieur (via bbox_to_anchor) quand elle masque des données
importantes ou contient beaucoup d’entrées.
• Utiliser ncol pour les légendes avec plus de 4 ou 5 entrées, afin d’éviter une liste verticale
démesurée.
Pour title() :
• Titre court et explicite : entre 3 et 10 mots idéalement. Il doit pouvoir être compris hors
contexte.
• Éviter les titres redondants avec les axes. "Graphique de x en fonction de y" n’apporte rien
si les axes sont déjà étiquetés.
• Distinguer title() et suptitle() : le premier titre chaque sous-graphique individuellement, le
second coi e l’ensemble de la figure.
• Utiliser fontweight=’bold’ pour hiérarchiser visuellement le titre par rapport aux étiquettes
d’axes.
Conclusion
Les fonctions grid(), legend() et title() constituent le trio indispensable pour habiller un graphique
Matplotlib. Individuellement, chacune joue un rôle précis : la grille facilite la lecture des
valeurs, la légende identifie les séries, et le titre informe sur le sujet du graphique. Ensemble,
elles transforment un simple tracé en une visualisation autonome et compréhensible par un
lecteur extérieur.
Ces fonctions font partie d’une famille plus large d’outils d’habillage :
• [Link]() et [Link]() pour les étiquettes d’axes.
• [Link]() et [Link]() pour les bornes.
• [Link]() et [Link]() pour personnaliser les graduations.
• [Link]() pour ajouter des commentaires ciblés.
Leur utilisation systématique est la marque d’un graphique de qualité publication.
Positionner plusieurs graphiques
avec la fonction subplot() F07
Jusqu’à présent, tous les tracés présentés étaient a ichés dans une seule zone graphique.
La fonction subplot() permet de placer plusieurs graphiques dans une même figure, en les
organisant selon une grille rectangulaire. Cette disposition est particulièrement utile pour :
• Comparer plusieurs jeux de données côte à côte.
• Présenter di érentes vues d’un même phénomène (par exemple une courbe et son
histogramme).
• Construire des tableaux de bord synthétiques.
• Séparer des courbes dont les échelles sont incompatibles.
Avant d’aller plus loin, il faut bien distinguer deux concepts :
• La figure (figure) : le conteneur global, équivalent à une feuille de papier. Il n’y en a
généralement qu’une à la fois.
• Les axes (axes qui est le terme anglais trompeur) : chaque zone de tracé individuelle à
l’intérieur de la figure. Une figure peut contenir plusieurs axes.
La fonction subplot() crée et sélectionne l’un de ces axes dans une grille prédéfinie.
Syntaxe générale
Attention : la forme compacte ne fonctionne que si les trois nombres sont inférieurs à 10. Pour
une grille plus grande (ex. 2x11), il faut obligatoirement utiliser la forme à trois arguments.
Les positions sont numérotées à partir de 1 (et non 0 comme en Python habituellement), ligne
par ligne, de gauche à droite, de haut en bas. C’est le sens de lecture occidental d’un texte.
Pour une grille 2x3 par exemple.
1 2 3
4 5 6
Chaque appel à subplot() définit l’axe actif. Les commandes Matplotlib qui suivent (plot(),
title(), xlabel(), etc) s’appliquent uniquement à cet axe, jusqu’au prochain subplot().
Premier exemple
[Link](3, 1, 1
[Link](x, [Link](x))
[Link](‘Sinus’)
[Link](3, 1, 2
[Link](x, [Link](x))
[Link](‘Cosinus’)
[Link](3, 1, 3
[Link](x, [Link](x))
[Link](‘Tangente’)
[Link](-10, 10
plt.tight_layout()
[Link]()
L’appel à plt.tight_layout() est quasi indispensable dès qu’on utilise plusieurs sous-graphiques
(subplots) : il ajuste automatiquement les espacements pour éviter que les titres et les
étiquettes se chevauchent.
Grille complète
x = [Link](-3, 3, 100
[Link](figsize=(10, 8
[Link](2, 2, 1
[Link](x, x)
[Link](‘Identite’)
62 Positionner plusieurs graphiques avec la fonction subplot()
[Link](2, 2, 2
[Link](x, x ** 2
[Link](‘Carre’)
[Link](2, 2, 3
[Link](x, x ** 3
[Link](‘Cube’)
[Link](2, 2, 4
[Link](x, [Link](x))
[Link](‘Exponentielle’)
plt.tight_layout()
[Link]()
L’appel à [Link](figsize=(10, 8)) fixe la taille globale de la figure en pouces. Sans cela, la
figure par défaut (souvent 6x4) devient vite à l’étroit avec plusieurs subplots.
On peut donner plus de place à un graphique en lui faisant occuper plusieurs cellules. Pour
cela, on choisit une grille fine, et chaque subplot() est appelé avec l’index de la première cellule
qu’il occupe, mais Matplotlib redimensionne automatiquement. Cependant, la fonction
subplot() seule ne permet pas facilement de faire chevaucher plusieurs cellules. Pour cela,
on utilise plt.subplot2grid().
[Link](figsize=(12, 8
# Grille de reference : 3 lignes x 3 colonnes
# Grand graphique occupant 2 lignes et 2 colonnes
axe_principal = plt.subplot2grid((3, 3, 0, 0, rowspan=2, colspan=2
axe_principal.plot([Link](100).cumsum())
axe_principal.set_title(‘Principal’)
# Trois petits graphiques
plt.subplot2grid((3, 3, 0, 2
[Link]([Link](20))
[Link](‘Detail 1’)
plt.subplot2grid((3, 3, 1, 2
[Link]([Link](20))
[Link](‘Detail 2’)
plt.subplot2grid((3, 3, 2, 0, colspan=3
[Link]([Link](50))
Positionner plusieurs graphiques avec la fonction subplot() 63
[Link](‘Bande inferieure’)
plt.tight_layout()
[Link]()
L’alternative [Link]()
Matplotlib propose une fonction pluriel [Link]() (avec un s) qui crée toute la grille d’un
seul appel, plus élégante que plusieurs [Link]() successifs. Elle retourne la figure et un
tableau d’axes.
# graphique
figure, tableau_axes = [Link](2, 3, figsize=(12, 6
# tableau_axes est un tableau numpy 2D
tableau_axes[0, 0].plot(x, [Link](x))
tableau_axes[0, 0].set_title(‘Sinus’)
tableau_axes[0, 1].plot(x, [Link](x))
tableau_axes[0, 1].set_title(‘Cosinus’)
tableau_axes[0, 2].plot(x, [Link](x))
tableau_axes[0, 2].set_title(‘Tangente’)
tableau_axes[1, 0].plot(x, x ** 2
tableau_axes[1, 0].set_title(‘Carre’)
tableau_axes[1, 1].plot(x, x ** 3
tableau_axes[1, 1].set_title(‘Cube’)
tableau_axes[1, 2].plot(x, [Link](x))
tableau_axes[1, 2].set_title(‘Exponentielle’)
plt.tight_layout()
[Link]()
• Cette approche est plus lisible pour les grilles étendues et s’intègre mieux dans un code
Python structuré.
Quand plusieurs graphiques ont la même plage de valeurs sur un axe, on peut les lier : les
bornes deviennent synchronisées, et les étiquettes intermédiaires sont automatiquement
masquées pour gagner de la place. Cette fonctionnalité est disponible via sharex et sharey
dans [Link]().
# graphique
figure, tableau_axes = [Link](2, 1, figsize=(10, 6, sharex=True)
x = [Link](0, 10, 200
tableau_axes[0].plot(x, [Link](x))
tableau_axes[0].set_title(‘Sinus’)
tableau_axes[0].set_ylabel(‘y’)
tableau_axes[1].plot(x, [Link](x))
tableau_axes[1].set_title(‘Cosinus’)
tableau_axes[1].set_xlabel(‘x’)
tableau_axes[1].set_ylabel(‘y’)
# affichage
plt.tight_layout()
[Link]()
Avec sharex=True, les deux graphiques partagent l’axe horizontal : zoomer sur l’un zoome sur
l’autre, et l’axe n’est étiqueté qu’en bas.
Positionner plusieurs graphiques avec la fonction subplot() 65
[Link](0)
donnees = [Link](1000).cumsum()
[Link](figsize=(12, 4
[Link](1, 2, 1
[Link](donnees)
[Link](‘Serie temporelle’)
[Link](‘Temps’)
[Link](‘Valeur’)
[Link](True, alpha=0.3
[Link](1, 2, 2
[Link](donnees, bins=30, edgecolor=’black’)
[Link](‘Distribution des valeurs’)
[Link](‘Valeur’)
[Link](‘Effectif’)
plt.tight_layout()
[Link]()
[Link](1)
avant = [Link](50, 15, 500
apres = [Link](60, 10, 500
figure, tableau_axes = [Link](1, 2, figsize=(12, 5, sharey=True)
tableau_axes[0].hist(avant, bins=25, color=’lightcoral’, edgecolor=’black’)
tableau_axes[0].set_title(‘Avant’)
tableau_axes[0].set_xlabel(‘Valeur’)
tableau_axes[0].set_ylabel(‘Effectif’)
tableau_axes[1].hist(apres, bins=25, color=’lightgreen’, edgecolor=’black’)
tableau_axes[1].set_title(‘Apres’)
tableau_axes[1].set_xlabel(‘Valeur’)
[Link](‘Comparaison avant / apres traitement’, fontsize=14
66 Positionner plusieurs graphiques avec la fonction subplot()
plt.tight_layout()
[Link]()
[Link](2)
figure, tableau_axes = [Link](2, 2, figsize=(12, 8
# Haut gauche : evolution
tableau_axes[0, 0].plot([Link](100).cumsum(), color=’steelblue’)
tableau_axes[0, 0].set_title(‘Evolution’)
tableau_axes[0, 0].grid(True, alpha=0.3
# Haut droite : repartition par categorie
categories = [‘A’, ‘B’, ‘C’, ‘D’]
valeurs = [23, 45, 56, 38
tableau_axes[0, 1].bar(categories, valeurs, color=’coral’)
tableau_axes[0, 1].set_title(‘Repartition’)
# Bas gauche : correlation
x = [Link](50)
y = 2 * x + [Link](0, 0.2, 50
tableau_axes[1, 0].scatter(x, y, alpha=0.6
tableau_axes[1, 0].set_title(‘Correlation’)
# Bas droite : distribution
tableau_axes[1, 1].hist(
[Link](100, 15, 500,
bins=30, color=’mediumseagreen’,
edgecolor=’black’)
tableau_axes[1, 1].set_title(‘Distribution’)
[Link](‘Tableau de bord’, fontsize=16, fontweight=’bold’)
plt.tight_layout()
[Link]()
plt.subplots_adjust(
left=0.1, # marge gauche
Positionner plusieurs graphiques avec la fonction subplot() 67
right=0.95, # marge droite
bottom=0.1, # marge basse
top=0.9, # marge haute
wspace=0.3, # espace horizontal entre subplots
hspace=0.4 # espace vertical entre subplots
)
Les valeurs sont exprimées en fraction de la largeur ou hauteur de la figure (entre 0 et 1). Les
paramètres wspace et hspace sont les plus fréquemment ajustés quand les étiquettes se
superposent.
Bonnes pratiques
Conclusion
La fonction subplot() permet d’organiser plusieurs graphiques dans une grille rectangulaire,
transformant une simple figure en véritable support de communication. Sa syntaxe (nrows,
ncols, index) est simple à retenir, à condition de garder en tête que la numérotation commence
à 1 et suit le sens de lecture.
Pour des besoins plus élaborés, Matplotlib o re plusieurs alternatives complémentaires : plt.
subplots() pour créer toute une grille d’un coup avec une API orientée objet plus propre, plt.
subplot2grid() pour des graphiques de tailles inégales, et [Link] pour
les mises en page les plus sophistiquées (avec des largeurs et hauteurs personnalisées par
ligne et colonne). La maîtrise de subplot() et de ses variantes est la clé pour passer d’un simple
utilisateur de Matplotlib à un producteur de visualisations structurées et professionnelles.
Intégrer des tableaux
avec la fonction table() F08
La fonction table() de Matplotlib permet d’ajouter un tableau de données directement dans
une figure graphique. Cette fonctionnalité, moins connue que plot() ou bar(), répond à un
besoin fréquent : présenter les valeurs chi rées qui ont servi à construire un graphique, ou
a icher un récapitulatif synthétique à côté d’une visualisation.
L’usage typique consiste à placer un tableau en bas d’un graphique en barres ou d’une
courbe, pour que le lecteur puisse à la fois percevoir les tendances visuellement et lire les
chi res exacts. Cette combinaison graphique + tableau est particulièrement e icace dans les
rapports et présentations.
Note importante : la fonction table() n’est pas destinée à remplacer un vrai outil de mise en
forme de tableaux comme Pandas. Elle est conçue pour l’intégration graphique, pas pour le
calcul ou la manipulation de données tabulaires.
Syntaxe générale
Premier exemple
L’appel à [Link](‘o ’) est essentiel : sans cela, les axes du graphique (inutiles ici) apparaissent
en arrière-plan du tableau. Le paramètre loc=’center’ centre le tableau verticalement dans la
zone disponible.
Intégrer des tableaux avec la fonction table() 71
C’est l’usage le plus courant : placer le tableau sous un graphique en barres ou une courbe.
Positionnement du tableau
Valeur Position
Pour un contrôle complet de la position, on utilise l’argument bbox qui accepte un tuple (x, y,
largeur, hauteur) en coordonnées relatives aux axes (entre 0 et 1).
[Link](
cellText=donnees,
colLabels=en_tetes,
bbox=[0.2, 0.1, 0.6, 0.3 # x, y, largeur, hauteur
)
Couleurs de fond
Les paramètres cellColours, rowColours et colColours permettent de colorer le fond des
cellules, en-têtes de lignes et en-têtes de colonnes.
Intégrer des tableaux avec la fonction table() 73
donnees = [[‘Paris’, 2145, 105, [‘Lyon’, 515, 48, [‘Marseille’, 870, 240
en_tetes = [‘Ville’, ‘Population (k)’, ‘Superficie (km2)’]
libelles_lignes = [‘Ligne 1’, ‘Ligne 2’, ‘Ligne 3’]
# Couleurs en-tetes : une par colonne
couleurs_colonnes = [‘#4472C4’] * 3
# Couleurs lignes : une par ligne
couleurs_lignes = [‘#D9E1F2’] * 3
[Link](figsize=(8, 3
[Link](‘off’)
[Link](cellText=donnees,
colLabels=en_tetes,
rowLabels=libelles_lignes,
colColours=couleurs_colonnes,
rowColours=couleurs_lignes,
loc=’center’,
cellLoc=’center’)
[Link]()
Coloration conditionnelle
Le paramètre cellColours est particulièrement puissant : il accepte une liste 2D de couleurs
de même forme que cellText, ce qui permet de colorer chaque cellule individuellement selon
sa valeur.
import numpy as np
import [Link] as plt
# Donnees : resultats par eleve et par matiere
notes = [[15, 12, 8, 18, 14, 11, 9, 7, 13, 16, 17, 15
eleves = [‘Alice’, ‘Bob’, ‘Chloe’, ‘David’]
matieres = [‘Maths’, ‘Physique’, ‘Histoire’]
# Coloration conditionnelle
def couleur_selon_note(note):
if note >= 15
return ‘#A9DFBF’ # vert clair
elif note >= 10
return ‘#F9E79F’ # jaune clair
else:
return ‘#F5B7B1’ # rouge clair
74 Intégrer des tableaux avec la fonction table()
La valeur de retour de table() permet d’ajuster le tableau après sa création. Les méthodes les
plus utiles sont les suivantes.
Pourquoi désactiver la taille automatique ? Par défaut, Matplotlib ajuste la taille du texte pour
que les cellules soient lisibles, mais ce calcul est souvent imparfait. On préfère fixer soi-
même la taille via set_fontsize() après avoir appelé auto_set_font_size(False).
Indexation : les clés sont des tuples (ligne, colonne). La ligne 0 correspond aux en-têtes
(colLabels), les données commencent donc à la ligne 1. Quand rowLabels est utilisé, la
colonne -1 correspond aux libellés de lignes.
Exemple complet
import numpy as np
import [Link] as plt
annees = [2020, 2021, 2022, 2023, 2024, 2025
produit_a = [100, 110, 125, 135, 150, 165
produit_b = [80, 95, 92, 105, 118, 125
produit_c = [50, 65, 78, 90, 95, 110
[Link](figsize=(10, 7
# Graphique superieur
[Link](annees, produit_a, ‘o-’, label=’Produit A’, linewidth=2
[Link](annees, produit_b, ‘s--’, label=’Produit B’, linewidth=2
[Link](annees, produit_c, ‘^:’, label=’Produit C’, linewidth=2
[Link](‘Evolution des ventes’)
[Link](‘Chiffre d\’affaires (k EUR’
[Link]()
[Link](True, alpha=0.3
[Link]([])
# Preparation du tableau
donnees_brutes = [produit_a, produit_b, produit_c]
libelles_produits = [‘Produit A’, ‘Produit B’, ‘Produit C’]
# Coloration selon l’evolution entre deux annees consecutives
def couleur_evolution(val_precedente, val_actuelle):
if val_precedente is None:
76 Intégrer des tableaux avec la fonction table()
return ‘white’
if val_actuelle > val_precedente:
return ‘#D5F5E3’ # vert clair : progression
elif val_actuelle < val_precedente:
return ‘#FADBD8’ # rouge clair : recul
else:
return ‘#FCF3CF’ # jaune clair : stagnation
couleurs_donnees = []
for ligne_valeurs in donnees_brutes:
couleurs_ligne = [‘white’] # premiere colonne sans comparaison
for indice in range(1, len(ligne_valeurs)):
couleurs_ligne.append(
couleur_evolution(ligne_valeurs[indice - 1, ligne_valeurs[indice])
)
couleurs_donnees.append(couleurs_ligne)
mon_tableau = [Link](cellText=donnees_brutes,
cellColours=couleurs_donnees, rowLabels=libelles_produits,
colLabels=[str(a) for a in annees], loc=’bottom’,
cellLoc=’center’)
mon_tableau.auto_set_font_size(False)
mon_tableau.set_fontsize(10)
mon_tableau.scale(1, 1.5
plt.subplots_adjust(bottom=0.3
[Link]()
Limitations et alternatives
La fonction table() est pratique mais a plusieurs limitations qu’il faut connaître :
• Pas de fusion de cellules : impossible de créer des cellules qui s’étendent sur plusieurs
lignes ou colonnes.
• Formatage du texte limité : pas de support natif pour les formats numériques (séparateurs
de milliers, pourcentages, etc). Il faut pré-formater les chaînes avant de les passer.
• Mise en page figée : les ajustements fins (espacements, alignements individuels)
demandent du code répétitif.
• Performance : peu adapté aux tableaux de plus de 20-30 lignes, qui deviennent illisibles
dans une figure.
Alternatives : pour des tableaux complexes ou purement textuels, on préfère souvent :
• DataFrame de Pandas avec to_html() ou style dans un notebook.
Intégrer des tableaux avec la fonction table() 77
• La bibliothèque tabulate pour les sorties texte bien mises en forme.
• Un export direct en image via un moteur de rendu HTML si le tableau est complexe.
Bonnes pratiques
• Masquer les axes avec [Link](‘o ’) quand le tableau est a iché seul, sinon les axes du
graphique vide restent visibles en arrière-plan.
• Libérer de l’espace avec plt.subplots_adjust(bottom=...) quand le tableau est placé sous
un graphique.
• Supprimer les xticks redondants via [Link]([]) quand les en-têtes du tableau reprennent
les valeurs de l’axe.
• Pré-formater les nombres avant de les passer à cellText : utiliser f’{val:,.2f}’ ou des f-strings
similaires pour un rendu professionnel.
• Désactiver auto_set_font_size() et fixer la police manuellement pour un rendu
reproductible.
• Utiliser la coloration conditionnelle avec parcimonie : trois couleurs maximum, avec un
code couleur cohérent et intuitif (vert = bon, rouge = mauvais).
• Limiter le nombre de lignes : au-delà de 15 lignes, le tableau devient di icilement lisible
dans une figure. Envisager alors un tableau séparé (Pandas, HTML, etc).
• Éviter les tableaux purement décoratifs. Un tableau est justifié quand les valeurs exactes
complètent le graphique, pas quand elles le répètent inutilement.
Conclusion
La fonction table() est un outil spécialisé mais précieux pour enrichir un graphique avec les
données chi rées qui l’ont produit. Combinée à plot() ou bar(), elle permet de produire des
figures complètes dans lesquelles le lecteur accède à la fois à la tendance visuelle et aux
valeurs précises, ce qui est particulièrement apprécié dans les rapports professionnels.
Pour des usages plus avancés (tableaux avec cellules fusionnées, formatage riche,
interactivité), il faut se tourner vers des outils dédiés : Pandas pour la manipulation et l’export
HTML, [Link] pour du texte positionné librement, ou encore des
bibliothèques spécialisées comme plottable. Pour la plupart des besoins courants, table()
reste cependant le chemin le plus rapide pour intégrer quelques lignes de données dans un
graphique Matplotlib.
Annoter un graphique
avec la fonction text() F09
La fonction text() de Matplotlib permet de placer du texte libre à n’importe quelle position
d’un graphique. Contrairement à title(), xlabel() ou legend() qui occupent des emplacements
prédéfinis, text() o re un contrôle total sur la position du texte : on indique explicitement les
coordonnées où l’a icher. Cette flexibilité en fait un outil précieux pour :
• Annoter une valeur spécifique (pic, minimum, point remarquable).
• Ajouter un commentaire explicatif directement dans le graphique.
• A icher des statistiques calculées (moyenne, écart-type, nombre d’observations).
• Étiqueter individuellement des points dans un nuage de points.
• Insérer une source ou une date en coin de graphique.
La fonction text() est aussi le socle de fonctions plus spécialisées comme annotate() (qui
ajoute une flèche) ou xlabel() : les maîtriser nécessite de bien comprendre d’abord text().
Syntaxe générale
Premier exemple
Le texte apparaît à la position (5, 0.5) dans les coordonnées du graphique. Sans spécification
supplémentaire, le point d’ancrage est le coin inférieur gauche du texte.
Argument Description
Exemple
[Link](x, y)
[Link](5, 0.5,
‘Texte en evidence’,
fontsize=14,
fontweight=’bold’,
color=’darkred’,
fontstyle=’italic’)
[Link]()
[Link](x, y)
[Link](3, color=’red’, linestyle=’--’, alpha=0.5
[Link](3.1, 0.8, ‘Evenement important’,
rotation=90,
fontsize=11,
color=’darkred’)
[Link]()
82 Annoter un graphique avec la fonction text()
Par défaut, la position (x, y) correspond au coin inférieur gauche du texte. Pour d’autres
ancrages, on utilise horizontalalignment (abrégé ha) et verticalalignment (abrégé va).
Alignement horizontal
Valeur EƯet
Alignement vertical
Valeur EƯet
[Link](x, y)
[Link](5, [Link](5), ‘ro’, markersize=10
[Link](5, [Link](5),
‘Point cible’,
ha=’center’, va=’bottom’,
fontsize=11, color=’red’)
[Link]()
Avec ha=’center’ et va=’bottom’, le texte est centré horizontalement et placé juste au-dessus
du point (5, sin(5)).
Annoter un graphique avec la fonction text() 83
Par défaut, (x, y) sont exprimés dans les coordonnées des données. Pour placer du texte
indépendamment des données (par exemple toujours en haut à droite du graphique, quelles
que soient les échelles), on change le système de coordonnées via l’argument transform.
L’appel à [Link]() récupère l’axe actif courant. Sa propriété transAxes est la transformation qui
fait correspondre les coordonnées relatives aux bords des axes.
Le paramètre bbox permet d’entourer le texte d’un cadre décoratif. Il prend un dictionnaire de
propriétés.
Clé Description
Exemples d’encadrement
[Link](x, y)
# Cadre arrondi avec fond jaune
[Link](2, 0.5, ‘Arrondi’,
bbox={‘boxstyle’: ‘round’,
‘facecolor’: ‘#FFF3B0’,
‘edgecolor’: ‘#C2A700’,
‘pad’ 0.5
# Cadre carre avec ombre
[Link](5, 0.5, ‘Carre’,
bbox={‘boxstyle’: ‘square’,
‘facecolor’: ‘lightblue’,
‘edgecolor’: ‘navy’,
‘linewidth’ 2
# Cadre fleche pointant a droite
[Link](8, 0.5, ‘Fleche’,
bbox={‘boxstyle’: ‘rarrow’,
Annoter un graphique avec la fonction text() 85
‘facecolor’: ‘lightgreen’})
[Link]()
Comme pour title() et xlabel(), text() supporte une syntaxe de type LaTeX pour a icher des
formules mathématiques. Le texte mathématique est délimité par des $.
x = [Link](-3, 3, 100
y = [Link](-x ** 2
[Link](x, y)
[Link](0, 0.5,
r’$f(x) = e^{-x^2$’,
ha=’center’,
fontsize=16,
bbox={‘facecolor’: ‘white’, ‘edgecolor’: ‘black’})
[Link]()
Le préfixe r devant la chaîne (raw string) est indispensable : il empêche Python d’interpréter les
\ comme des séquences d’échappement, ce qui permet d’écrire \alpha, \sum, \int, etc.
Syntaxe Rendu
r’$x_i$’ x indice i
r’$\int_0^1$’ intégrale de 0 à 1
86 Annoter un graphique avec la fonction text()
[Link](42)
donnees = [Link](100, 15, 500
moyenne = [Link]()
ecart_type = [Link]()
taille = len(donnees)
[Link](donnees, bins=30, edgecolor=’black’, alpha=0.7
[Link](moyenne, color=’red’, linestyle=’--’, linewidth=2
resume = (f’n = {taille}\n’
f’Moyenne = {moyenne:.2f}\n’
f’Ecart-type = {ecart_type:.2f}’)
[Link](0.95, 0.95, resume,
transform=[Link]().transAxes,
ha=’right’, va=’top’,
fontsize=11,
bbox={‘facecolor’: ‘white’,
‘edgecolor’: ‘gray’,
‘boxstyle’: ‘round,pad=0.5’})
[Link](‘Valeur’)
[Link](‘Effectif’)
[Link]()
[Link](x, y)
[Link](‘Evolution mensuelle’)
# Source discretement en bas a droite
[Link](0.99, 0.01,
‘Source : INSEE, 2025’,
transform=[Link]().transAxes,
ha=’right’, va=’bottom’,
fontsize=8,
fontstyle=’italic’,
color=’gray’)
88 Annoter un graphique avec la fonction text()
[Link]()
Matplotlib propose une fonction annotate() qui est une extension de text(). Elle ajoute un point
d’ancrage et éventuellement une flèche pointant vers un élément du graphique.
[Link](x, y)
# annotate() : texte + fleche
[Link](
‘Maximum’,
xy=(x_max, y_max), # point pointe
xytext=(x_max - 1, y_max), # position du texte
fontsize=12,
arrowprops={‘arrowstyle’: ‘→,’ ‘color’: ‘red’})
[Link]()
Bonnes pratiques
Conclusion
La fonction text() est l’outil fondamental d’annotation libre dans Matplotlib. Sa richesse
paramétrique (fontsize, color, rotation, bbox, transform, etc) lui permet de répondre à des
besoins très variés : ajouter un commentaire, a icher des statistiques, étiqueter des points,
insérer une formule mathématique. Sa maîtrise passe par la compréhension de trois notions
clés : le système de coordonnées (données vs axes), l’alignement autour du point d’ancrage,
et la mise en forme typographique.
Au-delà de text(), l’écosystème Matplotlib propose plusieurs variantes complémentaires :
• annotate() pour les annotations avec flèche.
• figtext() pour placer du texte au niveau de la figure plutôt que d’un axe particulier.
• La méthode suptitle() déjà évoquée pour les titres d’ensemble.
Ensemble, ces fonctions donnent à l’utilisateur de Matplotlib toute la liberté nécessaire pour
enrichir ses graphiques de commentaires informatifs et esthétiques.
Afficher des images et des tableaux 2D
avec la fonction imshow() F10
La fonction imshow() (abréviation de image show) permet d’a icher un tableau bidimensionnel
de valeurs sous forme d’image. Chaque valeur du tableau correspond à un pixel, dont
l’intensité ou la couleur reflète la valeur numérique. Cette fonction répond à deux besoins
distincts mais complémentaires :
• A icher une image au sens classique du terme (photo, radiographie, capture d’écran),
représentée par un tableau de valeurs de pixels.
• Visualiser des données matricielles (matrice de corrélation, carte de chaleur, résultat de
convolution, champ scalaire 2D, etc) pour en comprendre la structure spatiale.
Ce second usage, appelé carte de chaleur (heatmap), est probablement le plus fréquent en
science des données. Il est particulièrement puissant pour repérer des motifs, des zones de
concentration ou des ruptures dans un tableau de chi res.
Syntaxe générale
Premier exemple
Par convention, imshow() suit la convention image : le pixel (0, 0) est en haut à gauche, et l’axe
des Y augmente vers le bas. C’est l’inverse des conventions mathématiques habituelles. Ce
comportement est contrôlé par le paramètre origin.
matrice = [Link](16).reshape(4, 4)
[Link](figsize=(10, 4
[Link](1, 2, 1
[Link](matrice, origin=’upper’)
[Link]("origin=’upper’")
[Link]()
[Link](1, 2, 2
[Link](matrice, origin=’lower’)
[Link]("origin=’lower’")
[Link]()
plt.tight_layout()
[Link]()
Règle pratique : utiliser origin=’upper’ (défaut) pour a icher des images réelles, et origin=’lower’
pour visualiser des données mathématiques (fonctions 2D, champs scalaires), afin de
retrouver l’orientation habituelle des graphiques.
Le choix de la cmap est déterminant pour l’interprétabilité d’une heatmap. Matplotlib classe
les cartes en plusieurs familles selon la nature des données.
Cartes séquentielles
Adaptées aux données ordonnées du bas vers le haut (ex. températures, concentrations,
probabilités). Les principales sont les suivantes.
94 Afficher des images et des tableaux 2D avec la fonction imshow()
Cartes divergentes
Adaptées aux données centrées autour d’une valeur de référence (souvent zéro), où l’on veut
distinguer les valeurs négatives des positives.
Astuce : ajouter _r au nom d’une cmap inverse son sens (‘viridis_r’, ‘Blues_r’, etc).
Cartes à éviter
Les cartes ‘jet’ et ‘rainbow’, longtemps populaires, sont aujourd’hui déconseillées : elles créent
des artefacts visuels (fausses limites, accentuation de certaines zones), et sont inaccessibles
aux personnes daltoniennes. Il vaut mieux privilégier ‘viridis’ ou ‘cividis’.
Par défaut, Matplotlib utilise le minimum et le maximum du tableau pour définir l’échelle de
couleurs. Cela peut poser problème quand :
• Quelques valeurs aberrantes écrasent l’essentiel de la dynamique visuelle.
• On veut comparer plusieurs cartes de chaleur avec une échelle commune.
Les paramètres vmin et vmax permettent de forcer les bornes par [Link](matrice,
cmap=’viridis’, vmin=0, vmax=1) avant l’a ichage [Link]().
Les valeurs en dehors de [vmin, vmax] sont écrêtées (saturent aux extrémités de la carte de
couleurs). C’est utile pour mettre en évidence la plage d’intérêt sans se laisser perturber par
Afficher des images et des tableaux 2D avec la fonction imshow() 95
des valeurs aberrantes (outliers).
Le paramètre interpolation contrôle la manière dont les pixels sont rendus. Les options les
plus utiles sont les suivantes.
Valeur EƯet
Règle pratique : pour une heatmap de données, interpolation=’none’ est quasi systématiquement
le bon choix. Chaque pixel correspond à une donnée distincte, et le lissage tromperait le
lecteur en suggérant une continuité fictive. Le lissage est réservé aux photos ou aux données
spatialement continues (champs physiques échantillonnés).
Par défaut, les axes a ichent les indices des pixels (de 0 à N-1). Dans bien des cas, on souhaite
que les axes indiquent des coordonnées physiques (temps, distance, longueur d’onde, etc).
Le paramètre extent prend un tuple (xmin, xmax, ymin, ymax).
[Link](label=’f(x, y)’)
[Link](‘x’)
[Link](‘y’)
[Link](‘Fonction sin(x)·cos(y)’)
[Link]()
On remarque la combinaison typique : extent pour calibrer les axes, origin=’lower’ pour
retrouver l’orientation mathématique, et une carte divergente car la fonction a des valeurs
positives et négatives.
Pour une image photographique, ‘equal’ est indispensable (sinon l’image est déformée). Pour
une heatmap très allongée, ‘auto’ est souvent plus lisible.
Une pratique courante est d’écrire la valeur numérique dans chaque cellule, en combinant
imshow() et text().
matrice = [Link]([[0.23, 0.45, 0.67, 0.81, 0.12, 0.56, 0.34, 0.89, 0.41
Afficher des images et des tableaux 2D avec la fonction imshow() 97
lignes = [‘Lun’, ‘Mar’, ‘Mer’]
colonnes = [‘Matin’, ‘Midi’, ‘Soir’]
[Link](figsize=(6, 5
[Link](matrice, cmap=’YlOrRd’)
[Link](label=’Valeur’)
# Etiquettes des axes
[Link](range(len(colonnes)), colonnes)
[Link](range(len(lignes)), lignes)
# Texte dans chaque cellule
nb_lignes, nb_colonnes = [Link]
for ligne in range(nb_lignes):
for colonne in range(nb_colonnes):
[Link](colonne, ligne,
f’{matrice[ligne, colonne]:.2f}’,
ha=’center’, va=’center’,
color=’black’)
[Link](‘Heatmap annotee’)
[Link]()
Astuce : pour assurer la lisibilité du texte quelle que soit la couleur de fond, on peut adapter
dynamiquement la couleur de la police (noir sur fond clair, blanc sur fond sombre).
Matrice de corrélation
Un usage typique en science des données est de visualiser la corrélation entre les colonnes
d’un tableau.
[Link](1)
98 Afficher des images et des tableaux 2D avec la fonction imshow()
Bonnes pratiques
• Toujours ajouter une colorbar() pour les heatmaps : sans échelle, les couleurs sont
ininterprétables.
100 Afficher des images et des tableaux 2D avec la fonction imshow()
• Choisir la cmap selon la nature des données : séquentielle pour des valeurs ordonnées,
divergente pour des valeurs centrées autour d’une référence.
• Utiliser origin=’lower’ pour les données mathématiques : cela rétablit l’orientation
habituelle des axes (Y vers le haut). Garder ‘upper’ pour les images réelles.
• Spécifier interpolation=’none’ pour les heatmaps de données : le lissage fait croire à une
continuité qui n’existe pas.
• Fixer vmin et vmax quand on compare plusieurs heatmaps entre elles, pour une échelle
commune cohérente.
• Utiliser extent dès que les axes représentent autre chose que des indices de pixels.
• Éviter ‘jet’ et ‘rainbow’ : préférer ‘viridis’ ou ‘cividis’, perceptivement uniformes et
accessibles aux daltoniens.
• Annoter les cellules quand la heatmap est petite (moins de 10x10) : les valeurs chi rées
complètent utilement le code couleur.
Conclusion
La fonction imshow() est l’outil universel pour a icher des tableaux 2D comme des images
ou des heatmaps dans Matplotlib. Sa puissance tient à sa polyvalence : on peut aussi bien
l’utiliser pour visualiser une photo, une matrice de corrélation, le résultat d’une simulation
numérique, une image médicale ou une sortie de réseau de neurones. Sa maîtrise repose
sur quelques concepts clés : le choix de la carte de couleurs adaptée au type de données, la
bonne orientation des axes via origin, et le calibrage éventuel des coordonnées physiques via
extent.
Pour des besoins plus spécialisés, Matplotlib propose plusieurs fonctions voisines :
• [Link]() pour les grilles non régulières.
• [Link]() et [Link]() pour les courbes ou zones de niveau.
• [Link]() qui est un raccourci spécifique aux matrices numériques (avec des réglages
par défaut mieux adaptés).
Pour l’a ichage d’images au sens photographique, on combine souvent imshow() avec la
bibliothèque PIL ou opencv-python, qui facilitent le chargement et le traitement préalable
des fichiers image.
Lister toutes les fonctions intégrées
de Matplotlib F11
Matplotlib est une bibliothèque graphique aux multiples facettes. L’objectif de ce notebook
est de permettre de lister précisément toutes les fonctions graphiques intégrées disponibles
dans le module [Link]. On va principalement :
• Extraire la liste complète des fonctions de pyplot.
• Filtrer celles qui produisent un graphique.
• Les classer par catégorie (1D, 2D, 3D, statistiques, etc).
• A icher leur signature et une brève description.
Tout le code source de programmation de cette fiche se trouve dans le fichier f11_matplotlib_
fonctions_graphiques.ipynb placé dans le dossier NotebookJupyter de l’archive téléchargée.
On récupère tous les attributs de [Link] qui sont des fonctions. Avec la version
utilisée de Matplotlib, qui est la 3.10.6, on dénombre 171 fonctions intégrées.
def lister_fonctions_pyplot():
"""Retourne la liste complète des fonctions publiques de [Link]."""
toutes_fonctions = []
for nom in dir(plt):
if [Link]("_"):
continue
objet = getattr(plt, nom)
if [Link](objet) or [Link](objet):
toutes_fonctions.append(nom)
return sorted(toutes_fonctions)
# test
liste_complete = lister_fonctions_pyplot()
print(f"Nombre total de fonctions dans pyplot : {len(liste_complete)}")
print("Extrait des 20 premières :")
for nom_fonction in liste_complete[:20]:
print(f" - {nom_fonction}")
Toutes les fonctions de pyplot ne produisent pas forcément un tracé comme par exemple
show(), savefig(), subplot(), xlabel(), etc. Matplotlib expose une liste o icielle des fonctions de
tracé dans [Link]. On va utiliser cette source pour obtenir une liste fiable.
if callable(objet):
fonctions_trouvees.append(nom)
return sorted(set(fonctions_trouvees))
# test
fonctions_graphiques = extraire_fonctions_tracage()
print(f"Nombre de fonctions graphiques identifiées : {len(fonctions_graphiques)}")
for nom in fonctions_graphiques:
print(f" - {nom}")
categories_graphiques = {
106 Lister toutes les fonctions intégrées de Matplotlib
[✓] [Link]
[✓] [Link]
[✓] [Link]
=== Champs vectoriels (4 fonctions) ===
[✓] [Link]
[✓] [Link]
[✓] [Link]
[✓] [Link]
=== Maillages triangulaires (4 fonctions) ===
[✓] [Link]
[✓] [Link]
[✓] [Link]
[✓] [Link]
=== Analyse du signal (9 fonctions) ===
[✓] [Link]
[✓] [Link]
[✓] plt.angle_spectrum
[✓] plt.magnitude_spectrum
[✓] plt.phase_spectrum
[✓] [Link]
[✓] [Link]
[✓] [Link]
[✓] [Link]
=== Annotations et lignes de repere (9 fonctions) ===
[✓] [Link]
[✓] [Link]
[✓] [Link]
[✓] [Link]
[✓] [Link]
[✓] [Link]
[✓] [Link]
[✓] [Link]
[✓] [Link]
Total : 58 fonctions graphiques répertoriées.
def extraire_signature(nom_fonction):
"""Retourne la signature d’une fonction de pyplot sous forme de chaine."""
try:
objet = getattr(plt, nom_fonction)
signature = [Link](objet)
return f"{nom_fonction}{signature}"
except (ValueError, TypeError):
return f"{nom_fonction}(...)"
def extraire_description(nom_fonction):
"""Retourne la première ligne utile de la docstring."""
objet = getattr(plt, nom_fonction, None)
if objet is None or objet.__doc__ is None:
return "(pas de description)"
lignes = [[Link]() for ligne in objet.__doc__.split("\n") if [Link]()]
return lignes[0] if lignes else "(pas de description)"
def construire_tableau_recapitulatif(dictionnaire_categories):
"""Construit un DataFrame recapitulatif des fonctions graphiques."""
lignes = []
for categorie, liste_fonctions in dictionnaire_categories.items():
for nom in liste_fonctions:
if hasattr(plt, nom):
[Link]({
"Fonction": f"plt.{nom}",
"Categorie": categorie,
"Signature": extraire_signature(nom),
"Description": extraire_description(nom)
})
return [Link](lignes)
# test
tableau_recapitulatif = construire_tableau_recapitulatif(categories_graphiques)
pd.set_option("display.max_colwidth", 100
print(len(tableau_recapitulatif),"fonctions répertoriées")
print(tableau_recapitulatif.head())
58 fonctions répertoriées
Fonction Categorie \
110 Lister toutes les fonctions intégrées de Matplotlib
Signature \
0 plot(*args: ‘float | ArrayLike | str’, scalex: ‘bool’ = True, scaley: ‘bool’ =
True, data=None, ...
1 loglog(*args,
**kwargs) -> ‘list[Line2D]’
2 semilogx(*args,
**kwargs) -> ‘list[Line2D]’
3 semilogy(*args,
**kwargs) -> ‘list[Line2D]’
4 step(x: ‘ArrayLike’, y: ‘ArrayLike’, *args, where: "Literal[‘pre’, ‘post’,
‘mid’]" = ‘pre’, data...
Description
0 Plot y versus x as lines and/or markers.
1 Make a plot with log scaling on both the x- and y-axis.
2 Make a plot with log scaling on the x-axis.
3 Make a plot with log scaling on the y-axis.
4 Make a step plot.
On compose une petite fonction utilitaire pour chercher une fonction par mot-clé.
Signature \
18 hist(x: ‘ArrayLike | Sequence[ArrayLike]’, bins: ‘int | Sequence[float] | str |
None’ = None, *,...
19 hist2d(x: ‘ArrayLike’, y: ‘ArrayLike’, bins: ‘None | int | tuple[int, int] |
ArrayLike | tuple[A...
Description
18 Compute and plot a histogram.
19 Make a 2D histogram plot.
Fonction Categorie \
29 [Link] Images, matrices et champs 2D
30 [Link] Images, matrices et champs 2D
36 [Link] Maillages triangulaires
37 [Link] Maillages triangulaires
Signature \
29 contour(*args, data=None, **kwargs) -> ‘QuadContourSet’
30 contourf(*args, data=None, **kwargs) -> ‘QuadContourSet’
36 tricontour(*args, **kwargs)
37 tricontourf(*args, **kwargs)
Description
29 Plot contour lines.
30 Plot filled contours.
36 Draw contour lines on an unstructured triangular grid.
37 Draw contour regions on an unstructured triangular grid.
On peut sauvegarder le tableau dans un fichier au format CSV et dans une feuille d’un classeur
EXCEL, au format xlsx (figure 1), pour une consultation ultérieure.
112 Lister toutes les fonctions intégrées de Matplotlib
Figure n°1
Résumé final
Pour résumer tout ce que l’on vient de voir en programmation, on compose un résumé au
format texte pour pouvoir apprécier l’étendue des fonctions intégrées de Matplotlib.
def afficher_resume(tableau):
"""Affiche un resume statistique du tableau des fonctions graphiques."""
print("=" * 60
print("RESUME DES FONCTIONS GRAPHIQUES MATPLOTLIB")
print("=" * 60
print(f"Version matplotlib : {matplotlib.__version__}")
print(f"Nombre total de fonctions graphiques : {len(tableau)}")
print(f"Repartition par categorie :")
repartition = tableau["Categorie"].value_counts()
for nom_categorie, nombre in [Link]():
print(f" - {nom_categorie} : {nombre}")
print("=" * 60
# test
afficher_resume(tableau_recapitulatif)
============================================================
RESUME DES FONCTIONS GRAPHIQUES MATPLOTLIB
============================================================
Version matplotlib : 3.10.6
Nombre total de fonctions graphiques : 58
Repartition par categorie :
- Courbes et lignes 1D : 9
- Nuages de points et barres : 9
- Analyse du signal : 9
- Annotations et lignes de repere : 9
- Statistiques et distributions : 7
- Images, matrices et champs 2D : 7
- Champs vectoriels : 4
- Maillages triangulaires : 4
============================================================
Visualiser
les couleurs prédéfinies de Matplolib F12
Dans cette fiche, on compose un notebook qui a iche toutes les couleurs nommées
disponibles de Matplotlib sous forme de tableaux visuels. Matplotlib propose plusieurs
familles de couleurs prédéfinies :
• Couleurs de base (b, g, r, c, m, y, k, w).
• Couleurs Tableau (tab:blue, tab:orange, etc).
• Couleurs CSS4 (148 couleurs nommées HTML/CSS).
• Couleurs XKCD (~950 couleurs issues du sondage XKCD).
Le module [Link] regroupe tout ce qui concerne la gestion des couleurs dans
Matplotlib : définition, conversion, normalisation et création de palettes personnalisées.
Pour chaque couleur, on a iche un rectangle coloré, son nom et son code hexadécimal
correspondant. Tout le code source de programmation de cette fiche se trouve dans le fichier
f12_matplotlib_couleurs_predefinies.ipynb placé dans le dossier NotebookJupyter de l’archive
téléchargée.
Le module [Link] regroupe tout ce qui concerne la gestion des couleurs dans
Matplotlib : définition, conversion, normalisation et création de palettes personnalisées.
Exemple synthétique
Cette fonction a iche un tableau visuel de couleurs (rectangle coloré + nom + code
hexadécimal) à partir d’un dictionnaire {nom: couleur}.
hsv = mcolors.rgb_to_hsv(rgb)
return (round(hsv[0 * 20, hsv[1], hsv[2])
On passe dans un espace HSV pour grouper les couleurs proches visuellement. Le
round(hsv[0] * 20) crée 20 paquets de teintes : à l’intérieur d’un paquet, on trie par saturation
puis luminosité (plus pâle au plus vif).
Calcul de la grille
Création du canevas
Boucle d’aƯichage
Élément Rôle
Logique générale
Couleurs de base
Les 8 couleurs historiques de Matplotlib, accessibles par une seule lettre (figure 1).
couleurs_base = mcolors.BASE_COLORS
Visualiser les couleurs prédéfinies de Matplotlib 121
print(f"Nombre de couleurs de base : {len(couleurs_base)}")
# Conversion en hex pour avoir des codes uniformes
couleurs_base_hex = {nom: mcolors.to_hex(valeur) for nom, valeur in couleurs_base.items()}
# graphique
gph = afficher_tableau_couleurs(
couleurs_base_hex,
titre="Couleurs de base (BASE_COLORS",
nombre_colonnes=2,
trier_par_teinte=False
)
[Link]("f12/couleurs_de_base.png",facecolor=’whitesmoke’,dpi=300,bbox_inches=’tight’)
Figure n°1
Les 10 couleurs utilisées par défaut pour les tracés successifs (figure 2).
couleurs_tableau = mcolors.TABLEAU_COLORS
print(f"Nombre de couleurs Tableau : {len(couleurs_tableau)}")
# graphique
gph = afficher_tableau_couleurs(
couleurs_tableau,
titre="Couleurs Tableau (TABLEAU_COLORS",
nombre_colonnes=2,
trier_par_teinte=False
)
[Link]("f12/couleurs_de_tableau.png",facecolor=’whitesmoke’,dpi=300,bbox_inches=’tight’)
122 Visualiser les couleurs prédéfinies de Matplotlib
Figure n°2
Couleurs CSS4
Les couleurs CSS4 sont l’ensemble des 148 couleurs nommées définies par le W3C dans
la spécification CSS Color Module Level 4, standard utilisé par tous les navigateurs web.
Chaque couleur possède un nom anglais explicite (tomato, steelblue, lightgoldenrodyellow)
associé à un code hexadécimal fixe.
Elles incluent les 16 couleurs HTML historiques (red, blue, black, etc), les couleurs X11 héritées
de l’environnement Unix (darkorange, mediumseagreen, etc), et les gris nommés (gainsboro,
dimgray, slategray).
Matplotlib les expose via mcolors.CSS4_COLORS, ce qui permet d’utiliser directement leur
nom dans n’importe quel tracé comme [Link](x, y, color="steelblue"). Le code ci-dessous
liste les 148 couleurs CSS4 nommées issues de la spécification HTML/CSS (figure 3).
couleurs_css4 mcolors.CSS4_COLORS
print(f"Nombre de couleurs CSS4 {len(couleurs_css4"
# graphique
gph = afficher_tableau_couleurs(
couleurs_css4,
titre="Couleurs CSS4 CSS4_COLORS triees par teinte",
nombre_colonnes=4,
trier_par_teinte=True
)
[Link]("f12/couleurs_css4.png",facecolor=’whitesmoke’,dpi=300,bbox_inches=’tight’)
gph = afficher_tableau_couleurs(
couleurs_css4,
titre="Couleurs CSS4 CSS4_COLORS ordre alphabetique",
nombre_colonnes=4,
trier_par_teinte=False
)
[Link]("f12/couleurs_css4_trier.png",facecolor=’whitesmoke’,dpi=300,bbox_inches=’tight’)
Figure n°3
124 Visualiser les couleurs prédéfinies de Matplotlib
Figure n°4
Couleurs XKCD
Il y a 949 couleurs issues du grand sondage XKCD. Elles sont accessibles via le préfixe xkcd:
(ex: xkcd:sky blue). Comme elles sont nombreuses, on les a iche avec plus de colonnes. La
figure 5 en visualise une petite portion.
couleurs_xkcd = mcolors.XKCD_COLORS
print(f"Nombre de couleurs XKCD {len(couleurs_xkcd)}")
# Pour la lisibilite, on enleve le prefixe ‘xkcd:’ dans l’affichage
couleurs_xkcd_propres = {
[Link]("xkcd:", ""): valeur
for nom, valeur in couleurs_xkcd.items() }
Visualiser les couleurs prédéfinies de Matplotlib 125
Figure n°5
126 Visualiser les couleurs prédéfinies de Matplotlib
# graphique
gph = afficher_tableau_couleurs(
couleurs_xkcd_propres,
titre="Couleurs XKCD XKCD_COLORS triees par teinte",
nombre_colonnes=5,
trier_par_teinte=True
)
[Link]("f12/couleurs_xkcd.png",facecolor=’whitesmoke’,dpi=300,bbox_inches=’tight’)
Pour retrouver rapidement une couleur par nom, on ajoute la fonction rechercher_couleur().
Sur la figure 6, on recherche les couleurs qui contiennent le mot rose. Et sur les figures 7 et 8,
on recherche les couleurs qui contiennent le mot blue.
Figure n°6
Figure n°7
Visualiser les couleurs prédéfinies de Matplotlib 129
Figure n°8
Résumé
def afficher_resume_couleurs():
"""Affiche un resume du nombre de couleurs disponibles dans chaque famille."""
familles = {
"BASE_COLORS (couleurs de base)": mcolors.BASE_COLORS,
"TABLEAU_COLORS (palette par defaut)": mcolors.TABLEAU_COLORS,
"CSS4_COLORS (standard HTML/CSS": mcolors.CSS4_COLORS,
"XKCD_COLORS (sondage XKCD": mcolors.XKCD_COLORS
}
print("=" * 55
print("RESUME DES COULEURS PREDEFINIES DANS MATPLOTLIB")
print("=" * 55
total = 0
for nom_famille, dictionnaire in [Link]():
nombre = len(dictionnaire)
total += nombre
print(f" {nom_famille:42s} : {nombre:>5"
print("-" * 55
print(f" {‘TOTAL’42s} : {total:>5"
print("=" * 55
# test
afficher_resume_couleurs()
130 Visualiser les couleurs prédéfinies de Matplotlib
=======================================================
RESUME DES COULEURS PREDEFINIES DANS MATPLOTLIB
=======================================================
BASE_COLORS (couleurs de base) : 8
TABLEAU_COLORS (palette par defaut) : 10
CSS4_COLORS (standard HTML/CSS) : 148
XKCD_COLORS (sondage XKCD) : 949
-------------------------------------------------------
TOTAL : 1115
=======================================================
Visualiser les palettes de couleurs
prédéfinies de Matplotlib F13
Ce notebook a iche toutes les palettes de couleurs (colormaps) prédéfinies dans Matplotlib
sous forme de bandes dégradées avec leur nom. Matplotlib classe ses colormaps en plusieurs
catégories :
• Perceptuellement uniformes : viridis, plasma, inferno, magma, cividis.
• Séquentielles : dégradés simples (Blues, Greens, Reds, etc).
• Séquentielles (2) : autres dégradés (cool, hot, spring, etc).
• Divergentes : dégradés avec un point central (RdBu, coolwarm, etc).
• Cycliques : palettes qui bouclent (twilight, hsv).
• Qualitatives : couleurs discrètes (Set1, Pastel1, tab10, etc).
• Diverses : palettes mixtes (jet, rainbow, terrain, etc).
Tout le code source de programmation de cette fiche se trouve dans le fichier f13_matplotlib_
palettes_predefinies.ipynb placé dans le dossier NotebookJupyter de l’archive téléchargée.
categories_palettes = {
"Perceptuellement uniformes": [
"viridis", "plasma", "inferno", "magma", "cividis"
],
"Sequentielles": [
"Greys", "Purples", "Blues", "Greens", "Oranges", "Reds",
"YlOrBr", "YlOrRd", "OrRd", "PuRd", "RdPu", "BuPu",
"GnBu", "PuBu", "YlGnBu", "PuBuGn", "BuGn", "YlGn"
],
"Sequentielles (2": [
"binary", "gist_yarg", "gist_gray", "gray", "bone", "pink",
"spring", "summer", "autumn", "winter", "cool", "Wistia",
"hot", "afmhot", "gist_heat", "copper"
],
"Divergentes": [
"PiYG", "PRGn", "BrBG", "PuOr", "RdGy", "RdBu", "RdYlBu",
"RdYlGn", "Spectral", "coolwarm", "bwr", "seismic"
],
"Cycliques": [
"twilight", "twilight_shifted", "hsv"
],
"Qualitatives": [
"Pastel1", "Pastel2", "Paired", "Accent", "Dark2", "Set1",
"Set2", "Set3", "tab10", "tab20", "tab20b", "tab20c"
],
"Diverses": [
"flag", "prism", "ocean", "gist_earth", "terrain", "gist_stern",
"gnuplot", "gnuplot2", "CMRmap", "cubehelix", "brg",
"gist_rainbow", "rainbow", "jet", "turbo", "nipy_spectral",
"gist_ncar"
]
}
Visualiser les palettes de couleurs prédéfinies de Matplotlib 133
# Affichage du nombre de palettes par categorie
total_palettes = 0
for nom_categorie, liste in categories_palettes.items():
print(f"{nom_categorie:35s} : {len(liste)} palettes")
total_palettes += len(liste)
print(f"{‘TOTAL’35s} : {total_palettes} palettes")
On construit une fonction a icher_palettes() qui a iche une liste de palettes sous forme de
bandes dégradées.
"""
# Gradient horizontal de 0 a 1
gradient = [Link](0, 1, 256.reshape(1, 1
gradient = [Link]([gradient, gradient])
nombre_palettes = len(liste_palettes)
hauteur_totale = hauteur_par_palette * nombre_palettes + 1.0
# Grille : N lignes x 2 colonnes (nom | palette)
figure, axes = [Link](
nrows=nombre_palettes,
ncols=2,
figsize=(largeur, hauteur_totale),
facecolor=’whitesmoke’,
dpi=300,
gridspec_kw={‘width_ratios’: ratio_colonnes, ‘wspace’ 0.05, ‘hspace’ 0.3
)
[Link](titre, fontsize=14, fontweight="bold", y=1.0, family=’Roboto Condensed’)
# Si une seule palette, axes est 1D → on le passe en 2D
if nombre_palettes == 1
axes = [Link]([axes])
for ligne in range(nombre_palettes):
axe_nom = axes[ligne, 0
axe_palette = axes[ligne, 1
nom_palette = liste_palettes[ligne]
# Colonne de gauche : nom de la palette
axe_nom.text(
1.0, 0.5, nom_palette,
va="center", ha="right",
fontsize=12,
family="Roboto Condensed",
transform=axe_nom.transAxes
)
axe_nom.set_axis_off()
# Colonne de droite : bande de couleur
axe_palette.imshow(gradient, aspect="auto", cmap=plt.get_cmap(nom_palette))
axe_palette.set_axis_off()
[Link]()
return figure
Visualiser les palettes de couleurs prédéfinies de Matplotlib 135
Perceptuellement uniformes
Ces palettes sont recommandées pour la plupart des usages scientifiques car elles préservent
les di érences de valeurs de manière uniforme à l’œil (figure 1).
gph = afficher_palettes(
categories_palettes["Perceptuellement uniformes"],
titre="Palettes perceptuellement uniformes"
)
[Link]("f13/palette_uniforme.png",facecolor=’whitesmoke’,dpi=300,bbox_inches=’tight’)
Figure n°1
Séquentielles
Idéales pour représenter des données ordonnées qui vont du clair au foncé (figure 2).
# graphique
gph = afficher_palettes(
categories_palettes["Sequentielles"],
titre="Palettes sequentielles"
)
# sauvegarde
[Link]("f13/palette_sequentielle.png",facecolor=’whitesmoke’,dpi=300,bbox_inches=’tight’)
136 Visualiser les palettes de couleurs prédéfinies de Matplotlib
Figure n°2
Séquentielles (famille 2)
Idéales pour représenter des données ordonnées qui vont du clair au foncé (figure 3).
gph = afficher_palettes(
categories_palettes["Sequentielles (2",
titre="Palettes sequentielles (famille 2"
)
[Link]("f13/palette_sequentielle_famille_2.png",facecolor=’whitesmoke’,dpi=300,
bbox_inches=’tight’)
Visualiser les palettes de couleurs prédéfinies de Matplotlib 137
Figure n°3
Divergentes
Idéales pour représenter des données avec un point de référence central comme le zéro, la
moyenne, le seuil (figure 4).
# graphique
gph = afficher_palettes(
categories_palettes["Divergentes"],
titre="Palettes divergentes"
)
[Link]("f13/palette_divergente.png",facecolor=’whitesmoke’,dpi=300,bbox_inches=’tight’)
138 Visualiser les palettes de couleurs prédéfinies de Matplotlib
Figure n°4
Cycliques
Pour des données qui bouclent comme les angles, les heures, les phases (figure 5).
Figure n°5
gph = afficher_palettes(
categories_palettes["Cycliques"],
titre="Palettes cycliques"
Visualiser les palettes de couleurs prédéfinies de Matplotlib 139
)
[Link]("f13/palette_cyclique.png",facecolor=’whitesmoke’,dpi=300,bbox_inches=’tight’)
Qualitatives
Pour des catégories distinctes non ordonnées comme les classes, les groupes (figure 6).
gph = afficher_palettes(
categories_palettes["Qualitatives"],
titre="Palettes qualitatives"
)
[Link]("f13/palette_qualitative.png",facecolor=’whitesmoke’,dpi=300,bbox_inches=’tight’)
Figure n°6
Diverses
gph = afficher_palettes(
categories_palettes["Diverses"],
titre="Palettes diverses"
)
[Link]("f13/palette_diverses.png",facecolor=’whitesmoke’,dpi=300,bbox_inches=’tight’)
Figure n°7
def afficher_categorie(nom_categorie):
Visualiser les palettes de couleurs prédéfinies de Matplotlib 141
"""Affiche les palettes d’une categorie donnee."""
if nom_categorie not in categories_palettes:
print(f"Categorie inconnue. Disponibles : {list(categories_palettes.keys())}")
return
gph = afficher_palettes(
categories_palettes[nom_categorie],
titre=f"Palettes : {nom_categorie}"
)
return gph
# Exemple
gph = afficher_categorie("Qualitatives")
Toutes les palettes peuvent être inversées en ajoutant le su ixe _r à leur nom (par exemple
avec viridis_r, Blues_r, RdBu_r). Sur la figure 8, on teste la fonction avec les palettes viridis et
viridis_r.
def comparer_palette_et_inverse(nom_palette):
"""Affiche une palette et sa version inversee cote a cote."""
gph = afficher_palettes(
[nom_palette, f"{nom_palette}_r"],
titre=f"Comparaison : {nom_palette} vs {nom_palette}_r"
)
return gph
# exemple
gph = comparer_palette_et_inverse("viridis")
[Link]("f13/palette_viridis_et_inverse.png",facecolor=’whitesmoke’,dpi=300,bbox_inches=’tight’)
Figure n°8
142 Visualiser les palettes de couleurs prédéfinies de Matplotlib
def rechercher_palette(mot_cle):
"""Recherche les palettes dont le nom contient le mot-cle."""
toutes_palettes = sorted([Link]())
# On exclut les versions inversees pour la lisibilite
palettes_filtrees = [
nom for nom in toutes_palettes
if mot_cle.lower() in [Link]() and not [Link]("_r")
]
if not palettes_filtrees:
print(f"Aucune palette trouvee pour ‘{mot_cle}’.")
return
print(f"Palettes trouvees pour ‘{mot_cle}’ : {len(palettes_filtrees)}")
gph = afficher_palettes(
palettes_filtrees,
titre=f"Palettes contenant ‘{mot_cle}’"
)
return gph
# Exemple
gph = rechercher_palette("blue")
[Link]("f13/palette_rechercher_blue.png",facecolor=’whitesmoke’,dpi=300,bbox_inches=’tight’)
Figure n°9
Visualiser les palettes de couleurs prédéfinies de Matplotlib 143
def lister_toutes_palettes(inclure_inversees=False):
"""Retourne la liste complete des palettes disponibles."""
toutes = sorted([Link]())
if not inclure_inversees:
toutes = [nom for nom in toutes if not [Link]("_r")]
return toutes
# test
liste_sans_inversees = lister_toutes_palettes(inclure_inversees=False)
liste_avec_inversees = lister_toutes_palettes(inclure_inversees=True)
print(f"Nombre de palettes (sans inversees) : {len(liste_sans_inversees)}")
print(f"Nombre de palettes (avec inversees) : {len(liste_avec_inversees)}")
print("Extrait des 20 premieres :")
for nom in liste_sans_inversees[:20]:
print(f" - {nom}")
- Pastel1
- Pastel2
- PiYG
- PuBu
- PuBuGn
Résumé final
def afficher_resume_palettes():
"""Affiche un resume des palettes par categorie."""
print("=" * 60
print("RESUME DES PALETTES DE COULEURS MATPLOTLIB")
print("=" * 60
total = 0
for nom_categorie, liste in categories_palettes.items():
print(f" {nom_categorie:35s} : {len(liste):>3} palettes")
total += len(liste)
print("-" * 60
print(f" {‘TOTAL (categorisees)’35s} : {total:>3 palettes")
print(f" {‘TOTAL (disponibles sans _r)’35s} : {len(lister_toutes_palettes(False)):>3} palettes")
print(f" {‘TOTAL (avec versions inversees _r)’35s} : {len(lister_toutes_palettes(True)):>3 palettes")
print("=" * 60
# test
afficher_resume_palettes()
============================================================
RESUME DES PALETTES DE COULEURS MATPLOTLIB
============================================================
Perceptuellement uniformes : 5 palettes
Sequentielles : 18 palettes
Sequentielles (2) : 16 palettes
Divergentes : 12 palettes
Cycliques : 3 palettes
Qualitatives : 12 palettes
Diverses : 17 palettes
------------------------------------------------------------
TOTAL (categorisees) : 83 palettes
TOTAL (disponibles sans _r) : 90 palettes
Visualiser les palettes de couleurs prédéfinies de Matplotlib 145
TOTAL (avec versions inversees _r) : 180 palettes
============================================================
Exemples pratiques avec Matplotlib F14
Matplotlib o re de nombreuses façons de créer des visualisations statiques, animées et
interactives. C’est la bibliothèque de tracé la plus populaire pour Python. Elle fonctionne
facilement avec les tableaux NumPy et Pandas. Seaborn, quand à lui, étend encore plus les
fonctionnalités de Matplotlib. Vous pouvez l’installer avec la commande pip install matplotlib.
Le site web [Link] est une excellente page à consulter lorsque
vous cherchez des informations sur la création d’un type de graphique spécifique.
Tout le code source de programmation de cette fiche se trouve dans le fichier f14_matplotlib_
test_graphique.ipynb placé dans le dossier NotebookJupyter de l’archive téléchargée.
1 - Graphique fonctionnel
On commence par un graphique simple (figure 1) qui visualise une courbe rouge représentant
l’équation y = x² passant par les points (0,0), (1,1), (2,4), (3,9), (4,16) et (5,25), le tout sur un fond
beige clair avec une grille discrète.
Figure n°1
abscisses = [0 1 2 3 4 5]
ordonnees = [ 0 1 4 9 16 25]
[Link]({
‘[Link]’:’Roboto Condensed’,
150 Exemples pratiques avec Matplotlib
‘[Link]’:’16’
})
Cette instruction définit les paramètres globaux du graphique : la police de caractères utilisée
sera Roboto Condensed et la taille par défaut du texte sera de 16 points.
Création de la figure
fig, ax = [Link](1,1,figsize=(15,10,facecolor=’oldlace’,dpi=300
On crée une figure contenant un seul graphique (1,1), de dimensions 15×10 pouces, avec
un fond couleur oldlace (blanc cassé) et une résolution de 300 points par pouce (qualité
impression).
Tracé de la courbe
La méthode plot() trace la courbe en rouge, avec une épaisseur de trait de 2 pixels (lw =
linewidth). Le label sera a iché dans la légende.
On ajoute un titre en gras de 22 points au-dessus du graphique, ainsi que les étiquettes des
axes X et Y.
Légende et grille
# personnalisation
[Link](loc=’upper left’, facecolor=’whitesmoke’, edgecolor=’black’, labelcolor=’blue’)
[Link](True, color=’gray’, alpha=0.3
La légende est placée en haut à gauche, avec un fond whitesmoke, une bordure noire et
un texte en bleu. Une grille grise semi-transparente (alpha=0.3) est ajoutée pour faciliter la
lecture des valeurs.
Exemples pratiques avec Matplotlib 151
Sauvegarde et aƯichage
Le graphique est enregistré au format PNG dans le dossier f14, avec un cadrage serré (bbox_
inches=’tight’) pour éviter les marges blanches inutiles. Enfin, [Link]() a iche le graphique
à l’écran.
Résultat attendu
Une courbe rouge représentant une partie de la parabole y = x² passant par les points (0,0),
(1,1), (2,4), (3,9), (4,16) et (5,25), le tout sur un fond beige clair avec une grille discrète.
Ce code Python (figure 2) génère deux graphiques côte à côte : le premier représente les
nombres entiers de 0 à 5 élevés au carré, le second les mêmes nombres entiers élevés au
cube.
Figure n°2
abscisses = [0 1 2 3 4 5]
ordonnees_eq1 = [ 0 1 4 9 16 25]
ordonnees_eq2 = [ 0 1 8 27 64 125]
Avec ce code, on génère deux graphiques côte à côte : le premier graphique côté gauche
représente les nombres entiers de 0 à 5 élevés au carré, et le second graphique côté droit les
mêmes nombres entiers élevés au cube.
Exemples pratiques avec Matplotlib 153
[Link]({
‘[Link]’:’Roboto Condensed’,
‘[Link]’:’14’
})
Cette instruction définit les paramètres globaux : la police Roboto Condensed et une taille de
texte par défaut de 14 points.
Ici, on crée une figure divisée en 1 ligne et 2 colonnes par (1,2), ce qui produit deux zones
de tracé côte à côte. La variable axes est un tableau contenant les deux sous-graphiques :
axes[0] à gauche et axes[1] à droite. La figure mesure 15×5 pouces, avec un fond oldlace et
une résolution de 300 dpi.
Sauvegarde et aƯichage
La figure complète (incluant les deux sous-graphiques) est enregistrée au format PNG dans le
dossier f14, avec un cadrage serré. Enfin, [Link]() a iche le résultat à l’écran.
Exemples pratiques avec Matplotlib 155
Résultat attendu
Ce code Python trace deux courbes superposées sur un même graphique (figure 3) : les
nombres entiers de 0 à 5 élevés au carré (en rouge) et au cube (en vert).
Figure n°3
print("ordonnees_eq1 ",ordonnees_eq1
# y contient les carrés y = x**3
ordonnees_eq2 abscisses ** 3
print("ordonnees_eq2 ",ordonnees_eq2
# graphique
[Link]({
‘[Link]’:’Roboto Condensed’,
‘[Link]’:’14’
})
# Afficher le graphique avec x & y
fig, ax = [Link](1,1,figsize=(15,8,facecolor=’oldlace’,dpi=300
[Link](abscisses, ordonnees_eq1, color=’red’, lw=2.0, label=’équation y = x^2’)
[Link](abscisses, ordonnees_eq2, color=’green’, lw=2.0, label=’équation y = x^3’)
ax.set_xlabel(‘Nombre entier’)
ax.set_ylabel(‘Nombre entier élevé au carré et au cube’)
ax.set_yticks(range(0, 151, 10
[Link](loc=’upper left’,facecolor=’whitesmoke’,edgecolor=’black’,labelcolor=’blue’)
[Link](True,color=’gray’,alpha=0.3
ax.set_title(‘Graphique des nombres entiers (0 à 5 élevé au carré et au cube’,fontsize=22,
fontweight=’bold’,y=1.02
[Link]("f14/graphique_03.png",facecolor=’oldlace’,bbox_inches=’tight’,dpi=300
[Link]()
abscisses = [0 1 2 3 4 5]
ordonnees_eq1 = [ 0 1 4 9 16 25]
ordonnees_eq2 = [ 0 1 8 27 64 125]
Ce code Python trace deux courbes superposées sur un même graphique : les nombres
entiers de 0 à 5 élevés au carré (en rouge) et au cube (en vert).
[Link]({
‘[Link]’:’Roboto Condensed’,
‘[Link]’:’14’
})
Cette instruction définit les paramètres globaux : la police Roboto Condensed et une taille de
texte par défaut de 14 points.
Création de la figure
fig, ax = [Link](1,1,figsize=(15,8,facecolor=’oldlace’,dpi=300
On crée une figure contenant un seul graphique par (1,1), de dimensions 15×8 pouces, avec
un fond oldlace et une résolution de 300 dpi.
Point important - Contrairement à l’exemple précédent avec deux sous-graphiques, ici ax est
une seule zone de tracé unique (et non un tableau). On y ajoutera les deux courbes l’une par-
dessus l’autre.
La méthode plot() est appelée deux fois sur le même axe ax. C’est le principe de la superposition
dans laquelle chaque appel ajoute une nouvelle courbe sans e acer la précédente :
• La première courbe est rouge pour y = x² .
• La seconde courbe est verte pour y = x³ .
Les deux label alimenteront automatiquement la légende.
ax.set_xlabel(‘Nombre entier’)
158 Exemples pratiques avec Matplotlib
L’axe horizontal est étiqueté Nombre entier et l’axe vertical reçoit une étiquette combinée,
puisqu’il représente à la fois les carrés et les cubes.
Cette ligne est nouvelle par rapport aux exemples précédents. La méthode set_yticks() impose
les graduations de l’axe Y : range(0, 151, 10) génère les valeurs [0, 10, 20, 30, ..., 150], soit une
graduation tous les 10 unités, de 0 à 150. Cela permet une lecture plus précise, d’autant plus
utile que les cubes montent jusqu’à 125.
Légende et grille
La légende est placée en haut à gauche. Elle a ichera automatiquement les deux équations
avec leurs couleurs respectives, ce qui permet de distinguer visuellement les deux courbes.
Une grille grise semi-transparente facilite la lecture des valeurs.
Titre du graphique
Le titre, en gras et de taille 22, est placé au-dessus du graphique. Le paramètre y=1.02 le
décale légèrement vers le haut pour laisser un peu d’espace respirable entre le titre et la zone
de tracé.
Sauvegarde et aƯichage
# affichage
[Link]("f14/graphique_03.png", facecolor=’oldlace’, bbox_inches=’tight’, dpi=300
[Link]()
Le graphique est enregistré au format PNG dans le dossier f14 avec un cadrage serré, puis
a iché à l’écran via [Link]().
Exemples pratiques avec Matplotlib 159
Résultat attendu
4 - Options d’apparence
Dans ce paragraphe, on trace deux courbes stylisées sur un même graphique (figure 4), avec
des marqueurs personnalisés, un style de trait di érent pour chaque équation, et une grille
avec un motif de tirets particulier.
Figure n°4
print("abscisses =",abscisses)
# y contient les carrés y = x**2
ordonnees_eq1 abscisses ** 2
print("y = x**2 ordonnees_eq1 ",ordonnees_eq1
# y contient les carrés y = x**3 10
ordonnees_eq2 abscisses ** 3 10
print("y = x**3 10 ordonnees_eq2 ",ordonnees_eq2
# graphique
[Link]({
‘[Link]’:’Roboto Condensed’, ‘[Link]’:’14’
})
# Afficher le graphique avec x & y
fig, ax = [Link](1,1,figsize=(15,8,facecolor=’oldlace’,dpi=300
[Link](abscisses, ordonnees_eq1, color=’red’, lw=2.0, label=’équation y = x^2’,
marker=’o’, markersize=12, markerfacecolor=’red’,
markeredgecolor=’black’, markeredgewidth=1.0
[Link](abscisses, ordonnees_eq2, color=’green’, lw=3.0, ls=’--’, label=’équation y = x^3 10’,
marker=’^’, markersize=12, markerfacecolor=’lime’,
markeredgecolor=’purple’, markeredgewidth=1.0
ax.set_xlabel(‘Nombre entier’)
ax.set_ylabel(‘Résultat de l\’équation’)
ax.set_yticks(range(0, 151, 10
[Link](loc=’upper left’,facecolor=’white’,edgecolor=’black’,labelcolor=’blue’)
[Link](True,color=’black’,alpha=0.3, dashes=(5, 2, 1, 2
ax.set_facecolor(‘whitesmoke’)
ax.set_title(‘Graphique des nombres entiers (0 à 5 selon deux équations spécifiques’,fontsize=22,
fontweight=’bold’,y=1.02
[Link]("f14/graphique_04.png",facecolor=’oldlace’,bbox_inches=’tight’,dpi=300
[Link]()
abscisses = [0 1 2 3 4 5]
y = x**2 : ordonnees_eq1 = [ 0 1 4 9 16 25]
y = x**3 +10 : ordonnees_eq2 = [ 10 11 18 37 74 135]
Ce code Python trace deux courbes stylisées sur un même graphique, avec des marqueurs
personnalisés, un style de trait di érent pour chaque équation, et une grille avec un motif de
tirets particulier.
Exemples pratiques avec Matplotlib 161
[Link]({
‘[Link]’:’Roboto Condensed’,
‘[Link]’:’14’
})
Cette instruction définit les paramètres globaux : la police Roboto Condensed et une taille de
texte par défaut de 14 points.
Création de la figure
fig, ax = [Link](1,1,figsize=(15,8,facecolor=’oldlace’,dpi=300
On crée une figure contenant un seul graphique par (1,1), de dimensions 15×8 pouces, avec
un fond oldlace et une résolution de 300 dpi.
Cette ligne trace la parabole rouge, mais avec plusieurs nouveautés visuelles :
162 Exemples pratiques avec Matplotlib
Étiquettes et graduations
ax.set_xlabel(‘Nombre entier’)
ax.set_ylabel(‘Résultat de l\’équation’)
ax.set_yticks(range(0, 151, 10
L’axe X est étiqueté Nombre entier et l’axe Y reçoit une étiquette générique (Résultat de
l’équation) adaptée au fait que deux équations di érentes sont tracées. Notez l’utilisation de \’
pour échapper l’apostrophe à l’intérieur de la chaîne délimitée par des apostrophes simples.
La méthode set_yticks() impose des graduations tous les 10 unités, de 0 à 150.
La légende est placée en haut à gauche, avec un fond blanc pur cette fois (au lieu de
Exemples pratiques avec Matplotlib 163
whitesmoke). La nouveauté principale concerne la grille avec le paramètre dashes=(5, 2, 1, 2)
qui définit un motif de tirets complexe, à lire par paires (trait, espace) :
• 5 pixels de trait, puis 2 pixels d’espace.
• 1 pixel de trait, puis 2 pixels d’espace.
• … et le motif se répète.
Cela produit une grille avec un motif alternant trait long / trait court (type tiret-point), plus
ra iné qu’une grille classique en pointillés.
ax.set_facecolor(‘whitesmoke’)
Cette ligne est nouvelle car elle définit la couleur de fond à l’intérieur de la zone de tracé en
whitesmoke (gris très clair). Il faut bien distinguer deux fonds di érents :
• fig avec facecolor=’oldlace’ : le fond autour du graphique (beige clair).
• ax.set_facecolor(‘whitesmoke’) : le fond du rectangle de tracé lui-même (gris très clair).
Ce contraste subtil met en valeur la zone où se trouvent les courbes.
Le titre en gras est décalé légèrement vers le haut (y=1.02). Le graphique est enregistré en PNG
dans le dossier f14, puis a iché.
Résultat attendu
import pandas as pd
import numpy as np
from faker import Faker
import [Link] as plt
generateur_faker = Faker("fr_FR")
[Link](42)
[Link](42)
print(f"Locale de Faker : {generateur_faker.locales}")
return dataframe_resultat
# test
df_ventes_glace = generer_ventes_glace(nombre_lignes=100
print(df_ventes_glace)
temperature nombre_glace
0 45 433
1 28 165
2 25 138
3 33 284
4 32 224
.. ... ...
95 33 209
96 27 160
97 31 221
98 43 402
99 35 271
On e ectue un tri par ordre croissant des valeurs contenues dans la colonne temperature.
temperature nombre_glace
2 25 138
29 25 122
19 25 122
13 25 122
45 26 122
.. ... ...
78 45 433
75 45 433
53 45 433
22 45 433
0 45 433
[[ 25 138]
[ 25 122]
[ 25 122]
[ 25 122]
[ 26 122]
[ 26 161]
[ 26 139]
[ 26 122]
[ 26 143]
[ 27 161]
...
[ 44 409]
[ 44 433]
[ 44 394]
[ 45 433]
[ 45 433]
[ 45 433]
[ 45 433]
[ 45 433]
[ 45 433]
[ 45 433]]
La conversion
tab_trier_temperature = df_trier_temperature.values
L’attribut values appliqué à un DataFrame Pandas renvoie les données brutes sous forme de
tableau NumPy à deux dimensions (ndarray). Autrement dit, on extrait le contenu chi ré du
tableau Pandas sans conserver :
• Les noms de colonnes (l’en-tête).
• L’index (la première colonne de numérotation des lignes).
Seules les valeurs sont conservées, organisées en lignes et colonnes.
168 Exemples pratiques avec Matplotlib
L’aƯichage
print(tab_trier_temperature)
Cette instruction a iche le tableau NumPy dans la console. La présentation est plus sobre
que celle d’un DataFrame Pandas : pas de mise en forme tabulaire avec en-têtes, juste les
valeurs entre crochets.
À noter
L’attribut values est la méthode historique, mais Pandas recommande désormais d’utiliser
to_numpy() qui fait exactement la même chose de manière plus explicite.
tab_trier_temperature = df_trier_temperature.to_numpy()
Les deux écritures produisent un résultat identique dans la grande majorité des cas.
On poursuit avec ce code qui extrait deux colonnes distinctes d’un tableau NumPy à deux
dimensions pour les séparer en deux variables : l’une pour l’axe horizontal, l’autre pour l’axe
vertical d’un futur graphique.
abscisses =
[25 25 25 25 26 26 26 26 26 27 27 27 27 27 27 27 27 28 28 28 28 28 28 29
29 30 30 30 30 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 33 33 33 33
Exemples pratiques avec Matplotlib 169
33 33 33 33 34 34 35 35 35 35 35 36 36 36 36 36 36 37 37 37 37 37 38 38
38 39 39 39 39 41 42 42 42 42 42 42 42 43 43 43 43 44 44 44 44 45 45 45
45 45 45 45]
ordonnees =
[138 122 122 122 122 161 139 122 143 161 161 122 122 125 160 166 155 165
187 188 122 177 187 223 204 236 184 208 150 209 221 207 254 201 184 239
255 217 233 218 205 200 224 224 180 219 244 284 209 209 231 233 245 257
271 282 277 269 290 290 331 292 276 297 316 298 288 264 342 313 310 370
312 326 310 364 328 378 350 394 380 412 376 374 422 390 411 402 380 409
409 433 394 433 433 433 433 433 433 433]
abscisses = tab_trier_temperature[:, 0]
Cette ligne utilise le slicing NumPy (découpage) avec une syntaxe particulière à deux
dimensions. Décomposons [:, 0] :
• Le caractère ":" avant la virgule signifie toutes les lignes.
• Le 0 après la virgule signifie uniquement la colonne d’indice 0 (la première colonne,
puisque NumPy commence à compter à partir de 0).
Résultat : abscisses reçoit l’intégralité de la première colonne du tableau, sous forme d’un
tableau NumPy à une seule dimension (un vecteur).
ordonnees = tab_trier_temperature[:, 1]
Sur le même principe, [:, 1] signifie toutes les lignes, colonne d’indice 1 (la deuxième colonne).
La variable ordonnees reçoit donc l’intégralité de cette seconde colonne.
Dans un tableau NumPy 2D, l’indexation suit toujours le schéma [lignes, colonnes]. Voici
quelques exemples dans le tableau ci-dessous pour bien en saisir le sens.
Syntaxe Signification
À quoi ça sert ?
Figure n°5
Exemples pratiques avec Matplotlib 171
# graphique
[Link]({
‘[Link]’:’Roboto Condensed’,
‘[Link]’:’14’
})
# Afficher le graphique avec x & y
fig, ax = [Link](1,1,figsize=(15,8,facecolor=’oldlace’,dpi=300
# graphique principal
[Link](abscisses,ordonnees,zorder=4,color=’blue’,label="ventes de glaces")
ax.set_xlabel(‘Températures’, color=’black’)
ax.set_ylabel(‘Ventes de glaces’, color=’blue’)
ax.tick_params(axis=’y’,labelcolor=’blue’)
# graphique secondaire partageant le meme X
ord_cum = [Link](ordonnees)
print("ord_cum =\n",ord_cum)
axe_secondaire = [Link]()
axe_secondaire.plot(abscisses, ord_cum, color=’red’, linewidth=3.0,
label=’Cumul des ventes de glaces’,zorder=5
axe_secondaire.set_ylabel(‘Ventes cumulées’, color=’red’)
axe_secondaire.tick_params(axis=’y’,labelcolor=’red’)
# personnalisation
[Link]("Deux graphiques partageant le même axe X",fontsize=22,fontweight=’bold’,y=0.95
[Link](True,color=’black’,alpha=0.3,zorder=0
# Afficher une legende unique sur l’un des deux axes (peu importe lequel)
# Recuperer les handles et labels de chaque axe
handles_1, labels_1 ax.get_legend_handles_labels()
handles_2, labels_2 axe_secondaire.get_legend_handles_labels()
[Link](handles_1 handles_2, labels_1 labels_2, loc=’upper left’,
facecolor=’whitesmoke’,edgecolor=’black’)
[Link]("f14/graphique_05.png",facecolor=’oldlace’,bbox_inches=’tight’,dpi=300
[Link]()
ord_cum =
[ 138 260 382 504 626 787 926 1048 1191 1352 1513 1635
1757 1882 2042 2208 2363 2528 2715 2903 3025 3202 3389 3612
3816 4052 4236 4444 4594 4803 5024 5231 5485 5686 5870 6109
6364 6581 6814 7032 7237 7437 7661 7885 8065 8284 8528 8812
9021 9230 9461 9694 9939 10196 10467 10749 11026 11295 11585 11875
172 Exemples pratiques avec Matplotlib
12206 12498 12774 13071 13387 13685 13973 14237 14579 14892 15202 15572
15884 16210 16520 16884 17212 17590 17940 18334 18714 19126 19502 19876
20298 20688 21099 21501 21881 22290 22699 23132 23526 23959 24392 24825
25258 25691 26124 26557]
C’est la grande nouveauté de ce code. Lorsqu’on veut a icher sur un même graphique deux
séries de données dont les ordres de grandeur sont très di érents, un axe Y unique devient
problématique : si les ventes individuelles valent entre 10 et 200 unités alors que le cumul
monte jusqu’à 1500 unités, alors les barres paraîtraient écrasées en bas du graphique, car
l’échelle serait dominée par les grandes valeurs du cumul.
La solution est de créer un second axe Y indépendant, à droite du graphique, avec sa propre
échelle. Les deux axes partagent uniquement l’axe X. C’est ce qu’on appelle un graphique à
axe Y jumelé (twin axis).
fig, ax = [Link](1,1,figsize=(15,8,facecolor=’oldlace’,dpi=300
[Link](abscisses, ordonnees, zorder=4, color=’blue’, label="ventes de glaces")
On crée une figure unique, puis on trace un diagramme en barres avec [Link]() (et non [Link]()
comme dans les exemples précédents). Les barres sont bleues. Le paramètre zorder=4
contrôle l’ordre d’empilement (profondeur visuelle) : plus la valeur est élevée, plus l’élément
apparaît au premier plan. Les éléments avec un zorder plus faible sont dessinés en-dessous.
ax.set_xlabel(‘Températures’, color=’black’)
ax.set_ylabel(‘Ventes de glaces’, color=’blue’)
ax.tick_params(axis=’y’, labelcolor=’blue’)
L’étiquette Y et les graduations (ticks) de l’axe Y principal sont colorées en bleu, pour établir un
lien visuel immédiat avec les barres bleues. La méthode tick_params() permet de styliser les
graduations : ici, seules les graduations de l’axe Y (axis=’y’) reçoivent la couleur bleue.
ord_cum = [Link](ordonnees)
axe_secondaire = [Link]()
C’est l’instruction clé de ce graphique. La méthode twinx() crée un nouvel axe qui partage l’axe
X avec ax, mais dispose de son propre axe Y (placé à droite du graphique par défaut).
À noter qu’il existe aussi twiny() qui fait l’inverse (même axe Y, deux axes X), utilisé plus
rarement.
La courbe rouge épaisse est tracée sur l’axe secondaire, avec zorder=5 pour qu’elle passe
devant les barres bleues (zorder=4). L’étiquette et les graduations de droite sont également en
rouge, cohérent avec la couleur de la courbe.
Titre et grille
Le titre global est placé via [Link](). La grille reçoit zorder=0 pour apparaître tout en arrière-
plan, sous les barres et la courbe.
C’est le second point technique important de ce code. Par défaut, chaque axe gère sa propre
légende. Si on appelait simplement [Link]() et axe_secondaire.legend(), on obtiendrait
deux légendes séparées, visuellement encombrantes.
facecolor=’whitesmoke’, edgecolor=’black’)
Décomposons ce mécanisme :
• get_legend_handles_labels() renvoie deux listes : les handles (les objets graphiques, ici la
barre bleue et la ligne rouge) et les labels (les textes associés).
• On récupère ces listes pour chacun des deux axes.
• On les concatène avec l’opérateur +.
• On passe les listes fusionnées à [Link]() pour créer une seule légende combinée.
Résultat : une légende unique a ichant à la fois la barre bleue ventes de glaces et la ligne
rouge Cumul des ventes de glaces, placée en haut à gauche.
Sauvegarde et aƯichage
Résultat attendu
6 - Balisage LaTeX
Dans ce paragraphe, on compose un graphique classique (figure 6), mais avec une particularité
notable : l’utilisation de la syntaxe LaTeX pour a icher des équations mathématiques joliment
formatées dans le titre, les étiquettes, la légende et même dans une boîte de texte annotée
sur le graphique.
Figure n°6
abscisses = [0 1 2 3 4 5]
ordonnees = [10 11 14 19 26 35]
Les abscisses sont [0, 1, 2, 3, 4, 5] et les ordonnées calculent y = x² + 10, soit [10, 11, 14, 19,
26, 35].
Configuration standard : police Roboto Condensed, taille 14, figure de 15×10 pouces avec
fond oldlace.
La courbe rouge est tracée avec des marqueurs circulaires bleus (dodgerblue) cerclés de noir.
Le label de la légende contient la formule $y = x^{2} + 10$ :
• Le ^ indique un exposant.
• Les accolades {2} délimitent ce qui doit être mis en exposant (ici, le chi re 2).
Résultat a iché dans la légende : équation y = x² + 10 avec un vrai 2 en exposant.
[Link](‘Graphique avec une équation écrite en LaTex \n’ + r’$y = x^2 10$’, fontsize=22,
fontweight=’bold’, y=1.01
L’étiquette Y mélange du texte standard et de la formule LaTeX dans la même chaîne. Tout ce
qui est entre $...$ est rendu en mode mathématique, le reste en texte normal. Le paramètre
labelpad=15 ajoute un espacement de 15 points entre l’étiquette et l’axe Y, pour éviter qu’elle
ne colle aux graduations.
Légende et grille
Configuration standard de la légende (haut gauche, fond whitesmoke) et d’une grille discrète.
La légende a ichera la formule LaTeX du label transmis plus haut.
C’est une nouveauté importante. La méthode [Link]() permet de placer une boîte de texte
libre n’importe où dans le graphique, avec des coordonnées précises dans le système de
l’axe. Décomposons ses paramètres :
• 0, 25 : coordonnées (x, y) du coin inférieur gauche du texte, en unités du graphique (ici
x=0, y=25).
• Le texte mélange du texte simple (équation LaTex), un retour à la ligne (\n), puis la formule
LaTeX.
• fontsize=26, color=’green’ : texte vert de grande taille.
• bbox=dict(...) : ce dictionnaire définit une boîte (bounding box) autour du texte :
facecolor=’oldlace’ est le fond beige de la boîte. alpha=1.0 spécifie une boîte totalement
opaque (1.0 = 100%). edgecolor=’blue’ spécifie un contour bleu. lw=2.0 spécifie une
épaisseur du contour de 2 pixels.
Résultat : une étiquette encadrée de bleu contenant la formule, positionnée dans la zone du
graphique au niveau (0, 25). C’est très utile pour commenter un graphique, mettre en évidence
une formule ou annoter une zone particulière.
Exemples pratiques avec Matplotlib 179
Sauvegarde et aƯichage
Résultat attendu
Un graphique avec :
• Une courbe rouge de la parabole décalée (y = x² + 10), avec des points bleus cerclés de
noir.
• Un titre sur deux lignes avec la formule mathématique bien typographiée en dessous.
• Des étiquettes d’axes rouges dont celle de Y contient la formule.
• Une boîte de texte verte encadrée de bleu en bas à gauche du graphique, rappelant
l’équation tracée.
Voici les syntaxes les plus utiles à connaître pour écrire des formules dans Matplotlib.
Syntaxe Résultat
$x^{2}$ exposant : x²
$x_{i}$ indice : x2
7 - Histogrammes
Figure n°7
[Link](42)
lancers_de_1 [Link](1, 7, 5000
lancers_de_2 [Link](1, 7, 5000
somme_lancers = lancers_de_1 lancers_de_2
Création de la figure
Figure de 12×7 pouces avec fond lavande à l’extérieur et gris clair à l’intérieur de la zone de
tracé. Ce contraste délimite visuellement la zone graphique.
# histogramme
valeurs_bins, bords_bins, patches = [Link](
somme_lancers,
bins=[Link](1.5, 13.5, 1,
184 Exemples pratiques avec Matplotlib
density=True,
color=’steelblue’,
edgecolor=’white’,
linewidth=1.5,
alpha=0.85,
zorder=3
)
palette = plt.get_cmap(‘viridis’)
valeur_max = valeurs_bins.max()
for valeur, patch in zip(valeurs_bins, patches):
patch.set_facecolor(palette(valeur / valeur_max))
Cette boucle ajoute le chi re de la densité au-dessus de chaque barre. Quelques subtilités :
• bords_bins[:-1] : on prend tous les bords sauf le dernier, puisqu’on veut un texte par barre
(et il y a n+1 bords pour n barres).
• bord_gauche + 0.5 : on décale de 0.5 vers la droite pour centrer le texte sur la barre.
• valeur + 0.006 : on place le texte légèrement au-dessus de la barre.
• f"{valeur:.3f}" : formatage à 3 décimales.
• ha=’center’, va=’bottom’ : alignement horizontal au centre et vertical sur la base du texte.
C’est un point clé pédagogique du graphique. Pour deux dés, il existe 36 combinaisons
possibles (6×6), et la probabilité de chaque somme suit une distribution triangulaire :
• Somme 2 : 1 combinaison (1+1) → 1/36
• Somme 7 : 6 combinaisons (1+6, 2+5, 3+4, 4+3, 5+2, 6+1) → 6/36
• Somme 12 : 1 combinaison (6+6) → 1/36
La courbe rouge en tirets avec des cercles à cœur blanc trace cette distribution parfaite.
Comparer les barres de l’histogramme à cette courbe permet de visualiser à quel point la
simulation se rapproche de la théorie. Avec 5000 lancers, la correspondance devrait être
excellente.
moyenne_empirique = somme_lancers.mean()
mediane_empirique = [Link](somme_lancers)
186 Exemples pratiques avec Matplotlib
La méthode axvline() (axis vertical line) trace une ligne verticale qui traverse tout le graphique.
On l’utilise ici pour marquer :
• La moyenne empirique en orange (trait plein).
• La médiane empirique en vert foncé (pointillés).
Théoriquement, pour deux dés, moyenne et médiane valent toutes deux 7. Les lignes
devraient donc se superposer très près de cette valeur centrale. Les valeurs numériques sont
directement intégrées dans les labels via la f-string (f’Moyenne = {moyenne_empirique:.2f}’).
À noter qu’il existe aussi axhline() pour les lignes horizontales.
axe.set_xticks(range(2, 13
axe.set_xlim(1.5, 12.5
[Link](True, axis=’y’, linestyle=’--’, alpha=0.4, zorder=0
axe.set_axisbelow(True)
set_xticks(range(2, 13)) impose les graduations X uniquement sur les entiers de 2 à 12. set_
xlim() fixe les limites de l’axe X, de sorte que le graphique commence exactement à 1.5 et finit
à 12.5 (bordure des barres extrêmes).
La grille est tracée uniquement sur l’axe Y (axis=’y’), en tirets discrets. set_axisbelow(True)
est une astuce importante : elle force la grille à passer sous les barres pour éviter qu’elle ne
vienne zébrer visuellement les éléments principaux.
Les spines sont les quatre bordures (haut, bas, gauche, droite) qui encadrent la zone de tracé.
Ici :
Exemples pratiques avec Matplotlib 187
• Les bordures haut et droite sont masquées (style épuré moderne, très courant en
visualisation de données).
• Les bordures gauche et bas sont épaissies (3 pixels) et colorées en rouge.
Ce choix crée un e et de L rouge qui attire le regard sur les axes de référence, tout en allégeant
visuellement l’ensemble.
Légende stylisée
Options intéressantes :
• fancybox=True : coins arrondis sur le cadre de la légende.
• shadow=True : ombre portée derrière la légende, pour un e et de relief.
• framealpha=1.0 : totalement opaque.
Sauvegarde et aƯichage
plt.tight_layout()
[Link]("f14/graphique_07.png", facecolor=’lavender’, bbox_inches=’tight’, dpi=300
[Link]()
plt.tight_layout() ajuste automatiquement les marges pour éviter que les éléments ne se
chevauchent ou ne débordent.
Résultat attendu
8 - Diagrammes en barres
C’est la grande nouveauté de ce graphique. Contrairement aux barres simples qui représentent
des valeurs indépendantes, les barres empilées décomposent une même valeur totale en
plusieurs sous-catégories. Ici, chaque barre totalise 100 % et est scindée en deux parties
pour visualiser les femmes (en bas) et les hommes (en haut). Ce type de représentation est
particulièrement e icace pour :
• Visualiser une composition (parts de chaque catégorie dans un tout).
• Comparer ces compositions entre plusieurs groupes (ici, les niveaux d’enseignement).
• Mettre en évidence des déséquilibres (ici, une féminisation marquée du métier, plus ou
moins forte selon le niveau).
Quatre niveaux d’enseignement, avec les pourcentages correspondants pour les hommes
192 Exemples pratiques avec Matplotlib
et les femmes. On remarque que chaque paire totalise bien 100 % (12+88, 20+80, etc). La
variable indices_enseignants = [Link](4) génère [0, 1, 2, 3], des positions numériques sur
l’axe X. Ces indices servent à placer les barres à intervalles réguliers. Les étiquettes textuelles
viendront les remplacer visuellement plus tard.
Création de la figure
Cette boucle place un texte blanc gras au centre de chaque segment coloré. Le calcul des
positions verticales est astucieux :
• valeur_f / 2 : pour le segment des femmes (qui va de 0 à valeur_f), le milieu vertical se situe
à moitié de cette valeur.
• valeur_f + valeur_h / 2 : pour le segment des hommes (qui va de valeur_f à valeur_f +
valeur_h), le milieu vertical se situe à valeur_f + moitié de valeur_h.
Les paramètres ha=’center’, va=’center’ (alignement horizontal et vertical) centrent le texte sur
les coordonnées fournies. La couleur blanche du texte contraste avec les fonds colorés pour
rester lisible. La fonction enumerate(zip(...)) permet d’itérer simultanément sur l’indice et sur
les deux tableaux appairés.
Cette seconde boucle ajoute Total : 100% au-dessus de chaque barre, à 2 unités au-dessus
194 Exemples pratiques avec Matplotlib
du sommet. La couleur ’gray’ est un gris foncé, une nuance élégante, moins agressive qu’un
noir pur.
Graduations personnalisées
axe.set_xticks(indices_enseignants)
axe.set_xticklabels(types_enseignants, fontsize=11, color=’navy’)
axe.set_ylim(0, 115
axe.set_yticks(range(0, 101, 20
Le remplacement des indices par des étiquettes textuelles : set_xticks() fixe les positions des
graduations (aux indices 0, 1, 2, 3), puis set_xticklabels() leur associe des libellés textuels
en bleu marine. C’est le mécanisme standard pour transformer un axe numérique en axe
catégoriel.
set_ylim(0, 115) fixe l’axe Y à la plage 0–115, laissant un peu d’espace au-dessus du 100 pour
que les annotations Total : 100% ne débordent pas.
set_yticks(range(0, 101, 20)) n’a iche les graduations que de 0 à 100, tous les 20, même si l’axe
monte jusqu’à 115. Cela évite d’a icher une graduation 120 qui serait trompeuse (puisque les
données sont des pourcentages).
[Link](0.01, 0.12,
"Données illustratives - Graphique généré avec Matplotlib",
transform=[Link], fontsize=8, style=’italic’, color=’grey’)
C’est une bonne pratique professionnelle : mentionner la source des données ou la nature du
graphique. L’utilisation de transform=[Link] place le texte en coordonnées relatives à
la zone de tracé : (0.01, -0.12) signifie légèrement à droite du bord gauche, 12 % en dessous du
bord inférieur. Le style italique gris clair et la petite taille rendent cette mention discrète sans
l’e acer complètement.
Sauvegarde et aƯichage
# affichage
plt.tight_layout()
[Link]("f14/graphique_08.png", facecolor=’oldlace’, bbox_inches=’tight’, dpi=300
[Link]()
Résultat attendu
Lecture du graphique
On observe que la profession enseignante est fortement féminisée à tous les niveaux, avec
des nuances :
• 88 % de femmes en maternelle (très féminisé).
• 80 % en élémentaire.
• 56 % au secondaire (niveau le plus équilibré, avec 44 % d’hommes).
• 86 % dans le spécialisé.
Le secondaire se distingue nettement comme le seul niveau où la proportion d’hommes
dépasse 20 %, ce qui correspond à une tendance socio-professionnelle réelle dans beaucoup
de pays.
9 - Diagrammes circulaires
C’est la grande nouveauté de ce graphique. Un donut chart est une variante du camembert
(pie chart) dans laquelle le centre est évidé. Cette simple modification apporte plusieurs
avantages :
• L’espace central libre peut accueillir une information clé (ici, le total global).
• L’aspect moderne et épuré est privilégié dans les tableaux de bord contemporains.
• La lecture se fait par la longueur d’arc plutôt que par la surface, ce qui serait en théorie
plus perceptible (même si la di érence reste débattue parmi les spécialistes de la data
viz).
Techniquement, Matplotlib ne propose pas de fonction donut() dédiée : on utilise la fonction
pie() classique avec un paramètre spécial qui évide le centre. C’est une astuce élégante.
Dix-huit types de Pokémon, chacun associé à un e ectif. Les données sont déjà triées par
200 Exemples pratiques avec Matplotlib
ordre décroissant, ce qui est une bonne pratique pour un diagramme circulaire : les plus
grosses parts apparaîtront en premier après la rotation initiale, facilitant la lecture.
couleurs_types = {
‘Eau’: ‘#6890F0’, ‘Normal’: ‘#A8A878’, ‘Vol’: ‘#A890F0’, ...
}
liste_couleurs = [couleurs_types[type_pokemon] for type_pokemon in types_pokemon]
Le dictionnaire associe chaque type à son code couleur hexadécimal o iciel issu de la
franchise. C’est une excellente pratique : les joueurs reconnaîtront instantanément le bleu
de Eau, le rouge de Combat, le jaune de Électrik, etc. Respecter les conventions visuelles d’un
univers familier améliore la lisibilité immédiate du graphique.
La compréhension de liste [couleurs_types[t] for t in types_pokemon] génère une liste de
couleurs dans le même ordre que les types. Cet ordre est crucial : Matplotlib applique les
couleurs aux parts du diagramme dans leur ordre d’apparition.
decalages = [0 * 18
decalages[0] 0.08
decalages[1] 0.04
decalages[2] 0.02
Le paramètre explode permet de détacher certaines parts du centre du camembert, pour les
mettre en valeur. Ici :
• Le type Eau (le plus nombreux) est décalé de 0.08 unité.
• Normal de 0.04.
• Vol de 0.02.
Le décalage dégressif crée un e et de hiérarchie visuelle élégant : le plus gros segment est le
plus détaché, les suivants le sont moins. Tous les autres restent collés au centre. L’initialisation
[0] * 18 crée une liste de 18 zéros, puis on modifie uniquement les trois premiers indices.
total_pokemon = sum(nombres_pokemon)
labels_legende = [f"{type_pkm} - {nb} ({nb/total_pokemon*100.1f}%)"
for type_pkm, nb in zip(types_pokemon, nombres_pokemon)]
Exemples pratiques avec Matplotlib 201
Cette compréhension de liste génère des libellés du type Eau - 133 (11.1%) combinant trois
informations en une seule ligne :
• Le nom du type.
• Le nombre absolu.
• Le pourcentage calculé dynamiquement.
Le format :.1f limite le pourcentage à une décimale. La fonction zip() permet de parcourir
simultanément les deux listes appariées.
Le diagramme en anneau
Cette boucle reformate les pourcentages en blanc gras, pour qu’ils restent lisibles sur les
couleurs variées des segments. Le blanc fonctionne bien sur la plupart des fonds colorés
saturés. Pour les segments trop clairs (comme le jaune Électrik), un contour noir autour du
texte aurait pu être ajouté pour encore plus de robustesse.
C’est la signature visuelle du donut : le trou central devient un espace d’information. Deux
textes sont superposés :
• Le nombre total (1160, la somme des e ectifs) en grand et gras.
• Le mot Pokemon en plus petit, gris et italique.
Les coordonnées (0, 0.08) et (0, -0.10) placent les textes à proximité du centre (0, 0) du
diagramme, en y décalant très légèrement pour séparer les deux lignes sans qu’elles ne se
chevauchent.
Titre et sous-titre
[Link]() ajoute le titre principal sur la figure entière (et non sur un axe spécifique),
positionné à 96 % de la hauteur.
[Link]() place un sous-titre en italique rouge juste en dessous, à 91 % de la hauteur, centré
horizontalement (x=0.5). La technique du titre + sous-titre est courante dans la presse et les
rapports professionnels pour hiérarchiser l’information.
Une seconde zone est créée à droite (de 62 % à 97 % de la largeur) pour héberger uniquement
la légende.
204 Exemples pratiques avec Matplotlib
set_axis_o () masque tous les éléments de cet axe (graduations, bordures, étiquettes)
puisqu’il ne sert qu’à contenir la légende.
Le premier argument de legend() est parts (les objets graphiques récupérés lors du pie()). C’est
essentiel : Matplotlib utilise ces objets pour dessiner les carrés de couleur de la légende, en
les associant aux libellés enrichis. Sans cela, la légende ne saurait pas à quelles couleurs
faire référence.
Les paramètres handlelength=1.5, handleheight=1.2 augmentent légèrement la taille des
rectangles de couleur dans la légende pour les rendre plus visibles. Avec 18 entrées, placer la
légende hors du graphique est indispensable : une légende à l’intérieur deviendrait illisible ou
viendrait obstruer le donut.
Mention de source
Mention discrète en bas à gauche, comme dans l’exemple précédent. Bonne pratique
professionnelle.
Sauvegarde et aƯichage
# affichage
[Link]("f14/graphique_09.png", facecolor=’lavender’, bbox_inches=’tight’, dpi=300
[Link]()
Résultat attendu
Lecture du graphique
Les trois types dominants (Eau, Normal, Vol) représentent à eux seuls environ 30 % de l’e ectif
total. La distribution est assez étalée parmi les 18 types : contrairement à certains graphiques
où une poignée de catégories écrase les autres, ici aucune ne dépasse vraiment la barre des
12 %, ce qui témoigne d’une diversité équilibrée dans la création de la franchise.
df_bourse[‘mm_30’] = df_bourse[‘cloture’].rolling(window=30.mean()
df_bourse[‘mm_90’] = df_bourse[‘cloture’].rolling(window=90.mean()
# Identification des points remarquables
indice_max = df_bourse[‘cloture’].idxmax()
indice_min = df_bourse[‘cloture’].idxmin()
prix_max = df_bourse.loc[indice_max, ‘cloture’]
prix_min = df_bourse.loc[indice_min, ‘cloture’]
date_max = df_bourse.loc[indice_max, ‘date’]
date_min = df_bourse.loc[indice_min, ‘date’]
print(f"Maximum : {prix_max:.2f} € le {date_max.strftime(‘%d/%m/%Y’)}")
print(f"Minimum : {prix_min:.2f} € le {date_min.strftime(‘%d/%m/%Y’)}")
Composition graphique
Figure n°10
couleur_cloture = ‘navy’
couleur_mm30 ‘orange’
couleur_mm90 ‘red’
figure, axe = [Link](figsize=(14, 7, dpi=300, facecolor=’lightblue’)
axe.set_facecolor(‘white’)
212 Exemples pratiques avec Matplotlib
Trois couleurs sont assignées à des variables pour garantir la cohérence entre les tracés et la
légende. La figure est large (14×7 pouces, ratio panoramique), caractéristique des graphiques
boursiers qui montrent une évolution dans le temps.
La méthode fill_between() est une nouveauté importante : elle remplit une zone entre deux
courbes (ou entre une courbe et une valeur constante). Ses paramètres :
• df_bourse[‘date’] : l’axe X (les dates).
• df_bourse[‘cloture’] : la courbe supérieure (les prix de clôture).
• df_bourse[‘cloture’].min() * 0.95 : la limite inférieure, fixée à 95 % du prix minimum (pour
laisser un peu d’espace sous la courbe).
• alpha=0.08 : une très forte transparence (8 % d’opacité), pour créer un e et d’ombre
subtile plutôt qu’une zone pleine.
Ce remplissage très discret donne du volume visuel à la courbe sans la surcharger. C’est une
technique de mise en valeur courante en visualisation de données financières.
[Link](df_bourse[‘date’], df_bourse[‘cloture’],
color=couleur_cloture, linewidth=2.0, label=’Prix de clôture’, zorder=4
[Link](df_bourse[‘date’], df_bourse[‘mm_30’], color=couleur_mm30, linewidth=2, linestyle=’--’,
label=’Moyenne mobile 30 jours’, zorder=5
[Link](df_bourse[‘date’], df_bourse[‘mm_90’], color=couleur_mm90, linewidth=2, linestyle=’:’,
label=’Moyenne mobile 90 jours’, zorder=5
Trois courbes sont superposées avec des styles de trait di érents pour faciliter la distinction :
• Prix de clôture : trait plein bleu marine.
• Moyenne mobile 30 : tirets orange.
• Moyenne mobile 90 : pointillés rouge.
Cette diversité de styles (plein, tirets, pointillés) est essentielle dans un graphique à plusieurs
courbes : elle permet de les distinguer même en impression noir et blanc ou pour des
daltoniens.
[Link].set_major_locator([Link]())
[Link].set_major_formatter([Link](‘%b %Y’))
[Link].set_minor_locator([Link](byweekday=[Link]
Le module mdates (dans [Link]) fournit des outils spécialisés pour gérer les dates
sur un axe. Trois réglages sont appliqués :
• MonthLocator() place les graduations principales tous les mois. C’est Matplotlib qui
choisit automatiquement les positions exactes en fonction de la plage de données.
• DateFormatter(‘%b %Y’) formate ces graduations au format abréviation mois / année : Jan
2026, Feb 2026, Mar 2026, etc. Le %b donne l’abréviation à 3 lettres du mois, %Y l’année
sur 4 chi res.
• WeekdayLocator(byweekday=[Link]) ajoute des graduations secondaires tous les
lundis. Ces graduations mineures, invisibles par défaut, apparaîtront grâce à la grille à
deux niveaux configurée plus bas.
Cette double granularité (mois en principal, semaines en mineur) est caractéristique des
214 Exemples pratiques avec Matplotlib
graphiques boursiers : elle permet de situer rapidement une date à l’échelle mensuelle, tout
en gardant un repère hebdomadaire plus fin.
[Link]() (set properties) est une fonction utilitaire qui applique des propriétés à plusieurs
objets d’un coup. Ici, elle :
• Récupère toutes les étiquettes de l’axe X.
• Leur applique une rotation de 30°.
• Les aligne à droite (ha=’right’) pour que la fin du texte reste près de sa graduation.
• Fixe une taille de 12.
La rotation évite que les dates Jan 2026, Feb 2026, etc ne se chevauchent sur un axe étroit.
Bordures stylisées
Les bordures haut et droite sont masquées (style épuré), tandis que les bordures gauche et
bas sont rouges épaisses, créant un cadre en L qui structure visuellement la zone de tracé.
Légende soignée en haut à gauche, avec coins arrondis, ombre portée, et surtout un titre
Indicateurs mis en gras via get_title().set_fontweight(‘bold’). Les trois séries (prix, MM 30, MM
90) y apparaissent avec leurs couleurs et styles respectifs.
• L’alignement monospace : les chaînes utilisent des espaces manuels après Cloture pour
aligner verticalement les deux-points avec Ouverture. C’est ce qui justifie le choix de la
police monospace ci-dessous.
L’encadré est placé en bas à droite (coordonnées relatives 0.985, 0.04), encadré de bleu, en
police monospace pour garantir l’alignement des chi res en colonnes.
[Link](0.02, 0.02,
"Données simulées avec Faker (fr_FR Graphique généré avec Matplotlib",
fontsize=12, style=’italic’, color=’grey’)
plt.tight_layout()
[Link]("f14/graphique_10.png", facecolor=’lightblue’, bbox_inches=’tight’, dpi=300
[Link]()
Résultat attendu
Figure n°11
# Formatage des valeurs (dates en JJ/MM/AAAA, prix avec €, volume avec espaces)
donnees_extraites[‘date’] = donnees_extraites[‘date’].[Link](‘%d/%m/%Y’)
donnees_extraites[‘ouverture’] = donnees_extraites[‘ouverture’].map(lambda valeur: f’{valeur:.2f} €’)
donnees_extraites[‘haut’] = donnees_extraites[‘haut’].map(lambda valeur: f’{valeur:.2f} €’)
donnees_extraites[‘bas’] = donnees_extraites[‘bas’].map(lambda valeur: f’{valeur:.2f} €’)
donnees_extraites[‘cloture’] = donnees_extraites[‘cloture’].map(lambda valeur: f’{valeur:.2f} €’)
donnees_extraites[‘volume’] = donnees_extraites[‘volume’].map(lambda valeur: f’{valeur:,}’.replace(‘,’, ‘ ‘))
print("⇒ donnees_extraites =\n",donnees_extraites)
entetes_colonnes = [‘Date’, ‘Ouverture’, ‘Plus haut’, ‘Plus bas’, ‘Cloture’, ‘Volume’]
valeurs_tableau = donnees_extraites.[Link]()
print("⇒ valeurs_tableau =\n",valeurs_tableau)
# CREATION DE LA FIGURE 300 DPI
figure, axe = [Link](figsize=(12, 5, dpi=300, facecolor=’oldlace’)
axe.set_axis_off()
# Palette de couleurs
couleur_entete = ‘navy’
couleur_ligne_paire = ‘whitesmoke’
couleur_ligne_impaire = ‘lightgrey’
# Creation du tableau
tableau = [Link](
cellText=valeurs_tableau,
colLabels=entetes_colonnes,
Exemples pratiques avec Matplotlib 219
loc=’center’,
cellLoc=’center’,
colLoc=’center’
)
# Dimensionnement manuel
tableau.auto_set_font_size(False)
tableau.set_fontsize(11)
[Link](1, 2.2
# Stylisation des en-tetes (ligne 0
for colonne_index in range(len(entetes_colonnes)):
cellule_entete = tableau[0, colonne_index]
cellule_entete.set_facecolor(couleur_entete)
cellule_entete.set_text_props(color=’white’, fontweight=’bold’, fontsize=14
cellule_entete.set_edgecolor(‘red’)
cellule_entete.set_linewidth(2)
cellule_entete.set_height(0.12)
# Stylisation des lignes de donnees en zebra
for ligne_index in range(1, len(valeurs_tableau) + 1):
for colonne_index in range(len(entetes_colonnes)):
cellule = tableau[ligne_index, colonne_index]
if ligne_index % 2 0
cellule.set_facecolor(couleur_ligne_paire)
else:
cellule.set_facecolor(couleur_ligne_impaire)
cellule.set_edgecolor(‘darkgrey’)
cellule.set_linewidth(0.8)
cellule.set_text_props(color=’black’, fontfamily=’monospace’)
# Mise en evidence de la colonne Cloture (valeur cle)
indice_colonne_cloture = entetes_colonnes.index(‘Cloture’)
for ligne_index in range(1, len(valeurs_tableau) + 1):
cellule_cloture = tableau[ligne_index, indice_colonne_cloture]
cellule_cloture.set_text_props(color=’blue’, fontweight=’bold’, fontfamily=’monospace’)
# Titre
[Link]("Cours boursier (les 10 derniers jours cotés)",
fontsize=22, fontweight=’bold’, y=0.95, color=’navy’)
# Sous-titre
[Link](0.5, 0.86,
220 Exemples pratiques avec Matplotlib
=> donnees_extraites =
date ouverture haut bas cloture volume
251 18/12/2026 164.38 € 167.03 € 166.44 € 166.73 € 2 182 084
252 21/12/2026 166.73 € 173.38 € 171.04 € 172.21 € 745 934
253 22/12/2026 172.21 € 175.74 € 174.22 € 174.98 € 1 190 538
254 23/12/2026 174.98 € 172.09 € 170.15 € 171.12 € 2 089 528
255 24/12/2026 171.12 € 170.60 € 169.32 € 169.96 € 509 040
256 25/12/2026 169.96 € 174.58 € 172.03 € 173.31 € 2 137 547
257 28/12/2026 173.31 € 171.68 € 171.43 € 171.56 € 1 612 342
258 29/12/2026 171.56 € 173.76 € 171.81 € 172.79 € 2 408 443
259 30/12/2026 172.79 € 177.08 € 172.70 € 174.89 € 1 696 421
260 31/12/2026 174.89 € 173.26 € 171.85 € 172.56 € 2 274 221
=> valeurs_tableau =
[[‘18/12/2026’, ‘164.38 €’, ‘167.03 €’, ‘166.44 €’, ‘166.73 €’, ‘2 182 084’],
[‘21/12/2026’, ‘166.73 €’, ‘173.38 €’, ‘171.04 €’, ‘172.21 €’, ‘745 934’],
[‘22/12/2026’, ‘172.21 €’, ‘175.74 €’, ‘174.22 €’, ‘174.98 €’, ‘1 190 538’],
[‘23/12/2026’, ‘174.98 €’, ‘172.09 €’, ‘170.15 €’, ‘171.12 €’, ‘2 089 528’],
[‘24/12/2026’, ‘171.12 €’, ‘170.60 €’, ‘169.32 €’, ‘169.96 €’, ‘509 040’],
[‘25/12/2026’, ‘169.96 €’, ‘174.58 €’, ‘172.03 €’, ‘173.31 €’, ‘2 137 547’],
[‘28/12/2026’, ‘173.31 €’, ‘171.68 €’, ‘171.43 €’, ‘171.56 €’, ‘1 612 342’],
[‘29/12/2026’, ‘171.56 €’, ‘173.76 €’, ‘171.81 €’, ‘172.79 €’, ‘2 408 443’],
[‘30/12/2026’, ‘172.79 €’, ‘177.08 €’, ‘172.70 €’, ‘174.89 €’, ‘1 696 421’],
[‘31/12/2026’, ‘174.89 €’, ‘173.26 €’, ‘171.85 €’, ‘172.56 €’, ‘2 274 221’]]
C’est la grande nouveauté de ce code. Matplotlib est avant tout une bibliothèque de tracés
graphiques, mais elle propose aussi une fonction table() permettant de dessiner un tableau
dans une figure. Cette approche présente plusieurs avantages :
• Produire un tableau image haute résolution (300 dpi) directement exploitable dans un
rapport, une présentation ou une publication.
Exemples pratiques avec Matplotlib 221
• Appliquer une mise en forme visuelle riche (couleurs, polices, bordures) que ne
permettent pas toujours les outils bureautiques classiques.
• Combiner tableaux et graphiques dans une même figure, pour des tableaux de bord
cohérents
À noter que pour une manipulation interactive (tri, filtrage), un vrai DataFrame reste préférable.
Mais pour un rendu visuel figé, cette méthode est élégante.
nombre_lignes_affichees = 10
donnees_extraites = df_bourse.tail(nombre_lignes_affichees).drop(columns=[‘mm_30’, ‘mm_90’]).copy()
donnees_extraites[‘date’] = donnees_extraites[‘date’].[Link](‘%d/%m/%Y’)
donnees_extraites[‘ouverture’] = donnees_extraites[‘ouverture’].map(lambda valeur: f’{valeur:.2f} €’)
donnees_extraites[‘haut’] = donnees_extraites[‘haut’].map(lambda valeur: f’{valeur:.2f} €’)
donnees_extraites[‘bas’] = donnees_extraites[‘bas’].map(lambda valeur: f’{valeur:.2f} €’)
donnees_extraites[‘cloture’] = donnees_extraites[‘cloture’].map(lambda valeur: f’{valeur:.2f} €’)
donnees_extraites[‘volume’] = donnees_extraites[‘volume’].map(lambda valeur: f’{valeur:,}’.replace(‘,’, ‘ ‘))
Cette étape convertit les valeurs numériques en chaînes de caractères formatées. Plusieurs
techniques intéressantes :
• [Link](‘%d/%m/%Y’) : l’accesseur dt donne accès aux méthodes de manipulation de
dates Pandas. strftime() (string format time) convertit chaque date en chaîne au format
jour/mois/année.
• map(lambda valeur: f’{valeur:.2f} €’) : la méthode map() applique une fonction à chaque
valeur d’une colonne. La fonction lambda transforme le nombre en chaîne à 2 décimales
suivi du symbole €. Exemple : 123.456 devient ’123.46 €’.
Le format f’{valeur:,}’.replace(‘,’, ‘ ‘) mérite une attention particulière. Le format :, insère une
virgule comme séparateur de milliers (convention anglo-saxonne), donc 1234567 devient
222 Exemples pratiques avec Matplotlib
’1,234,567’. Le replace(‘,’, ‘ ‘) remplace ensuite ces virgules par des espaces insécables,
respectant la convention typographique française (1 234 567). C’est une astuce classique en
Python pour obtenir le format français des nombres.
Les en-têtes sont définis manuellement en français (avec des libellés plus lisibles que les
noms techniques du DataFrame). donnees_extraites.[Link]() convertit le DataFrame en
liste de listes Python. Chaque sous-liste représente une ligne. C’est le format attendu par la
fonction table() de Matplotlib.
axe.set_axis_o () est une instruction importante : elle masque complètement l’axe (bordures,
graduations, étiquettes). Le tableau deviendra le seul contenu visible de la zone. Sans cela,
des axes vides encadreraient le tableau, visuellement disgracieux.
couleur_entete = ‘navy’
couleur_ligne_paire = ‘whitesmoke’
couleur_ligne_impaire = ‘lightgrey’
Trois couleurs sont définies à l’avance pour garantir la cohérence et faciliter les modifications
ultérieures. C’est une bonne pratique : si on veut changer la charte graphique, il su it de
modifier ces trois variables au lieu de chercher les couleurs dans tout le code.
Création du tableau
tableau = [Link](
cellText=valeurs_tableau,
colLabels=entetes_colonnes,
loc=’center’,
cellLoc=’center’,
Exemples pratiques avec Matplotlib 223
colLoc=’center’
)
Dimensionnement manuel
tableau.auto_set_font_size(False)
tableau.set_fontsize(11)
[Link](1, 2.2
Cette boucle parcourt les cellules de la ligne 0 (les en-têtes) et leur applique un style distinct :
• tableau[ligne, colonne] permet d’accéder individuellement à une cellule du tableau,
comme avec une matrice. C’est la clé pour personnaliser finement chaque cellule.
• set_facecolor() : fond bleu marine pour les en-têtes.
• set_text_props() : propriétés du texte regroupées dans un seul appel, blanc, gras, taille 14
224 Exemples pratiques avec Matplotlib
C’est l’e et zébrure (zebra striping), une technique classique de lisibilité. Le principe : alterner
deux couleurs de fond entre les lignes paires et impaires pour guider l’œil horizontalement et
éviter les erreurs de lecture sur les grandes lignes.
ligne_index % 2 == 0 : le modulo 2 teste si l’indice est pair. La double boucle parcourt toutes les
cellules de toutes les lignes de données (sautant la ligne 0 des en-têtes).
fontfamily=’monospace’ : les valeurs sont a ichées en police à chasse fixe, ce qui aligne
verticalement les chi res (points décimaux, symboles €, espaces de séparation des milliers).
C’est indispensable pour un tableau numérique lisible. Sans monospace, les chi res seraient
décalés selon leur largeur (le 1 étant plus étroit que le 8 par exemple), rendant la comparaison
colonne par colonne plus di icile.
indice_colonne_cloture = entetes_colonnes.index(‘Cloture’)
for ligne_index in range(1, len(valeurs_tableau) + 1):
cellule_cloture = tableau[ligne_index, indice_colonne_cloture]
cellule_cloture.set_text_props(color=’blue’, fontweight=’bold’, fontfamily=’monospace’)
Titre et sous-titre
Le titre principal est en bleu marine, cohérent avec la couleur des en-têtes. Le sous-titre est
dynamique : il utilise les premières et dernières dates du tableau pour former un texte du
type Extrait du 01/12/2026 au 10/12/2026. Cela contextualise automatiquement l’extrait sans
nécessiter de modification manuelle à chaque exécution.
[Link](0.02, 0.0,
"Données simulées avec Faker (fr_FR Tableau généré avec Matplotlib",
fontsize=12, style=’italic’, color=’darkgrey’)
plt.tight_layout()
[Link]("f14/graphique_11.png", facecolor=’oldlace’, bbox_inches=’tight’, dpi=300
[Link]()
Résultat attendu
12 - Nuages de points
Figure n°12
C’est la grande nouveauté de ce graphique. Un scatter plot classique représente deux variables
(X et Y), mais Matplotlib permet d’y ajouter deux dimensions supplémentaires via :
• La taille des marqueurs (paramètre s).
• La couleur des marqueurs (paramètre c couplé à une palette cmap).
Ce type de visualisation, parfois appelé bulle (bubble chart), est précieux en analyse exploratoire
quand on cherche à détecter des relations entre plusieurs variables simultanément. Il est
particulièrement adapté aux comparaisons entre entités (pays, entreprises, produits) où
chaque point représente une unité distincte.
Quatre tableaux parallèles contiennent les données : le nom du pays, son taux de mortalité,
son nombre de tests quotidiens et son total de cas confirmés. Chaque indice (0, 1, 2…)
correspond à un même pays dans les quatre tableaux. Cette structure est essentielle pour
que les coordonnées, tailles et couleurs restent cohérentes.
C’est une étape technique importante. Les cas confirmés varient de quelques milliers à
plusieurs millions : on ne peut pas utiliser ces chi res bruts comme tailles de marqueurs, car
un point de 5 529 824 pixels serait absurde. La normalisation min-max (deux premières lignes
du calcul) ramène toutes les valeurs dans l’intervalle [0, 1] :
• La valeur minimale devient 0.
• La valeur maximale devient 1.
• Les autres valeurs sont réparties proportionnellement entre ces deux bornes.
La dénormalisation (troisième ligne) transforme ensuite ces valeurs normalisées vers
l’intervalle visuellement exploitable [50, 2000]. Ainsi, le pays avec le moins de cas a ichera
un marqueur de 50 unités, celui avec le plus de cas un marqueur de 2000 unités, et les autres
seront dimensionnés proportionnellement.
À retenir : cette technique de normalisation min-max est un réflexe utile dans toutes les
visualisations où une variable doit être mappée sur une plage visuelle (taille, couleur, opacité,
épaisseur, etc).
Création de la figure
Figure large (14×9 pouces) pour accueillir de nombreux points et annotations sans
encombrement.
232 Exemples pratiques avec Matplotlib
nuage_points = [Link](
tableau_mortalite, tableau_tests,
s=tailles_points,
c=tableau_mortalite,
cmap=’YlOrRd’,
alpha=0.75,
edgecolors=’black’,
linewidths=1.2,
zorder=4
)
La colorbar est un élément essentiel quand on utilise cmap : sans elle, le lecteur ne saurait
pas à quelle valeur correspond chaque nuance de couleur. Elle est générée automatiquement
à partir de l’objet nuage_points et placée à droite du graphique :
• pad=0.02 : espacement entre le graphique et la barre de 2 % de la largeur.
• shrink=0.85 : la barre n’occupe que 85 % de la hauteur, ce qui évite un e et d’écrasement
visuel.
indices_top_cas = [Link](tableau_cas_confirmes)[-5:]
indice_max_mortalite = [Link](tableau_mortalite)
indice_max_tests = [Link](tableau_tests)
indices_a_annoter = set(indices_top_cas.tolist() + [indice_max_mortalite, indice_max_tests])
Avec 26 pays, annoter chaque point rendrait le graphique illisible. La solution : annoter
uniquement les points remarquables.
[Link](tableau_cas_confirmes)[-5:] est une technique courante :
• argsort() renvoie les indices qui trieraient le tableau (pas les valeurs triées elles-mêmes).
• [-5:] prend les 5 derniers, correspondant aux 5 valeurs les plus élevées.
[Link]() renvoie directement l’indice de la valeur maximum.
set(...) convertit la liste en ensemble pour éliminer les doublons : un pays peut apparaître à
la fois dans le top 5 et avoir aussi la mortalité maximum, auquel cas on ne veut pas l’annoter
deux fois.
La boucle annotate() place une bulle blanche encadrée à proximité de chaque pays
remarquable, décalée de 10 pixels en haut à droite du point. Cette technique d’annotation
sélective est essentielle pour conserver la lisibilité dans un graphique dense.
234 Exemples pratiques avec Matplotlib
mediane_mortalite = [Link](tableau_mortalite)
mediane_tests = [Link](tableau_tests)
[Link](mediane_mortalite, color=’orange’, linestyle=’--’, linewidth=2.0, alpha=0.6, zorder=2
[Link](mediane_tests, color=’orange’, linestyle=’--’, linewidth=2.0, alpha=0.6, zorder=2
Les deux lignes médianes (une verticale, une horizontale) divisent le graphique en quatre
quadrants, technique classique en analyse exploratoire :
• En haut à droite : pays à mortalité et tests élevés.
• En bas à droite : pays à mortalité élevée mais peu de tests (situation préoccupante).
• En haut à gauche : pays à faible mortalité et beaucoup de tests (situation enviable).
• En bas à gauche : pays à faible mortalité et peu de tests.
Cette segmentation visuelle aide à identifier des profils pays.
Un texte pivoté à 90° (rotation=90) annote la ligne verticale. axe.get_ylim()[1] récupère la valeur
maximale de l’axe Y pour placer le texte en haut de la ligne, le multiplicateur 0.98 laissant une
petite marge avec le bord supérieur.
axe.set_yscale(‘log’)
C’est un choix crucial dans ce graphique. L’axe Y représente les tests quotidiens, qui varient de
8 à 24 988, soit près de 4 ordres de grandeur. Sur une échelle linéaire, les petits pays (Islande :
10 tests) seraient écrasés au bas du graphique, indiscernables les uns des autres, tandis que
les États-Unis domineraient tout.
L’échelle logarithmique compresse les grandes valeurs et étire les petites : chaque graduation
représente une multiplication par 10 (10, 100, 1000, 10 000). Résultat : la dispersion entre
pays devient lisible à toutes les échelles.
Quand utiliser une échelle log ?
• Quand les données couvrent plusieurs ordres de grandeur (facteur 100, 1000 ou plus).
• Quand les variations relatives importent plus que les variations absolues (passer de 10 à
100 est équivalent à passer de 1000 à 10 000 en termes de croissance).
Exemples pratiques avec Matplotlib 235
• En finance, démographie, biologie, sismologie, où les phénomènes sont souvent
multiplicatifs.
• Précaution : une échelle logarithmique trompe facilement un lecteur non averti. Il faut
impérativement l’indiquer dans le titre de l’axe, comme ici (échelle log).
Configuration standard : titre, labels d’axes, grille à deux niveaux (majeure et mineure).
L’échelle logarithmique active automatiquement des graduations mineures (les valeurs 20,
30, 40… entre 10 et 100 par exemple), utiles pour lire finement les valeurs.
C’est une technique avancée. Par défaut, Matplotlib ne produit pas de légende pour les tailles
variables, la colorbar documente la couleur, mais rien ne documente la taille. Il faut donc
fabriquer manuellement des entrées de légende.
L’astuce : on trace des scatters invisibles ([], [] comme coordonnées, donc aucun point
tracé) avec des tailles calibrées sur des valeurs de référence (100 000, 1 million, 5 millions
de cas). Ces scatters vides servent uniquement d’échantillons visuels pour la légende. La
séparation des milliers en format français (replace(‘,’, ‘ ‘)) est à nouveau utilisée pour respecter
la convention typographique.
236 Exemples pratiques avec Matplotlib
La légende est placée sous le graphique via bbox_to_anchor, sur 3 colonnes pour a icher
les trois tailles de référence côte à côte. Le paramètre labelspacing=2.5 et borderpad=2.5
augmentent les espacements internes, car les cercles de référence sont volumineux et ont
besoin d’air autour d’eux.
Encadré statistique
Sauvegarde et aƯichage
# affichage
plt.tight_layout()
[Link]("f14/graphique_12.png", facecolor=’oldlace’, bbox_inches=’tight’, dpi=300
[Link]()
Résultat attendu
Lecture du graphique
13 - Surface 3D
Dans ce paragraphe, on compose une surface tridimensionnelle (figure 13) représentant une
fonction mathématique à symétrie radiale, enrichie de projections de contours sur les trois
plans (sol et deux murs) pour mieux appréhender sa géométrie. C’est un exemple typique de
visualisation 3D scientifique.
Figure n°13
240 Exemples pratiques avec Matplotlib
C’est la grande nouveauté de ce graphique. Jusqu’ici tous les exemples étaient en 2D.
Matplotlib propose le module dédié mpl_toolkits.mplot3d permettant de tracer des objets
dans un espace à trois dimensions :
• Surfaces via plot_surface().
• Courbes 3D via plot().
• Nuages de points 3D via scatter().
• Contours projetés via contour() et contourf().
Ce code combine plusieurs de ces techniques pour o rir une vision complète d’une fonction
de deux variables d’équation Z = f(X, Y). L’astuce pédagogique est la projection des contours
sur les trois plans, qui permet de lire la même information sous trois angles di érents
simultanément.
resolution_grille = 120
abscisses_grille = [Link](-6, 6, resolution_grille)
242 Exemples pratiques avec Matplotlib
C’est une étape technique fondamentale pour toute visualisation de surface. La résolution de
120 signifie qu’on aura 120 × 120 = 14 400 points sur la grille. Plus la résolution est élevée, plus
la surface apparaît lisse, mais plus le calcul est coûteux. 120 est un bon compromis qualité/
performance pour un rendu haute définition.
[Link]() est la fonction clé : elle transforme deux tableaux 1D (x et y) en deux tableaux 2D
représentant toutes les combinaisons possibles. Si x = [1, 2, 3] et y = [4, 5], alors :
• grille_x sera [[1, 2, 3], [1, 2, 3]] (x répété pour chaque ligne).
• grille_y sera [[4, 4, 4], [5, 5, 5]] (y répété pour chaque colonne).
Résultat : chaque point (grille_x[i, j], grille_y[i, j]) représente une coordonnée unique du plan.
C’est la structure attendue par les fonctions 3D.
grille_z = calculer_cote(grille_x, grille_y) : grâce au calcul vectorisé de NumPy, la fonction
s’applique en une seule opération sur tous les points de la grille. Pas besoin de boucle
explicite, ce qui serait bien plus lent.
Création de la figure 3D
Le paramètre projection=’3d’ est la clé du passage en 3D. Sans lui, add_subplot() créerait un
axe 2D classique.
add_subplot(111) signifie grille 1×1 en position 1, c’est-à-dire un seul axe occupant toute la
figure. C’est une syntaxe abrégée équivalente à add_subplot(1, 1, 1).
Le tracé de la surface
surface = axe_3d.plot_surface(
grille_x, grille_y, grille_z,
cmap=’viridis’,
edgecolor=’none’,
alpha=0.92,
antialiased=True,
linewidth=0,
Exemples pratiques avec Matplotlib 243
rcount=resolution_grille,
ccount=resolution_grille
)
C’est le cœur du graphique. Plusieurs paramètres méritent une explication. cmap=’viridis’ est
la palette de couleurs viridis est un choix réfléchi. Elle est :
• Perceptuellement uniforme (les variations de couleur correspondent à des variations
équivalentes de valeur pour l’œil humain).
• Accessible aux daltoniens.
• Lisible en noir et blanc (la luminosité varie monotonement).
Ces trois propriétés en font le choix recommandé par la communauté data viz pour encoder
des valeurs continues.
edgecolor=’none’ et linewidth=0 : désactivent le maillage visible entre les polygones de la
surface. Sans cela, on verrait le quadrillage de 120×120 mailles, ce qui est parfois souhaité
(aspect filaire) mais souvent trop chargé visuellement.
alpha=0.92 : une transparence très légère (8 %) qui adoucit la surface sans compromettre sa
visibilité.
antialiased=True : active le lissage des bords, évitant l’e et escalier (crénelage) sur les
contours.
rcount=resolution_grille, ccount=resolution_grille : contrôlent respectivement le nombre de
lignes (rows) et de colonnes (columns) e ectivement rendues. Par défaut, Matplotlib limite
ces valeurs à 50 pour des raisons de performance, ce qui sous-échantillonnerait notre grille
120×120. En forçant ces paramètres à 120, on exploite la résolution complète de la grille.
# Sol (z = -1.5
axe_3d.contourf(grille_x, grille_y, grille_z, zdir=’z’, offset=-1.5, cmap=’viridis’, alpha=0.6, levels=20
contourf() trace des contours remplis (version remplie de contour()). Les paramètres
spécifiques 3D sont :
• zdir=’z’ indique que les contours sont projetés sur un plan perpendiculaire à l’axe Z, c’est-
à-dire sur un plan horizontal (le sol).
• o set=-1.5 fixe la position de ce plan en Z. Ici, à -1.5 (en-dessous de la valeur minimale de
la fonction, qui est -1).
• levels=20 découpe la plage de valeurs en 20 zones de couleur, produisant un dégradé de
type carte topographique.
244 Exemples pratiques avec Matplotlib
Le résultat : au sol, on voit des anneaux concentriques colorés révélant la structure radiale de
la fonction vue d’en haut, comme une vue satellite.
Même logique pour les deux murs, avec zdir=’x’ et zdir=’y’ pour projeter sur des plans
perpendiculaires à X et Y. L’utilisation de contour() (sans f) trace des lignes de niveau plutôt
que des zones remplies, pour un rendu plus discret sur les murs.
Ces trois projections sont la signature pédagogique de ce graphique : elles permettent de
comprendre la surface non seulement en 3D, mais aussi à travers ses profils 2D sous trois
angles. En analyse mathématique, c’est équivalent à observer les coupes de la fonction selon
chaque axe.
axe_3d.view_init(elev=28, azim=-55
view_init() est une méthode spécifique aux axes 3D qui contrôle l’angle de la caméra :
• elev=28 : l’élévation (hauteur de la caméra) en degrés. 0° correspondrait à une vue de face
(hauteur d’œil d’un observateur), 90° à une vue du dessus. 28° o re un compromis : on
voit à la fois le relief et le sol.
• azim=-55 : l’azimut (rotation autour de l’axe vertical) en degrés. Cette valeur détermine de
quel côté on regarde l’objet. -55° oriente la caméra pour révéler à la fois les projections
sur le mur gauche et sur le mur arrière.
Le choix de l’angle est crucial en 3D : un mauvais angle peut complètement masquer les
informations importantes.
axe_3d.set_xlim(-7, 6
axe_3d.set_ylim(-6, 7
axe_3d.set_zlim(-1.5, 1.2
Les bornes sont asymétriques pour une bonne raison : il faut laisser de la place aux projections
en dehors de la surface principale. On a :
• X s’étend de -7 à 6 : le -7 correspond au mur gauche (x = -7).
Exemples pratiques avec Matplotlib 245
• Y s’étend de -6 à 7 : le 7 correspond au mur arrière (y = 7).
• Z s’étend de -1.5 à 1.2 : le -1.5 correspond au sol.
Sans cet élargissement, les projections seraient tracées en dehors du volume visible et
n’apparaîtraient pas.
axe_3d.[Link].set_facecolor(‘white’)
axe_3d.[Link].set_facecolor(‘white’)
axe_3d.[Link].set_facecolor(‘white’)
for pane in [axe_3d.[Link], axe_3d.[Link], axe_3d.[Link]]:
pane.set_edgecolor(‘black’)
pane.set_alpha(1.0)
Les panneaux (panes) sont les trois murs gris qui forment le boîtier 3D par défaut. Ce code :
• Les blanchit pour contraster avec le fond lightblue extérieur.
• Leur ajoute un contour noir pour bien les délimiter.
• Les rend totalement opaques.
Cette personnalisation clarifie la structure géométrique du repère, facilitant la perception de
la 3D.
Barre de couleur
La barre de couleur est essentielle pour décoder les nuances de viridis en valeurs numériques
de Z. Nouveauté : aspect=25 contrôle le ratio largeur/hauteur de la barre (25 signifie 25 fois
plus haute que large, donc une barre fine et élancée). outline.set_edgecolor(‘black’) ajoute un
contour noir autour de la barre.
Sauvegarde et aƯichage
# affichage
plt.tight_layout()
[Link]("f14/graphique_13.png", facecolor=’lightblue’, bbox_inches=’tight’, dpi=300
[Link]()
Finalisation standard.
Résultat attendu
14 - Carte de chaleur
imshow() est la méthode clé. Conçue à l’origine pour a icher des images (matrices de pixels),
elle est détournée ici pour représenter une matrice de données numériques. Chaque valeur
devient un pixel coloré.
252 Exemples pratiques avec Matplotlib
Ses paramètres :
• cmap=’YlOrRd’ : la palette Yellow-Orange-Red, une palette séquentielle allant du jaune
pâle au rouge foncé. Ce choix est cohérent avec le contexte sanitaire : les valeurs faibles
(peu alarmantes) en jaune clair, les valeurs élevées (potentiellement préoccupantes) en
rouge intense. La progression de luminosité suit l’intensité, ce qui rend la palette intuitive.
• aspect=’auto’ : permet aux cellules de ne pas être carrées. Par défaut, imshow() fixe un
ratio 1:1, ce qui produit des pixels parfaitement carrés, adapté aux images, mais pas
toujours aux heatmaps de données où l’on veut remplir toute la zone disponible. Avec
aspect=’auto’, les cellules s’étirent automatiquement pour occuper l’espace.
• interpolation=’nearest’ : désactive le lissage entre cellules. Sans cela, imshow() tenterait
d’interpoler les couleurs entre pixels voisins, rendant les frontières floues. Pour une
heatmap, on veut des cellules nettement délimitées : ’nearest’ impose la couleur exacte
de chaque valeur, sans transition.
Barre de couleur
La colorbar est indispensable dans une heatmap : sans elle, le lecteur ne saurait pas à quel
pourcentage correspond chaque nuance de couleur. Elle est générée automatiquement à
partir de l’objet image_chaleur, avec un contour noir pour bien la délimiter.
axe.set_xticks([Link](len(liste_dates)))
axe.set_yticks([Link](len(liste_symptomes)))
axe.set_xticklabels(liste_dates)
axe.set_yticklabels(liste_symptomes, fontweight=’bold’)
[Link](axe.get_xticklabels(), rotation=30, ha=’right’, rotation_mode=’anchor’, fontsize=14
Le mécanisme est analogue aux graphiques en barres : on fixe d’abord les positions
numériques des graduations (0, 1, 2… aux indices des cellules), puis on associe à chaque
position un libellé textuel.
rotation_mode=’anchor’ est un paramètre subtil : il contrôle autour de quel point le texte
pivote. Avec ’anchor’, la rotation se fait autour du point d’ancrage défini par ha=’right’, ce qui
Exemples pratiques avec Matplotlib 253
garde la fin des étiquettes bien alignée avec les graduations, même après rotation.
C’est une astuce très élégante pour créer des bordures blanches entre les cellules.
Décomposons :
• [Link](len(liste_dates) + 1) - 0.5 génère les positions [-0.5, 0.5, 1.5, 2.5, ...]. Ces valeurs
tombent entre deux cellules (la cellule d’indice 0 est centrée sur la position 0, elle s’étend
donc de -0.5 à 0.5).
• minor=True définit ces graduations comme mineures (distinctes des principales qui
placent les labels).
• [Link](which=’minor’, color=’white’, linestyle=’-’, linewidth=3) trace alors une grille blanche
épaisse à ces positions. Résultat : chaque cellule apparaît séparée de ses voisines par
une ligne blanche, accentuant visuellement la grille et donnant un aspect plus soigné.
• tick_params(bottom=False, left=False) masque les petits traits aux graduations (pour les
deux niveaux, mineur et majeur), rendant l’ensemble plus épuré.
C’est une technique particulièrement élégante de ce graphique. Écrire du texte sur une
heatmap pose un problème de lisibilité : sur les cellules très claires (jaune pâle), un texte
blanc devient invisible et sur les cellules très foncées (rouge intense), un texte noir devient
di icile à lire. La solution du seuil adaptatif :
• On calcule un seuil de contraste à 55 % de la valeur maximum.
• Si la valeur d’une cellule dépasse ce seuil (donc couleur foncée), le texte s’a iche en
blanc.
254 Exemples pratiques avec Matplotlib
Titre principal en bleu marine gras, sous-titre italique rouge pour préciser le contexte,
labels des deux axes. Le duo titre/sous-titre est une convention éditoriale qui hiérarchise
l’information : le titre attire l’œil, le sous-titre précise la nature exacte des données.
Bordures masquées
Les quatre bordures sont masquées, contrairement aux graphiques précédents qui en
conservaient certaines. Pour une heatmap, cette décision fait sens : la structure matricielle
est déjà clairement délimitée par les séparateurs blancs et les cellules colorées, un cadre
supplémentaire serait redondant.
[Link](0.98, 0.02,
"Données illustratives - Généré avec Matplotlib",
fontsize=12, style=’italic’, color=’gray’, ha=’right’)
plt.tight_layout()
[Link]("f14/graphique_14.png", facecolor=’lavender’, bbox_inches=’tight’, dpi=300
[Link]()
Mention de source à droite cette fois (pour ne pas entrer en conflit avec l’encadré statistique
placé à gauche), puis sauvegarde et a ichage.
Résultat attendu
Lecture du graphique
Patrice REY
4435-199 RIO TINTO
PORTUGAL
Des manuels pratiques pour apprendre à programmer
en vente dans les meilleurs points de vente
FNAC CULTURA
[Link] [Link]
AMAZON LINKEDIN
[Link]/3fXLGqa [Link]/3fe5YhD
Patrice REY
RIO TINTO - PORTUGAL
SITE WEB >> [Link]
EMAIL >> patricerey33@[Link]