====== 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.