Python matplotlib

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 ;

  1. Nombre de lignes de la graille de graphe
  2. Nombre de colonnes de la grillede graphe
  3. Index du graphe dans la grille
  4. 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
Partager cet article

4 Replies to “Python matplotlib”

  1. Ping : Redresser un document textuel mal scanné avec deskew - datacorner par Benoit Cayla

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.