Infoforall

Python 19 : Création de graphiques avec pyplot

Cette partie vous montrera comment parvenir à afficher des graphiques, que les données soient des données expérimentales ou des fonctions mathématiques.

1 - Installation de matplotlib

Il faut falloir installer matplotlib, si ce n'est pas déjà fait.

Pour vérifier si vous l'avez déjà installé, il suffit d'ouvrir la console Python de IDLE et de taper :

>>> import matplotlib

Si vous n'avez pas de message d'erreur, c'est que c'est bon.

Sinon, il va falloir penser à l'installer. Si Python et ses scripts ne sont pas dans votre variable système Path, il faut ouvrir votre console et aller dans le répertoire Scripts de Python qui contient le fichier pip.py.

Si vous ne savez pas comment on peut faire cela, utiliser le tutoriel ci-dessous.

Une fois que vous avez rajouté le chemin d'accès dans Path ou que vous avez réussi à atteindre le dossier depuis la console avec des commandes change dir (cd) multiples, il suffit de lancer l'installation :

C:\Users\ho\pip install matplotlib

Si vous voulez connaitre les bibliothèques déjà installé, il suffit de taper :

C:\Users\ho\pip freeze

Vous aurez alors la liste des bibliothèques supplémentaires installées ainsi que leurs versions.

2 - Module pyplot de matplotlib

Nous allons maintenant pouvoir commencer à tracer des choses.

Pour cela, nous allons importer l'un des modules contenant dans matplotlib : pyplot, py pour Python, plot pour tracer.

Pour ne pas à avoir à noter matplotlib.pyplot. à chaque fois que nous allons utiliser l'une des méthodes et fonctions du module, nous allons utiliser un alias lors de l'importation. L'alias courant est plt.

01° Utiliser le code suivant pour tracer votre premier graphique.

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

x = [0,1,2,3,4,5,6,7,8,9,10]

y = [i*i for i in x]

print (x)

print (y)

plt.plot(x,y)

plt.show()

Rappel : un ensemble de données séparées par des virgules et entourées par des crochets [ ] est une liste.

Vous devriez obtenir quelque chose proche de ceci :

Graphique pyplot

Quelques explications :

02° Placer # devant la dernière ligne pour prouver son utilité.

03° Utiliser les boutons situées sous le graphique. Vous devriez voir qu'on peut zoomer, enregistrer le graphique directement dans un format image...

Pas mal pour quelques lignes de codes non ?

La documentation officielle de pyplot se trouve ICI : http://matplotlib.org/api/pyplot_summary.html.

Le but ici n'est pas de voir tout ce qu'on peut faire avec pyplot mais bien d'en présenter les grandes lignes uniquement.

La documentation sur plot() se trouve facilement dans la liste : ICI : http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot.

04° Utiliser la documentation pour afficher une courbe rouge composée de pointillés.

Graphique pyplot

05° Utiliser successivement les codes suivants où on ne donne que y. Pourquoi est-ce que ça marche pour le premier mais pas pour le second ?

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

x = [0,1,2,3,4,5,6,7,8,9,10]

y = [i*i for i in x]

plt.plot(y, 'k+')

plt.show()

Donne :

Graphique pyplot

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

x = [10,11,12,13,14,15,16,17,18,19,20]

y = [i*i for i in x]

plt.plot(y, 'k+')

plt.show()

Donne :

Graphique pyplot

Si vous n'avez pas vu l'information dans la documentation, le fait de n'envoyer qu'une seule liste crée un graphique où l'abscisse correspond au numéro de l'éléement de la liste. Ainsi, le premier élement porte l'élément 0, le suivant 1... Donc, puisque x est également une liste variant de 0 à 10, ça ne pose pas de problème. Par contre, pour le deuxième cas, les valeurs réelles de x varient de 10 à 20. Mais, comme on ne donne que y, Python place la première valeur de y à une abscisse de 0, la seconde à 2 ...

Pour avoir les bonnes valeurs en abscisse, il faut envoyer x également.

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

