Matplotlib




Le package matplotlib a comme utilité essentielle de créer des graphes (charts en anglais) à partir de séries de données ou de statistiques. Le module pyplot est importé systématiquement, car il contient les objets et méthodes servant à l’affichage et la mise en forme des graphes.
Nous allons passer en revue quelques instructions de base pour définir et personnaliser un graphe en particulier, puis pour afficher plusieurs « charts »simultanément. Les « plots » sont les cadres dans lesquels ces « charts » sont affichés. Enfin, nous verrons quelques types de tracés ou de formats (histogrammes, aires,…) proposés par matplotlib (ils sont assez nombreux)
 

Création d’un « plot »

On utilise couramment l’alias plt pour désigner le module pyplot. Les abscisses et ordonnées sont passées à la méthode plot, sous forme de séquence, de ndarray, de série, de dataFrame index,etc., c.a.d.tout ensemble de données unidimensionnel. La méthode show() lance l’affichage du graphe. Par défaut, le type du graphe est une courbe au tracé continu.
 

 
Pour la suite, nous allons récupérer les données stockées dans un fichier Excel (Historique.xlsm)n à la page ‘Quotes’ à l’aide de la méthode read_excel du module pandas.ExcelFile (ExcelWriter ne nous servira pas dans ce chapitre)
 

 
La 1ère ligne remplie de NaN nous indique qu’il y avait une ligne laissée vide entre les en-têtes et les données: celle-ci est supprimée via la méthode drop appliquée à la ligne 0.
 

 
Supposons que l’on veuille afficher l’historique de cours du titre SG (1ère colonne), on renseigne le libellé des axes (xLabel et yLabel) ainsi que le titre title
 

 
Le chevauchement des dates en abscisses pose problèmes. Nous choisissons de les supprimer (on passe une liste vide à la méthode xticks) pour mentionner la période à laquelle se rapporte l’historique dans le titre
 

Deux (voire plus) charts dans un « plot »

Pour afficher un deuxième graphe, il suffit de rajouter une ligne plt.plot(autres abscisses,autres ordonnées)
 

 
Cette présentation n’est bien sûr pas satisfaisante, aucune légende ne nous permettant d’identifier à quel titre se rapporte chacune des courbes.
La manière la plus simple de documenter ces courbes est de placer le nom de chaque titre proche de la courbe qui le concerne, en accordant la couleur du texte avec la courbe correspondante. Pour personnaliser le texte (taille et couleur), on utilise le module matplotlib.rcParams.
Par exemple, pour obtenir une taille de police 15p et une couleur bleue, on code
 

 
On place l’intitulé d’un titre avec la méthode text, à laquelle on passe la position dans la zone de graphique, c’est à dire deux coordonnées x et y, ainsi que le nom du titre évidemment. Pour que ce texte apparaisse à côté de la bonne courbe, les deux coordonnées seront choisies proches d’un point (x,y) ou x est une valeur de l’index (une date) et y, le cours correspondant à cette date. En pratique, la coordonnée x doit être une valeur numérique, pas une date. Rien n’empêche de remplacer l’indexation temporelle par une indexation avec les n premiers entiers servant d’abscisses, les dates ne figurant pas dans notre présentation. Concrètement, on remplace
 

 
par
 

 
Par exemple, les coordonnées du point de courbe SG (columns[0]), à l’abscisse x=10, seront (10,df.iloc[10,0]). On pourra choisir de décaler de un intervalle le texte ‘SG’ et cela donnera
 

 
Pour finir, afin de colorer les charts, on ajoute un argument sous forme de chaîne de caractères contenant une lettre désignant la couleur (b:bleu, g:vert, r:rouge, etc.) et un symbole désignant le type de tracé que l’on souhaite.
Parmi les tracés les plus courants, citons

  • le trait continu, symbolisé par ‘
  • les pointillés’
  • les petites croix ‘+
  • les cercles ‘o

