====== Module Matplotlib.pyplot ======
Le module ''Matplotlib'' est un très gros module de Python qui se subdivise en sous-modules. Celui qui nous intéresse ici est ''matplotlib.pyplot''.
On trouve dans la [[https://matplotlib.org/stable/gallery/index|référence]] du module un grand nombre d'exemple qui donnent une idée de ce qui est possible. Vous pouvez constater que matplotlib permet de faire de très beaux graphiques.
===== Import du module =====
# ceci suffit :
import matplotlib.pyplot
# mais on préfère :
import matplotlib.pyplot as plt
Avec la première version d'import, on importe bien le module, mais on sera obligé d'écrire ''matplotlib.pyplot'' à chaque fois que l'on aura besoin d'une fonction du module. C'est long et on préfère éviter.
Avec la deuxième version, on définit un **alias** avec le mot clé ''as''. Ainsi, dans la suite du programme, au lieu d'écrire ''matplotlib.pyplot'', il suffira d'écrire ''plt'' ce qui est beaucoup plus simple.
===== Courbes ======
La fonction de base est ''plot'' ce qui signifie //tracer//.
Il s'agit de tracer une courbe formée de segments reliant des points dans un repère 2D. Ces points ont des coordonnées (x,y).
==== utilisation de base ====
On doit fournir la liste des x et la liste des y. Par exemple, si je veux afficher la courbe passant par les points de coordonnées (4,8), (10,2), (15,9) je fais :
import matplotlib.pyplot as plt
xs = [4, 10, 15]
ys = [8, 2, 9]
plt.plot(xs, ys)
plt.show()
''plt.show()'' lance l'affichage d'une fenêtre graphique. Tant que la fenêtre est ouverte, le programme est en pause. L'exécution ne reprend qu'une fois la fenêtre fermée.
{{ :nsi:modules:graphique_matplotlib_1.png?direct&400|}}
==== Amélioration du résultat ====
Le graphique obtenu est très simple. On dispose de beaucoup d'options pour l'améliorer.
* on peut ajouter une 'label' qui permet d'ajouter un nom à la courbe pour faire une légende
* on peut préciser une épaisseur : ''linewidth'' du trait
* on peut préciser une couleur : 'b' pour //blue//, 'r' pour //red//, ...
* ...
Un exemple :
import matplotlib.pyplot as plt
xs = [4, 10, 15]
ys = [8, 2, 9]
plt.plot(xs, ys, 'r', linewidth=2, label='ma courbe')
plt.legend() # affiche la légende
plt.xlim(0, 20) # indique les limites de x
plt.ylim(0, 20) # indique les limites de y
plt.title("mon beau graphique") # ajoute un titre au graphique
plt.xlabel("l'axe x") # étiquette sur l'axe x
plt.ylabel("l'axe y") # étiquette sur l'axe y
plt.show()
{{ :nsi:modules:graphique_matplotlib_2.png?direct&400|}}
Il n'y a ici que 3 points alors on voit que la courbes est une séquence de 2 segments. Le tracé d'une courbe comme en mathématiques sera identique. Il y aura seulement beaucoup plus de points ce qui donnera un effet de courbe bien arrondie.
===== Nuages de points =====
On se donne une liste de points de coordonnées (x,y). On souhaite les afficher.
==== utilisation de base ====
On doit fournir la liste des x et la liste des y. Par exemple, si je veux afficher les points de coordonnées (4,8), (10,2), (15,9) je fais :
import matplotlib.pyplot as plt
xs = [4, 10, 15]
ys = [8, 2, 9]
plt.scatter(xs, ys)
plt.show()
''plt.show()'' lance l'affichage d'une fenêtre graphique. Tant que la fenêtre est ouverte, le programme est en pause. L'exécution ne reprend qu'une fois la fenêtre fermée.
{{ :nsi:modules:graphique_matplotlib_3.png?direct&400|}}
==== Amélioration ====
Là encore on peut utiliser ''legend'', ''xlim'', ''title''... je ne reviens pas dessus.
On peut préciser la couleur des points et leur taille avec les attributs ''c'' (pour //color//) et ''s'' (pour //size//).
import matplotlib.pyplot as plt
xs = [4, 10, 15]
ys = [8, 2, 9]
plt.scatter(xs, ys, c='r', s=50)
plt.show()
{{ :nsi:modules:graphique_matplotlib_4.png?direct&400|}}
On peut également préciser une couleur et une taille différente pour chaque points :
import matplotlib.pyplot as plt
xs = [4, 10, 15]
ys = [8, 2, 9]
tailles = [50, 200, 100]
couleurs = ['b', 'r', 'b']
plt.scatter(xs, ys, c=couleurs, s=tailles)
plt.show()
{{ :nsi:modules:graphique_matplotlib_5.png?direct&400|}}
===== Diagramme en bâtons =====
* ''xs'' correspond aux positions x des barres,
* ''hs'' sont les hauteurs des barres
* ''width'' est la largeur des barres
* ''color'' est une couleur donnée ici en RGB
* ''edgecolor'' est la couleur des bords
* ''linewidth'' est l'épaisseur des bords
import matplotlib.pyplot as plt
xs = [4, 5, 7, 9, 10]
hs = [8, 12, 9, 6, 5]
plt.bar(xs, hs, width=1, color='#aaaaff', edgecolor='k', linewidth=3)
plt.show()
{{ :nsi:modules:graphique_matplotlib_6.png?direct&400|}}
Dans les fonctions ''plot'', ''scatter'' ou ''bar'', les arguments qui s'écrivent sous forme ''clé = valeur'' sont toujours optionnels.
On peut alterner les couleurs. Il suffit de donner deux couleurs au lieu d'une, dans une tableau.
On peut également attribuer une étiquette à chaque barre.
import matplotlib.pyplot as plt
xs = [4, 5, 7, 9, 10]
hs = [8, 12, 9, 6, 5]
labels = ["A", "B", "C", "D", "E"]
plt.bar(xs, hs, width=1, color=['#aaaaff', 'b'], edgecolor='k', linewidth=3)
plt.xticks(xs, labels)
plt.show()
{{ :nsi:modules:graphique_matplotlib_7.png?direct&400|}}
===== Afficher une image =====
Considérons l'image {{ :nsi:modules:france.png?linkonly |}} d'une carte de la France physique.
Pour l'afficher avec matplotlib, il nous faudra un module supplémentaire.
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('france.png')
plt.imshow(img)
plt.show()
{{ :nsi:modules:graphique_matplotlib_8.png?direct&400|}}
Il est possible de cumuler plusieurs graphiques. Par exemple on pourrait ajouter des points à la carte.
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('france.png')
plt.imshow(img)
xs = [600, 800, 600]
ys = [400, 800,220]
tailles = [100, 80, 50]
plt.scatter(xs,ys,s=tailles)
plt.show()
{{ :nsi:modules:graphique_matplotlib_9.png?direct&400|}}
Vous pouvez consulter [[nsi:modules:points_sur_une_carte|cette fiche]] pour voir comment ajouter des points sur la carte à partir de coordonnées GPS.