Graphiques pour la science des données : suite

Dans un TP précédent, on a vu comment réaliser des graphiques en utilisant les méthodes de la bibliothèque pandas.
Comme toujours avec python, il existe plusieurs manières de réaliser à peu près la même chose. Lors de ce TP, nous avions utilisé les fonctions graphiques du paquetage pandas qui elles-mêmes utilisent celles du paquetage matplotlib. Ce dernier est un paquetage très utile et de grande qualité, très riche en possibilités dont seule une petite partie peut être utilisée via pandas.
On peut utiliser directement matplotlib ce qui donne beaucoup plus de libertés et qui est très pratique lorsque l'on veut réaliser une figure contenant plusieurs graphiques.
Ce court TP a pour objectif de vous présenter cette autre manière de faire.

Graphiques avec matplotlib

Premiers pas

Pour réaliser un graphique, la méthode vue précédemment dans le TP graphiques consiste à faire une instruction telle que :

olives.plot.scatter (x = "linoleic", y = "palmitic", title = "Les olives dans le plan linoleic x palmitic", c = "region", cmap = "tab10")
plt. show()
.
qui donne :

L'autre approche consiste à faire comme suit :
fig, ax = plt.subplots ()
ax. scatter (x = "linoleic", y = "palmitic", c = "region", data = olives, cmap = "tab10")
ax. set_title ("Les olives dans le plan linoleic x palmitic")
ax. set_xlabel ("Acide linoleic")
ax. set_ylabel ("Acide palmitic")
fig. show()



Explication : on commence par créer deux objets à l'aide de la méthode fig, ax = plt.subplots (). Ensuite, on ajoute des éléments à la figure avec des instructions du genre ax. xxx (...)xxx indique l'élément de la figure dont on veut spécifier la valeur. On termine par fig. show() pour afficher la figure. On peut aussi la mettre dans un fichier avec fig. savefig (nom-du-fichier).

Remarque : les points sont un peu grossiers dans cette figure. On peut spécifier leur taille avec le paramètre s :
fig, ax = plt.subplots ()
ax. scatter (x = "linoleic", y = "palmitic", c = "region", data = olives, cmap = "tab10", s = 3)
ax. set_title ("Les olives dans le plan linoleic x palmitic")
ax. set_xlabel ("Acide linoleic")
ax. set_ylabel ("Acide palmitic")
fig. show()


On peut ajouter une légende pour un code couleur indiquant la région de chaque olive :
fig, ax = plt.subplots ()
ax. scatter (x = "linoleic", y = "palmitic", c = "blue", data = olives [olives.region == 1], cmap = "tab10", label = "Nord", s = 3)
ax. scatter (x = "linoleic", y = "palmitic", c = "red", data = olives [olives.region == 2], cmap = "tab10", label = "Sardaigne", s = 3)
ax. scatter (x = "linoleic", y = "palmitic", c = "green", data = olives [olives.region == 3], cmap = "tab10", label = "Sud", s = 3)
ax. set_title ("Les olives dans le plan linoleic x palmitic")
ax. set_xlabel ("Acide linoleic")
ax. set_ylabel ("Acide palmitique")
ax. legend ()
fig. show()


En plus d'une couleur, on peut encore indiquer la classe par la forme du point :
fig, ax = plt.subplots ()
ax. scatter (x = "linoleic", y = "palmitic", c = "blue", data = olives [olives.region == 1], cmap = "tab10", label = "Nord", marker = "s", s = 16)
ax. scatter (x = "linoleic", y = "palmitic", c = "red", data = olives [olives.region == 2], cmap = "tab10", label = "Sardaigne", marker = "X", s = 16)
ax. scatter (x = "linoleic", y = "palmitic", c = "green", data = olives [olives.region == 3], cmap = "tab10", label = "Sud", marker = "<", s = 16)
ax. set_title ("Les olives dans le plan linoleic x palmitic")
ax. set_xlabel ("Acide linoleic")
ax. set_ylabel ("Acide palmitique")
ax. legend ()
fig. show()


Figure composée

On peut créer une figure composée de plusieurs sous-figures. Dans ce cas, la figure principale est une matrice de sous-figures. Par exemple, on peut représenter les valeurs de chacun des 8 acides dans une figure composée de 2 lignes de 4 figures comme suit :

fig, ax = plt.subplots (2, 4)
ax [0, 0]. scatter (x = "palmitic", y = "numero", data = olives, c = "region", s = 3)
ax [0, 0]. set_title ("palmitic")
ax [0, 1]. scatter (x = "palmitoleic", y = "numero", data = olives, c = "region", s = 3)
ax [0, 1]. set_title ("palmitoleic")
ax [0, 2]. scatter (x = "stearic", y = "numero", data = olives, c = "region", s = 3)
ax [0, 2]. set_title ("stearic")
ax [0, 3]. scatter (x = "oleic", y = "numero", data = olives, c = "region", s = 3)
ax [0, 3]. set_title ("oleic")
ax [1, 0]. scatter (x = "linoleic", y = "numero", data = olives, c = "region", s = 3)
ax [1, 0]. set_title ("linoleic")
ax [1, 1]. scatter (x = "linolenic", y = "numero", data = olives, c = "region", s = 3)
ax [1, 1]. set_title ("linolenic")
ax [1, 2]. scatter (x = "arachidic", y = "numero", data = olives, c = "region", s = 3)
ax [1, 2]. set_title ("arachidic")
ax [1, 3]. scatter (x = "eicosenoic", y = "numero", data = olives, c = "region", s = 3)
ax [1, 3]. set_title ("eicosenoic")
fig. show ()



Bien sûr, on fera plutôt une boucle :

attributs = list (olives) [3:11]
fig, ax = plt.subplots (2, 4)
for ligne in range (2):
    for colonne in range (4):
        ax [ligne, colonne]. scatter (x = attributs [ligne * 4 + colonne], y = "numero", data = olives, c = "region", s = 3)
        ax [ligne, colonne]. set_title (attributs [ligne * 4 + colonne])

fig. show ()

Pour aller plus loin

Les possibilités offertes par matplotlib sont immenses. Consultez la documentation en ligne