Graphiques

La bibliothèque standard de Python ne permet pas de manipuler des images, ni de dessiner des graphes de fonctions par exemple. Pour ça, il faut installer des bibliothèques supplémentaires.

Le module matplotlib est la solution habituelle pour les graphes de fonctions, les nuages de points, les histogrammes, etc. Il est intégré à la distribution scipy qui rassemble tout le nécessaire pour le calcul scientique. On trouve tout ça par défaut dans EduPython, Anaconda, etc.

Si ce n’est pas intallé dans votre établissement, vous pouvez le demander : il ne faut pas s’en priver.

Les bases

On va utiliser la surcouche pylab, qui réunit le module numpy (pour travailler efficacement sur des tableaux de nombres) et matplotlib.pyplot (pour générer les graphiques).

La règle: on dessine avec plot, on affiche avec show.

   1 import pylab as pl
   2 pl.plot(0,0,'ob') # on trace le point de coordonnées (0,0) comme un rond ('o') bleu ('b')
   3 pl.show()

Magnifique, non ?

Pour dessiner une courbe au lieu d’un point, il suffit de donner la liste des abscisses et celle des ordonnées.

Par exemple :

   1 def dessine_cercle(nb_segments):
   2         from math import pi, cos, sin
   3         lx = ()
   4         ly = ()
   5         for i in range(nb_segments+1):
   6                 lx = lx + (cos(2*i*pi/100),)
   7                 ly = ly + (sin(2*i*pi/100),)
   8         pl.plot(lx,ly,'b')
   9         pl.show()

C’est un peu fastidieux, mais on peut faire mieux, grâce au système de calcul matriciel de numpy, façon Matlab.

Générer des tableaux de coordonnées

   1 def dessine_cercle(nb_segments):
   2     theta = pl.linspace(0,2*pl.pi,nb_segments+1)
   3     x = pl.cos(theta)
   4     y = pl.sin(theta)
   5     pl.plot(x,y,'b')
   6     pl.show()

Ici theta est un tableau numpy, contenant nb_segments+1 valeurs uniformément réparties de 0 à 2π, et on applique les fonctions cos et sin case par case, grâce aux versions adhoc fournies par le module.

On peut aussi générer un tableau en donnant un pas plutôt qu’un nombre de valeurs :

   1 x = pl.arange(-pl.pi,pl.pi,.1) # de -π à π, tous les 0,1.
   2 pl.plot(x,pl.sin(x))
   3 pl.show()

Il est important d’utiliser les fonctions sin, cos, etc. en provenance de pylab plutôt que du module math: ces dernières ne sauraient quoi faire d’un tableau. De fait, on a choisi d’importer pylab sous le nom pl pour bien distinguer les choses. On aurait aussi bien pu faire from pylab import * en classe: il faut juste faire attention de ne pas importer les valeurs du module math après.

On peut également appliquer les opérations usuelles (+, -, *, etc.) car le type des tableaux de pylab sait les gérer.

Par exemple:

   1 x = pl.arange(-1,1,.1)
   2 pl.plot(x, x*x+1)
   3 pl.xlabel('x')
   4 pl.ylabel('f(x)=x²+1')
   5 pl.title('Le graphe de la fonction x ↦ x²+1')
   6 pl.show()

Un exemple d’application

   1 from random import randint
   2 from pylab import plot, show, bar
   3 
   4 def tirage_des(n):
   5     "Renvoie un tuple de `n` entiers entre 1 et 6, tirés au hasard."
   6     return (randint(1,6) for i in range(n))
   7 
   8 def somme(l):
   9     "Renvoie la somme des éléments de `l`."
  10     s = 0
  11     for x in l:
  12         s = s+x
  13     return s
  14 
  15 def compte(l,x):
  16     "Renvoie le nombre d’occurrences de `x` dans `l`."
  17     nb = 0
  18     for y in l:
  19         if x == y:
  20             nb = nb+1
  21     return nb
  22 
  23 def affiche_fréquence_sommes(d,n):
  24     "Affiche le graphe des fréquences des sommes obtenues en lançant `n` fois `d` dés."
  25     tirages = [tirage_des(d) for i in range(n)]
  26     sommes = [somme(t) for t in tirages]
  27     valeurs = range(min(sommes),max(sommes)+1)
  28     fréquences = [compte(sommes,v)/n for v in valeurs]
  29     plot(valeurs, fréquences)
  30     show()

Bien d’autres choses sont possibles : le réseau regorge de ressources sur le sujet.

On peut par exemple se reporter aux activités conçues par Hubert Raymondaud publiées sur MathémaTICE.

EnsInfo: Dessiner des graphes de fonctions (et plein d’autres choses) (last edited 2019-01-23 14:51:46 by LionelVaux)