x = [10,11,12,13,14,15,16,17,18,19,20]

y = [i*i for i in x]

plt.plot(x,y, 'k+')

plt.show()

Graphique pyplot

D'autres types de graphiques sont disponibles :

Les diagrammes à barres à l'aide de hist().

Nous allons créer un programme qui crée une liste z au hasard.

Rappel : Une courte description du module random se trouve dans l'activité Python-Canvas.

06° Analyser le code suivant pour comprendre ce qu'il faut. Utiliser le puis augmenter le nombre de tirage du dé 6 pour montrer que la répartition entre les différentes possibilités s'uniformise avec un très grand nombre de lancés.

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

import random

valeurs = [1,2,3,4,5,6]

z = [random.choice(valeurs) for i in range(10)]

plt.hist(z, bins=6, range = (1,6))

plt.show()

On tire 10 dés à 6 faces (10d6)

Graphique pyplot

Si on lance un million de D6 :

Graphique pyplot

Les diagrammes à barres à l'aide de bar().

Cette fonction permet de tracer des diagrammes à barres à l'aide de deux listes ou tableaux x et y. Le premier contient les valeurs des abscisses x[i] et le second la hauteur y[i] de la barre correspondante.

On peut régler la largeur des barres à l'aide de width.

07° Utiliser le code suivant qui génére une liste x commençant à 10, et une liste y comprenant des valeurs entières tirées au hasard entre 0 et 100.

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

import random

x = [i for i in range(10,30,2)]

y = [random.randint(0,100) for i in x]

print(x)

print(y)

plt.bar(x,y,width=1)

plt.show()

Exemple 1 dont on donne les valeurs contenues dans les listes x et y :

Graphique pyplot Graphique pyplot

Exemple 2 dont on donne les valeurs contenues dans les listes x et y :

Graphique pyplot Graphique pyplot

08° Regardons ce qui se passe si on lance deux plot à la suite l'un de l'autre.

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

x = [0,1,2,3,4,5,6,7,8,9,10]

y = [i*i for i in x]

y2 = [i**3 for i in x]

print (x)

print (y)

print(y2)


plt.plot(x,y)

plt.plot(x,y2)


plt.show()

Graphique pyplot

Il nous reste à voir quelques dernières fonctions permettant de modifier les axes et de rajouter des informations sur les axes par exemple.

Pour rajouter un TITRE : plt.title("Mon titre").

Pour rajouter un LABEL sur l'axe x : plt.xlabel("Label sur cet axe"). On notera que x n'est pas le nom de la série mais bien le nom de la fonction. Comme il s'agit de l'abscisse, le créateur de la fonction a utilisé x.

Pour rajouter un LABEL sur l'axe y : plt.ylabel("Label sur cet axe").On notera que y n'est pas le nom de la série mais bien le nom de la fonction. Comme il s'agit de l'ordonnée, le créateur de la fonction a utilisé y.

Pour définir la largeur et la couleur de l'axe des abscisses : plt.axhline(linewidth=1,color="r") pour créer un axe Ox rouge de largeur 1.

Pour définir la largeur et la couleur de l'axe des ordonnées : plt.axvline(linewidth=2,color="g") pour créer un axe Oy vert de largeur 2.

Pouur gérer les valeurs minimales et maximales des axes x et y : plt.axis([xmin,xmax,ymin,ymax]), il faut donc faire attention à l'ordre des arguments transmis.

Pour imposer un repère orthonormé : plt.axis('equal').

Pour choisir les graduations sur l'axe des abscisses : plt.xticks([0,1,2,3,4,5]).

Pour choisir les graduations sur l'axe des ordonnés : plt.yticks([0,1,2,3,4,5]).

Et finalement, pour fermer le graphique : plt.close().

09° Utilisez les indications ci-dessus pour tracer la fonction f(x)= 4x² - 10 x + 2 sur l'intervalle [-10;+10].

Graphique pyplot

Une proposition de correction :

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt


def ma_fonction(x):

    return(4*(x**2)-10*x+2)


x = [i/10 for i in range(-100,101,1)]

y = [ma_fonction(i) for i in x]

plt.plot(x,y)

plt.title("Représentation de f(x)")

plt.xlabel("Abscisse x")

plt.ylabel("Ordonnée y")

plt.yticks([0,100,200,500])


plt.show()

3 - Module math

Comme nous traçons des graphiques, autant parler des fonctions mathématiques qui vous permettront de demander à Python d'utiliser quelques fonctions mathématiques.

Il faut pour cela importer le module math à l'aide par exemple de import math.

Voilà les noms des fonctions (informatiques) permettant de trouver la valeur des fonctions mathématiques.

10° Utiliser pyplot pour afficher les deux premières fonctions ci-dessous.

La racine carrée de x : math.sqrt(x).

Graphique pyplot

La partie entière de x : math.floor(x).

Graphique pyplot

La valeur absolue |x| de x : math.fabs(x).

Graphique pyplot

Le factoriel x! de x : math.factorial(x).

Graphique pyplot

L'exponentielle ex de x : math.exp(x).

Graphique pyplot

Le logarithme népérien ln(x) de x : math.log(x).

Graphique pyplot

Les fonctions trigonométriques portent un nom assez explicite pour ne pas rentrer dans les détails :

Par contre, attention : x est l'angle défini en radians. Pour convertir des degrés en radians, il faut utiliser math.radians(angle_en_degre).

De la même façon, transformer un angle en radians en degrés nécessite math.degrees(angle_en_radians).

Si vous cherchez pi, il faut utiliser math.pi.Au passage, la constante de Neper e = exp(1) se note math.e.

Graphique pyplot

On remarquera que le calcul étant numérique, Python gère mal les discontinuités.

Le cosinus hyperbolique de x : math.cosh(x).

Le sinus hyperbolique de x : math.sinh(x).

La tangente hyperbolique de x : math.tanh(x).

Graphique pyplot

Voici les codes pour afficher les différents graphiques ci-dessus :

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

import math

def ma_fonction(x):

    return(math.sqrt(x))

x = [i/100 for i in range(0,1001,1)]

y = [ma_fonction(i) for i in x]

plt.plot(x,y)

plt.title("Racine carrée de x")

plt.xlabel("Abscisse x")

plt.ylabel("Ordonnée y")

plt.show()

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

import math

def ma_fonction(x):

    return(math.floor(x))

x = [i/100 for i in range(-1000,1001,1)]

y = [ma_fonction(i) for i in x]

plt.plot(x,y)

plt.title("Partie entière de x")

plt.xlabel("Abscisse x")

plt.ylabel("Ordonnée y")

plt.show()

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

import math

def ma_fonction(x):

    return(math.fabs(x))

x = [i/100 for i in range(-1000,1001,1)]

y = [ma_fonction(i) for i in x]

plt.plot(x,y)

plt.title("Valeur absolue de x")

plt.xlabel("Abscisse x")

plt.ylabel("Ordonnée y")

plt.show()

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

import math

def ma_fonction(x):

    return(math.factorial(x))

x = [i/100 for i in range(100,500,1)]

y = [ma_fonction(math.floor(i)) for i in x]

plt.plot(x,y)

plt.title("Factorielle de x")

plt.xlabel("Abscisse x")

plt.ylabel("Ordonnée y")

plt.xticks([1,2,3,4,5])

plt.show()

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

import math

def ma_fonction(x):

    return(math.exp(x))

x = [i/100 for i in range(-1000,1001,1)]

y = [ma_fonction(i) for i in x]

plt.plot(x,y)

plt.title("Exponentielle de x")

plt.xlabel("Abscisse x")

plt.ylabel("Ordonnée y")

plt.show()

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

import math

def ma_fonction(x):

    return(math.log(x))

x = [i/100 for i in range(1,1001,1)]

y = [ma_fonction(i) for i in x]

plt.plot(x,y)