Pour tracer en continu et en bleu la courbe SG, on écrit
 

 
Les couleurs primaires désignées par des lettres sont en nombre très limité: pour avoir accès à un choix plus large, on peut

  • sélectionner un nom de couleur standardisé dans, la palette fournie par https://xkcd.com/color/rgb/
  • utiliser les codes couleur au format hexadecimal (par ex. le beige correspond à #e6daa6)
  • utiliser la fonction rgba prenant quatre arguments compris entre 0 et 1, les trois premiers désignant les pourcentages de rouge, vert et bleu, le dernier indiquant le degré d’opacité. Par exemple, un gris (#808080) faiblement opaque se coderait rgba(0.5,0.5,0.5,0.2)

Pour passer ces codes couleur avancés, on ajoute un argument nommé color à la suite du symbole désignant le type de tracé. Nous l’emploierons au chapitre suivant.
Ajoutons une touche finale avec la méthode grid(), qui tracera des lignes horizontales pour chaque graduation de l’axe des y.
Le résultat final est
 

Des charts sur plusieurs plots

L’objet qui va contenir tous les plots est de type figure et l’organisation des plots est matricielle (une grille). La méthode subplots commence par prendre en arguments le nombre de lignes et de colonnes ainsi que la taille de la figure. Par exemple, si vous voulez répartir quatre courbes sur deux lignes et deux colonnes et utiliser une figure carrée 10×10, vous pouvez écrire
 

 
ou bien, pour mieux distinguer les dimensions de la matrice,
 

 
Dans cet exemple, fig_1 est la référence donnée à la figure et ch est un ndarray 2×2.
Si l’on veut afficher les quatre premiers historiques de cours de notre base, c.a.d ceux de SG, BNP, Unicredit et Axa, en utilisant les couleurs bleue, rouge, grise et vert olive,

  • les plots seront référencés par ch[0][0], ch[0][1], ch[1][0] et ch[1][1]
  • les couleurs seront regroupées dans une liste appelée cols et passées à la méthode plot comme valeurs de l’argument color

 

 
La présentation laisse encore à désirer: au lieu de renseigner les périodes au-dessus des charts, on souhaite que l’axe du temps soit gradué, idéalement par intervalles mensuels.
Le module facilitant le paramétrage d’un axe temporel (l’axe X en l’occurrence) est matplotlib.dates.
 
Remarque: il n’est pas facile de s’y retrouver dans la masse d’informations fournies par le site officiel de matplotlib, d’autant plus que certaines méthodes ou sous-modules deviennent obsolètes au fil de l’évolution des versions. Nous recommandons de visiter la page

https://matplotlib.org/3.1.0/api/index.html
et de ne pas être trop pressés pour trouver le module et la méthode répondant à votre besoin spécifique. Celui ou celle-ci se trouve dans la soixantaine de sous-modules listés en-dessous de Modules
 
matplotlib.dates met à notre’ disposition des méthodes qui choisissent à notre place la graduation optimale de votre axe temporel en fonction de la période couverte. Si cette période s’étale sur plusieurs années, l’axe sera gradué en affichant simplement l’année concernée et non les dates complètes.
Dans notre cas, la période étant d’environ 3 mois, les graduations seront mensuelles.
Les objets locator et formatter vont déterminer la position des graduations et le format des dates affichées. Comme nous souhaitons laisser matplotlib déterminer ce paramétrage, nous construisons ces objets à l’aide des méthodes AutoDateLocator et AutoDateFormatter.
Quand matplotlib a le choix entre différents solutions (par exemple, une période de 3 trimestres peut être découpée en 9 mois ou trois trimestres), Les arguments nommés minticks et maxticks passés à AutoDateLocator doivent permettre de restreindre les possibilités.
Dans l’exemple qui suit, les valeurs de minticks et maxticks offrent à matplotlib la possibilité d’afficher deux dates (mois de nov. et dec. 2018) ou bien 4 (incluant oct 2018 et jan 2019).
 

Graphique à barres

On souhaite afficher graphiquement les dépenses trimestrielles d’une copropriété, en distinguant les charges courantes et les travaux. Le format recherché est le suivant
 

 
Les listes nommées travaux et charges donnent les dépenses, le ndarray div donne la graduation de l’axe X (4 unités), la variable width détermine la largeur de chaque barre (40% d’un espace entre deux graduations dans notre exemple), ainsi que l’emplacement des barres.
 

 
Deux séries de barres sont créées via la méthode bar. Le premier argument passé est la série des graduations.On note que l’opération div + width augmente chaque élément de div de la valeur width, car div est de type ndarray.
la méthode set_xlim fixe

  • la position de l’axe Y par rapport au centre de la première barre, à gauche (argument négatif ou nul)
  • la limite de la zone de graphique par rapport à ce même centre

 

&nbp;
On ajoute un titre au diagramme (méthode set_title), une légende à l’axe Y (set_ylabel) et on paramètre les étiquettes de l’axe Y (set_tick_params).
Les graduations de l’axe X sont placées via la méthode set_xticks et les étiquettes (‘Trimestre1’, ‘Trimestre2’,…) sont passées à la méthode setp. L’argument rotation désigne l’inclinaison des étiquettes.
Pour finir, on peut associer les couleurs aux valeurs concernées en les affichant en haut à droite du diagramme, via legend.
 

 
En résumé, le code permettant d’obtenir le format affiché plus haut est
 

Les histogrammes

Dans un échantillon, quand certaines valeurs apparaissent plusieurs fois, un histogramme permet d’afficher graphiquement le nombre d’occurrences par valeur, quand celles-ci sont entières. Lorsque l’échantillon contient des nombres décimaux, on subdivise l’intervalle limité par les valeurs min. et max. de l’échantillon par des sous-intervalles: cette fois, l’histogramme affiche le nombre de valeurs par sous-intervalle. C’est ce cas que nous allons traiter ici à partir de cotations du titre SG récupérées du fichier Historique.xlsm utilisé pour tracer des courbes (voir + haut).
L’affichage s’effectue via la méthode hist qui reçoit en arguments

  • x: l’échantillon de valeurs (type list, span class= »keyw »>Series,…)
  • bins: le nombre de subdivisions, ou bien la liste des valeurs qui délimitent ces subdivisions quand celles-ci sont de longueurs inégales
  • rwidth: largeur commune des barres, lorsque les sous-intervalles sont égaux
  • color,alpha : couleur et opacité des barres

La méthode hist renvoie un tuplet dont le premier élément donne les fréquences d’apparition (nombres d’occurrences) des valeurs passées en argument. De cette liste, on déduit la valeur maximale servant à calibrer la hauteur du diagramme.
Les méthodes xlabel, ylabel, title et grid viennent compléter la présentation du diagramme.
L’histogramme des variations journalières (relatives) de la SG affiché ci-dessous, récupère les rendements calculés et enregistrés dans la série SGy
 

 
On peut afficher deux histogrammes sur le même plot. Dans ce cas, pour identifier chaque histogramme, on utilise la méthode legend en lui passant la valeur ‘upper right’: le nom du titre et la couleur dédiée à son histogramme y figurent.
 

 
En pratique, ce sont les pourcentages et non les nombres d’occurrences que l’on souhaite voir sur l’axe Y, car ceux-ci reflètent mieux la distribution des variations. L’argument weights permet de pondérer les nombres précédents par des facteurs 1/(nb. total de valeurs) via la fonction np.ones_like qui crée une série remplie avec ces facteurs de pondération. Ces facteurs seront identiques pour SG et BNP, leurs cotations étant en nombre égal.
Dans ce cas, ymax devra être modifié, car compris nécessairement entre 0 et 1. On peut utiliser la statistique pour borner automatiquement notre diagramme, le plus simple étant de choisir pour ymax la valeur 1 par défaut, et d’ajuster ensuite cette valeur en fonction de l’affichage obtenu. Dans notre cas, la valeur la plus appropriée est 0.3.
 

Graphique à segments (camembert)

On souhaite afficher de nouveau les dépenses trimestrielles d’une copropriété, en distinguant charges d’entretien, travaux, chauffage et gardiennage. Le format recherché est le suivant
 

 
Hormis le titre, il y a deux parties dans cette image: le graphe avec l’information essentielle présente sur chaque segment, à savoir le pourcentage de chaque poste par rapport au total, et une légende qui rattache chaque dépense à un segment en précisant le montant correspondant.
On commence par enregistrer les dépenses et leur nature dans des séquences (listes ou tuplets)

  • dep: montants
  • nat: natures
  • labels: liste d’étiquettes affichant natures et montants

Après avoir enregistré quatre couleurs pour les segments dans une liste colors, on configure le graphe en passant à la méthode pie trois paramètres

  • autopct: détermine le format des pourcentages affichés. Le format standard (avec deux chiffres après la virgule), est ‘%1.1f%%’
  • textprops: paramétrage du format d’affichage des données affichées dans le graphe (police, couleur,…)
  • explode: ce paramètre facultatif est renseigné quand, pour des raisons de présentation (c’est un standard), un segment doit se détacher des autres avec un effet d’ombre « esthétique » (paramètre shadow=True)

On place le tableau de légendes à l’aide des paramètres

  • loc: fixe l’origine des coordonnées du tableau
  • et bbox_to_anchor: coordonnées du tableau.

Remarque: les coordonnées de l’origine ne sont pas (0,0) mais (0.5, 0.5), ce qui est un peu déroutant. Le tableau se déplace vers la droite quand la 1ère coordonnée augmente et vers le haut quand c’est la 2ème qui augmente. Il est courant de placer ce tableau à mi hauteur (y=0.5) et décalé vers la droite (x>0.5)