La librairie Matplotlib
La librairie Python matplotlib est une librairie qui vous permet de faire de la visualisation de données 2D de manière extrêmement pratique. Elle n’est pas indispensable, bien sur, mais dés lors que l’on aborde des projets de Machine Learning elle peut s’avérer très pratique. L’objectif de ce tuto est de vous mettre le pied à l’étrier avec cette fameuse librairie.
Note: Cette librairie vient avec la distribution Anaconda.
Les types de graphes supportés sont nombreux, aussi je ne les détaillerais pas tous dans ce tuto. retenez juste que cette librairie couvre de nombreux types de graphes : lines, courbes, histogrammes, points, barres, camembert (pie), tableaux, polaires, etc.
Ce tuto vous expliquera comment faire des courbes et histogrammes, pour les autres je vous suggère d’aller voir la documentation sur le site officiel ici.
Pour le jeu de données utilisé, c’est simplement celui du titanic sur Kaggle.com : train.csv.
Tracer des courbes
Pour commencer il faut évidemment déclarer la librairie Python avec la commande import. Par usage on choisit l’alias plt. On en profite pour récupérer le jeu de données que l’on va limiter aux 5 premières lignes afin d’avoir des graphes lisible (pour ce tuto) :
[code language="python"] import pandas as pd import matplotlib.pyplot as plt titanic = pd.read_csv("./data/train.csv")[:5] plt.plot(titanic.Fare) [/code]
Libellés sur les axes
L’ajout de libellés se fait via les commandes xlabel et ylabel :
plt.ylabel('Prix des billets') plt.xlabel('Passagers') plt.show()
Voilà le résultat :
Affectation des données d’abscisse
Jusque là nous n’avons donné que des valeurs en ordonnées, précisons les valeurs en abscisses (N° de passager) :
plt.ylabel('Prix des billets') plt.xlabel('Passagers')
Empilement de courbes
Maintenant il est souvent utile d’empiler des courbes afin de mieux analyse les données, c’est chose très simple avec matplotlib en empilant les appels à la fonction plot:
plt.plot(titanic.PassengerId, titanic.Fare) plt.plot(titanic.PassengerId, titanic.Survived) plt.plot(titanic.PassengerId, titanic.Age) plt.ylabel('Prix des billets') plt.xlabel('Passagers')
Voilà le résultat des 3 courbes sur le même graphe:
Changer d’aspect
Une fois de plus la librairie nous facilite la vie et nous permet de changer de couleur, de trait ou d’épaisseur de trait en un clin d’oeil simplement en précisant des options dans l’appel à la fonction plot:
Voici les codes/options disponibles:
- Codes des Courbes : – ou — ou -.
- Codes des couleurs : b g r c m y k w
- Largeur des traits avec linewidth
plt.plot(titanic.PassengerId, titanic.Fare, "k-.", linewidth=5) plt.plot(titanic.PassengerId, titanic.Survived, "r", linewidth=1) plt.plot(titanic.PassengerId, titanic.Age, "c", linewidth=10) plt.ylabel('Prix des billets') plt.xlabel('Passagers')
Voilà le résultat:
Ajouter une grille
Tout simplement en ajoutant un appel à la fonction grid() :
plt.grid(True)
Voilà le résultat:
Enjoliver son graphe
La librairie matplotlib dispose pour cela de plusieurs fonctions:
- text() et annotate() pour des ajout de texte dans le graphe (ajoutons par exemple un point précisant le prix maximum)
- legend() pour ajouter la légende
- etc.
plt.text(2,70, ' Prix max !') plt.legend()
Voilà le résultat:
Créer des grilles de graphes
De la même qu’il est possible d’empiler plusieurs courbes dans le même graphe, il est possible de créer des grilles de graphes; C’est très pratique pour empiler des graphes qui doivent être regardés ensemble mais qui n’ont pas les mêmes ordres de grandeurs en matière d’abscisse et d’ordonnées. Pour se faire on utilise l’instruction subplot() qui va décrire la grille. Cette commande prend plusieurs arguments ;
- Nombre de lignes de la graille de graphe
- Nombre de colonnes de la grillede graphe
- Index du graphe dans la grille
- Options (ici on a précisé une couleur de fond)
Dans l’exemple ci-dessous on définit une grille de 1 colonne et 2 lignes :
plt.subplot(1, 2, 1) plt.plot(titanic.PassengerId, titanic.Fare, "k-.", linewidth=5) plt.subplot(1, 2, 2, facecolor='y') plt.plot(titanic.PassengerId, titanic.Age, "c", linewidth=10)
Note: on précise en outre que le second graphe ait un fond jaune
Voilà le résultat:
Quelques autres diagrammes disponibles
Histogramme
L’histogramme est un graphe bien pratique car il vous présente en cumulé (automatique) votre jeu de données. C’est très utile par exemple pour voir les fréquences de distribution de vos valeurs :
plt.hist(titanic.Fare)
Attention: cette fonction ne marche pas si vous avez des étiquettes (abscisses) de type caractères. Pour y remédier il faut utiliser la fonction bar() en effectuant le comptage « manuellement ».
Vous pouvez regarder ces deux fonctions Python à titre d’exemple de mise en oeuvre sur Gist :
Histogramme simple
# Where matplotlib do not work (when using string labels for hist()) from collections import Counter def hist_string(df) : distincts_count = Counter(df) df = pd.DataFrame.from_dict(distincts_count, orient='index') df.plot(kind='bar') hist_string(titanic.Embarked)
Histogramme double
# The goal here is to create a double histogram with string labels which is not supported yet with the hist() matplotlib function import matplotlib.pyplot as plt import numpy as np from collections import Counter # Dead list l1 = titanic[titanic["Survived"] == 0]["Embarked"].dropna() # Survivor list l2 = titanic[titanic["Survived"] == 1]["Embarked"].dropna() # draw histogram function def hist2Str(_l1_Values, _l2_Values, _l1_Label, _l2_Label, _X_Label, _Y_Label): step = 0.3 # Values lists 1 & 2 count1 = Counter(_l1_Values) counts1 = count1.values() count2 = Counter(_l2_Values) counts2 = count2.values() # Labels in x labels = count1.keys() # Draw histogram bar_x = np.arange(len(counts1)) plt.bar(bar_x, counts1, step, align = 'center') plt.bar(bar_x + step, counts2, step, color='r', align = 'center') plt.xticks(bar_x + step/2, labels) # Axis labels & draw plt.ylabel(_Y_Label) plt.xlabel(_X_Label) plt.legend([_l1_Label, _l2_Label]) plt.draw() hist2Str(l1, l2, "Dead", "Survived", "Embarked", "Passenger")
Diagramme à barre
Visuellement c’est un histogramme, mais à ce ci près que comme pour les courbes (ci-dessus) c’est vous qui précisez les données (abscisse et ordonnée) :
plt.bar(titanic.PassengerId, titanic.Fare, color="b")
Diagramme camenbert (pie)
Très utile pour visualiser la part de chaque donnée sur un « ensemble fini » (comme des pourcentages) :
plt.pie(titanic.Fare, autopct='%1.1f%%', startangle=180)
Diagramme de points
Pour simplement placer des distributions de points :
plt.scatter(titanic.PassengerId, titanic.Fare)
Cumuler des diagrammes en un seul
Comme nous l’avons vu précédemment, il suffit maintenant d’empiler les appels à plot(), scatter(), bar(), etc.
plt.scatter(titanic.PassengerId, titanic.Fare) plt.bar(titanic.PassengerId, titanic.Fare, color="y") plt.plot(titanic.PassengerId, titanic.Age, "c", linewidth=10)
Résumé
La documentation matplotlib est disponible ici.
Récapitulatif des fonctions de diagrammes de ce tuto :
- plot() : pour tracer des courbes
- scatter() ; pour tracer des points
- bar() : pour des diagrammes à barre
- pie() ; pour des camenbert
- hist() ; pour les histogrammes
Pingback: MNSIT : Reconnaître les chiffres (Partie 1) - Data Corner
Pingback: Redresser un document textuel mal scanné avec deskew - datacorner par Benoit Cayla
Pingback: Traitement d'images (partie 2: Les histogrammes) - datacorner par Benoit Cayla
Pingback: La dataViz avec Plotly - datacorner par Benoit Cayla