plt.title("Logarithme (népérien) de x")

plt.xlabel("Abscisse x")

plt.ylabel("Ordonnée y")

plt.show()

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

import math

def ma_fonction1(x):

    return(math.sin(x))

def ma_fonction2(x):

    return(math.cos(x))

def ma_fonction3(x):

    return(math.tan(x))

x = [i/100 for i in range(0,36100,1)]

y = [ma_fonction1(math.radians(i)) for i in x]

y2 = [ma_fonction2(math.radians(i)) for i in x]

y3 = [ma_fonction3(math.radians(i)) for i in x]

plt.plot(x,y,'b')

plt.plot(x,y2,'g')

plt.plot(x,y3,'r')

plt.title("sin(x) en bleu, cos(x) en vert et tan(x) en rouge")

plt.xlabel("Abscisse x")

plt.ylabel("Ordonnée y")

plt.axis([0,360,-3,3])

plt.show()

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt

import math

def ma_fonction1(x):

    return(math.sinh(x))

def ma_fonction2(x):

    return(math.cosh(x))

def ma_fonction3(x):

    return(math.tanh(x))

x = [i/100 for i in range(-1000,1001,1)]

y = [ma_fonction1(i) for i in x]

y2 = [ma_fonction2(i) for i in x]

y3 = [ma_fonction3(i) for i in x]

plt.plot(x,y,'b')

plt.plot(x,y2,'g')

plt.plot(x,y3,'r')

plt.title("sinh(x) en bleu, cosh(x) en vert et tanh(x) en rouge")

plt.xlabel("Abscisse x")

plt.ylabel("Ordonnée y")

plt.axis([-10,10,-10,10])

plt.show()

4 - Rappel et compléments sur les listes

Première rencontre avec les listes

Qu'est qu'une liste ? C'est une suite ordonnée et modifiable (mutable) d'objets ou variables quelconques.

On peut donc dire que le string est sorte de liste en fait (mais le string n'est pas modifiable après création, contrairement aux listes). Une liste qui ne contient que des variables de type char, et qui n'est pas modifiable elle. Mais une sorte de liste néanmoins. Vous allez voir qu'on retrouve beaucoup de choses vues avec les strings d'ailleurs.

Les éléments d'une liste sont séparés par des virgules et la définition de la liste commence avec [ et s'arrête avec ].

ma_liste = [1,'a',45.2,"bonjour",'b'] crée une liste de 5 éléments contenant l'integer 1, le char a, le float 45.2, le string bonjour et le char b.

Si on veut afficher une liste, print(ma_liste) fonctionne.

