Découverte de matplotlib

Introduction :

Parfois il peut être utile de visualiser des données et notamment sous forme de graphique.

Une des bibliothèques utilisée pour ça c’est matplotlib. (documentation : https://matplotlib.org/ )

Comme d’habitude : pip install matplotlib   

Comment ça marche ? Commençons par un exemple :

from matplotlib import pyplot as plt

x = [1, 2, 3, 6]
y = [1, 4, 9, 36]
plt.plot(x, y)
plt.show()

Vous devriez obtenir la résultat suivant :

Il existe de nombre argument qu’on peut passer à la méthode plot. En voici quelques uns :

from matplotlib import pyplot as plt

# Liste des points
x = [1, 2, 3, 6]
y = [1, 4, 9, 36]

plt.title('Mon beau graphe')

# Création du graphe
plt.plot(
    x,
    y,
    color = 'red',              # Couleur du trait
    linestyle = 'dashed',       # Style du trait
    linewidth = 1,              # épaisseur du trait
    marker = '+',               # Marqueur
    markeredgecolor = 'blue',   # Couleur du marqueur
    markersize = 10             # Taille du marqueur
    )

# Pour afficher le graphe courant :
plt.show()

Qui donne :

 

Ou :

from matplotlib import pyplot as plt

x = [1, 3, 2, 3]
y = [4, 8, 5, 4]

plt.title('Mon autre beau graphe')

# Limite des axes :
plt.xlim(0, 4)
plt.ylim(0, 10)

plt.plot(
    x,
    y,              
    linestyle = 'none',       
    marker = 'o',               
    markerfacecolor = 'red',   
    markersize = 10             
    )

plt.show()

Qui donne :

Un dernier exemple :

from matplotlib import pyplot as plt

x = [x / 2.0 for x in range(10)]
y = [i ** 2 for i in x]
z = [ j ** 3 for j in x]

plt.title('Dernier exemple avec deux courbes')


graphe1, = plt.plot(
    x,
    z,
    color = 'red',
    linewidth = 1,
    markerfacecolor = 'blue',
    markersize = 5
    )

# scatter pour un nuage de points
graphe2 = plt.scatter(
    x,
    y,
    color = 'blue',
    marker = 'D',
    s = 30
    )

# lable des axes
plt.xlabel('Coordonnées en X')
plt.ylabel('Coordonnées en Y')

#Affichage d'une légende
plt.legend([graphe1, graphe2], ['cube', 'parabole'])

# Un annotation avec une flêche
plt.annotate('Premier point', xy = (0, 0), xytext = (1, 10),
                arrowprops = {'facecolor': 'red', 'shrink': 0.1})
plt.grid()
plt.show()

Qui donne :

Vous trouverez un bon nombre d’information que matplotlib, ici : http://www.python-simple.com/python-matplotlib/pyplot.php

Le TP

(Cette partie du TP est directement inspirée d’un TP proposé par un collègue : https://mathonomie.com/ )

Pour réaliser ce TP commencez par créer un dossier et appelez le TP_mignon. Téléchargez le fichier suivant :

et placez le dans le dossier précédemment crée.

Téléchargez le fichier suivant :

et placez le dans le même dossier. (changez l’extension .txt en .py)

 

 

Corrigé de l'exercice

Ne regardez pas trop vite le corrigé !

Le code :

import matplotlib.pyplot as plt 

tuning = [('noir', 'black'),
          ('jaune', 'yellow'),
          ('bleu', 'b'),
          ('truc','white')]


def lecture(nom_du_fichier) :
    # initialisation : liste vide
    liste = []

    # ouverture du fichier en lecture -> 'r'
    with open(nom_du_fichier, 'r') as fichier:

        # on récupère le contenu
        texte = fichier.read()
        
        # on le separe en lignes
        lignes = texte.split(sep = '\n')

        # on parcourt les lignes
        for phrase in lignes:
            
            # on découpe la phrase en trois morceaux dans une liste
            # attention dans ce csv le séparateur
            # est un virgule , et pas un ;
            liste_de_trois = phrase.split(sep = ",")

            if len(liste_de_trois) == 3:
                # un nouveau dico vide appelé new
                new = {}

                new['espece'] = liste_de_trois[2]
                
                # attention : à convertir en entiers
                # le premier élément de la liste
                new['abscisse'] = int(liste_de_trois[0])

                # le deuxième élément de la liste
                new['ordonnee'] = int(liste_de_trois[1])

                # on rajoute new à la liste
                liste.append(new)
                
        # on ferme le fichier ouvert
        fichier.close()
        
    # on renvoie la liste remplie
    return liste

liste = lecture("dessin.csv")

for spec, couleur in tuning:
    # données
    x=[]
    y=[]
    for f in liste :
        if f['espece'] == spec:
            x.append(f['abscisse'])
            y.append(f['ordonnee'])
    plt.scatter(x, y, color = couleur, label = spec, marker = 's')

# graphique 
plt.legend()
plt.show()

Et cela donne :