[1,'a',45.2,'bonjour','b"]

Si on veut connaitre le nombre d'éléments dans une liste, len(ma_liste) fonctionne.

5

Si on veut accéder à l'un des éléments d'une liste, on tapera ma_liste[2], mais attention le premier élément est l'élément 0.

Si on demande print(ma_liste[2]) avec ma_liste = [1,'a',45.2,"bonjour",'b'], on obtient :

45.2

Si on veut accéder à un ensemble d'éléments d'une liste, on tapera ma_liste[1:4], et on aura les éléments 1,2 et 3 (car on a une commande du type i<4).

Si on demande print(ma_liste[1:4]) avec ma_liste = [1,'a',45.2,"bonjour",'b'], on obtient :

['a',45.2,'bonjour']

Pour parcourir une liste, il suffit d'utiliser un for.

for i in ma_liste:

    print(i)

Et on obtient alors

1

a

45.2

bonjour

b

Deuxième rencontre avec les listes

Si on veut rajouter un élément à la fin de la liste ma_liste, on utilise ma_liste.append(x) où x est l'élément à rajouter.

Si on utilise ma_liste.append('nouveau') avec ma_liste = [1,'a',45.2,"bonjour",'b'], on obtient :

['a',45.2,'bonjour','b','nouveau']

Mais on peut utiliser également un simple + entre deux listes. Attention néanmoins : on crée alors une nouvelle liste qui n'aura pas la même adresse que la précédente contrairement à l'utilisation de la méthode append.

Si on utilise ma_liste = ma_liste + ['nouveau'] avec ma_liste = [1,'a',45.2,"bonjour",'b'], on obtient :

['a',45.2,'bonjour','b','nouveau']

Si on veut rajouter un élément à une position particulière i dans la liste, on utilise ma_liste.insert(i,x) où x est l'élément à rajouter et i l'index dans la liste.

Si on utilise ma_liste.insert(1,'nouveau') avec ma_liste = [1,'a',45.2,"bonjour",'b','nouveau'], on obtient :

['a','nouveau',45.2,'bonjour','b','nouveau']

Souvenez-vous que l'index du premier élément est 0, pas 1.

Si i dépasse l'index, x sera ajouté en fin de liste.

Si on veut supprimer un élément x, on utilise ma_liste.remove(x) où x est l'élément à supprimer dans la liste.

Si on utilise ma_liste.remove('nouveau') avec ma_liste = [1,'nouveau','a',45.2,"bonjour",'b','nouveau'], on obtient :

[1,'a',45.2,"bonjour",'b','nouveau']

On remarquera donc qu'il ne supprime que le premier élément 'nouveau' rencontré. S'il y en a d'autres, il faudra faire d'autres remove.

Justement, si on connaitre le nombre de fois où un élément x apparait dans une liste, on utilise ma_liste.count(x) où x est l'élément à surveiller dans la liste.

Si on utilise ma_liste.count('nouveau') avec ma_liste = [1,'nouveau','a',45.2,"bonjour",'b','nouveau'], on obtient :

2

Enfin, si on utilise ma_liste.sort(), on ordonne les éléments de la liste ma_liste.

Troisième rencontre avec les listes

Nous voulons faire des calculs avec les données récoltées.

Pour trouver la valeur maximale dans une liste purement numérique, on utilise max(liste).

Pour trouver la valeur minimale dans une liste purement numérique, on utilise min(liste).

Pour trouver la somme des éléments d'une liste, on utilise sum(liste).

Voilà un exemple des cas précédents et un moyen de calculer une valeur moyenne du coup.

>>> liste=[1,2,3,4,5]

>>> liste = [1,3,5,2,4]

>>> max(liste)

5

>>> min(liste)

1

>>> sum(liste)

15

>>> len(liste)

5

>>> valeur_moyenne = sum(liste)/len(liste)

>>> valeur_moyenne

3.0

>>>

5 - Interaction entre Python et un tableur

En soit, ce que nous venons de créer n'a rien d'extraordinaire. Les tableurs peuvent faire la même chose sans aucun problème. La force de Python vient surtout de ce qu'on peut faire en plus : gérer les données avec un code, en mettre certaines de côté, faire des interfaces, ect ...

Or, il existe un moyen simple de faire communiquer votre tableur préféré et votre programme Python. Il existe un format particulier de fichier texte, prévu pour enregistrer les données des tableurs en suivant une codification simple :

Dans un fichier csv, les données d'une ligne sont écrites sur une ligne unique et sont séparées par des points-virgules.

Csv veut dire comma-separated values.

A titre d'exemple, voici une copie d'écran d'un tableur contenant les données issues d'une acquisition vidéo visualisant une voiture en mouvement : on a le temps correspondant à l'image, la position horizontale x et la position verticale y de la voiture.

Tableur

En faisant ENREGISTRER SOUS et en sélectionnant csv, vous allez obtenir un fichier texte que vous pourrez ouvrir avec le tableur, avec un lecteur de fichier texte basique ou Notepad++ par exemple. Que contient-il ? Ceci :

t(s);x(m);y(m)

0,000;0,001;-0,001

0,100;0,061;0,000

0,200;0,139;-0,001

0,300;0,227;-0,002

0,400;0,318;-0,001

0,500;0,412;-0,001

0,600;0,506;-0,002

0,700;0,600;-0,001

0,800;0,688;-0,002

0,900;0,774;-0,003

1,000;0,855;-0,002

1,100;0,935;-0,004

1,200;1,019;-0,007

1,300;1,105;-0,009

1,400;1,194;-0,011

1,500;1,283;-0,012

1,600;1,371;-0,014

Comme on peut le voir chaque ligne du tableur correspond à une ligne du fichier texte. Et chaque donnée-colonne est séparée des autres par un point-virgule.

11° Créer des données dans le tableur que vous voulez. Les données seront bien présentées en colonne comme dans l'exemple présenté. La première ligne doit contenir les intitulés des données placées en dessous. Enregister les données en csv sous le nom "essai_csv.csv".

Bien, nous avons réussi à créer un fichier csv avec le tableur. Comment parvenir à récupérer les données de "essai_csv.csv" dans Python ?

C'est un fichier texte. On peut donc y accéder avec les méthodes open(), read(), readlines() ou readline() classiques. Il existe un module Python qui fait beaucoup de choses avec ces fichiers. Le module csv justement. On l'importe avec import csv. Nous le détaillerons pas ici car nous n'allons utilisé qu'un décodage basique des informations et les outils basiques seront suffisants. Cela nous permettra de faire quelques révisions d'ailleurs.

#!/usr/bin/env python

# -*- coding: utf-8 -*-

obj_fichier = open("essai_csv.csv","r",encoding='utf-8')


while 1: # La condition est donc toujours True

    ligne = obj_fichier.readline() # On tente de lire la ligne

    if not(ligne): # Si ligne n'existe pas, elle contient False

        break # On sort de la boucle

    else: # Sinon, c'est que ligne contient quelque chose

        print(ligne,end='') # Pour supprimer le passage à la ligne automatique

obj_fichier.close()

input("Appuyez sur ENTREE")

12° Tester ce code pour vérifier qu'il fonctionne bien.

Bon, le désavantage de cette méthode est que si un problème survient lors de la lecture, le programme va planter et le fichier sera mal refermé. Et là, il est possible que les données soient perdues, corrompues.

Nous allons compliquer les choses en présentant la méthode usuelle : on associe un open avec un opérateur with. Cette méthode garantit la fermeture correcte des fichiers en cas d'erreurs.

#!/usr/bin/env python

# -*- coding: utf-8 -*-

with open("essai_csv.csv","r",encoding='utf-8') as obj_fichier:

    while 1: # La condition est donc toujours True

        ligne = obj_fichier.readline() # On tente de lire la ligne

        if not(ligne): # Si ligne n'existe pas, elle contient False

            break # On sort de la boucle

        else: # Sinon, c'est que ligne contient quelque chose

            print(ligne,end='') # Pour supprimer le passage à la ligne automatique

obj_fichier.close()

input("Appuyez sur ENTREE")

13° Tester la version avec le with pour voir qu'il fournit la même chose tant que tout va bien.

Il nous reste à stocker les données pour pouvoir en faire quelque chose. Nous allons les stocker dans deux listes nommées t,x. Nous n'y stockerons que les valeurs, les intitulés de la première ligne seront stockés ailleurs. Les informations sur y ne seront pas importées dans notre programme pour vous montrer qu'on peut limiter l'importation aux données voulues.

14° Lancer pour comprendre ce que fait le programme suivant :

#!/usr/bin/env python

# -*- coding: utf-8 -*-

t = [] # Création d'une liste vide

x = [] # Création d'une liste vide

with open("essai_csv.csv","r",encoding='utf-8') as obj_fichier:

    while 1: # La condition est donc toujours True

        ligne = obj_fichier.readline() # On tente de lire la ligne

        if not(ligne): # Si ligne n'existe pas, elle contient False

            break # On sort de la boucle

        else: # Sinon, c'est que ligne contient quelque chose

            ligne.replace('\n','') # On supprime le passage à la ligne finale de chaque ligne

            elements = ligne.split(';') # On crée une liste contenant les valeurs de chaque ligne

            for element in elements:

                print(element)

obj_fichier.close()

input("Appuyez sur ENTREE")

15° Voici la dernière étape de ce mini-projet : après être parvenu à lire le fichier csv, nous récupérons les intitulés de la première ligne et nous mettons le reste dans deux listes t et x :

#!/usr/bin/env python

# -*- coding: utf-8 -*-

t = [] # Création d'une liste vide

x = [] # Création d'une liste vide

with open("essai_csv.csv","r",encoding='utf-8') as obj_fichier:

    print("On affiche les listes contenant les lignes du .csv")

    compteur = 0

    while 1: # La condition est donc toujours True

        ligne = obj_fichier.readline() # On tente de lire la ligne

        if not(ligne): # Si ligne n'existe pas, elle contient False

            break # On sort de la boucle

        else: # Sinon, c'est que ligne contient quelque chose

            ligne.replace('\n','') # On supprime le passage à la ligne finale de chaque ligne

            elements = ligne.split(';') # On crée une liste contenant les valeurs de chaque ligne

            print(elements)

            if compteur == 0:

                grandeur_abscisse = elements[0]

                grandeur_ordonnee = elements[1]

            else:

                t.append(elements[0])

                x.append(elements[1])

            compteur += 1

obj_fichier.close()

print("\nOn affiche la liste contenant les temps")

print(t)

print("\nOn affiche la liste contenant les positions")

print(x)

input("Appuyez sur ENTREE")

Avec mes données, cela donne :

On affiche les listes contenant les lignes du .csv

['t(s)', 'x(m)', 'y(m)\n']

['0,000', '0,001', '-0,001\n']

['0,100', '0,061', '0,000\n']

['0,200', '0,139', '-0,001\n']

['0,300', '0,227', '-0,002\n']

['0,400', '0,318', '-0,001\n']

['0,500', '0,412', '-0,001\n']

['0,600', '0,506', '-0,002\n']

['0,700', '0,600', '-0,001\n']

['0,800', '0,688', '-0,002\n']

['0,900', '0,774', '-0,003\n']

['1,000', '0,855', '-0,002\n']

['1,100', '0,935', '-0,004\n']

['1,200', '1,019', '-0,007\n']

['1,300', '1,105', '-0,009\n']

['1,400', '1,194', '-0,011\n']

['1,500', '1,283', '-0,012\n']

['1,600', '1,371', '-0,014\n']


On affiche la liste contenant les temps

['0,000', '0,100', '0,200', '0,300', '0,400', '0,500', '0,600', '0,700', '0,800', '0,900', '1,000', '1,100', '1,200', '1,300', '1,400', '1,500', '1,600']


On affiche la liste contenant les positions

['0,001', '0,061', '0,139', '0,227', '0,318', '0,412', '0,506', '0,600', '0,688', '0,774', '0,855', '0,935', '1,019', '1,105', '1,194', '1,283', '1,371']

Appuyez sur ENTREE

6 - Mini-projet

Utilisons nos connaissances pour exploiter les données fournies par l'analyse de la position de la voiture.

16° Les données stockées dans x et t sont des strings pour l'instant. Modifier le programme à l'aide de la fonction float(string) pour transformer les données en nombres réels.

17° Afficher le graphique de la position en fonction du temps.

Il nous reste à exploiter les données : nous allons tenter de trouver la vitesse instantanée.

Comment ? Et bien la vitesse v2 sur l'image 2 est égale à v2 = (x3-x1) / (t3-t1)

18° Calculer la vitesse sur les images possibles, c'est à dire celles où on dispose des valeurs précédentes et des valeurs suivantes en x et t.

19° Tracer la vitesse en fonction du temps.

20° Enregistrer le tout dans un nouveau fichier csv nommé "vitesse.csv".

Nous voilà à la fin de cette activité. Vous pourrez aller voir le module csv par la suite. Nous verrons qu'on peut également utiliser des tableaux de données plutôt que des listes, à l'aide du module numpy.