Main

Retour vers le tutoriel complet

Affichage d'une liste de coordonnées : courbes (x,y)

Soit des vecteurs x et y de même tailles, par exemple:

x = np.linspace(0,10,20)   # 20 points entre 0 et 10
y1 = x*x + 2*x             # la fonction a tracer
y2 = np.sqrt(x)            # la fonction a tracer

import matplotlib.pyplot as pl

pl.figure()               # creation d'une figure
pl.plot(x,y1)
pl.plot(x,y2)

Avec

  x
  Out[23]: 
  array([  0.        ,   0.52631579,   1.05263158,   1.57894737,
         2.10526316,   2.63157895,   3.15789474,   3.68421053,
         4.21052632,   4.73684211,   5.26315789,   5.78947368,
         6.31578947,   6.84210526,   7.36842105,   7.89473684,
         8.42105263,   8.94736842,   9.47368421,  10.        ])
  y1
  Out[25]: 
  array([   0.        ,    1.32963989,    3.2132964 ,    5.65096953,
          8.64265928,   12.18836565,   16.28808864,   20.94182825,
         26.14958449,   31.91135734,   38.22714681,   45.09695291,
         52.52077562,   60.49861496,   69.03047091,   78.11634349,
         87.75623269,   97.9501385 ,  108.69806094,  120.        ])

Résultat:

  • Par défaut les courbes se superposent (si on trace plusieurs choses dans la même fenêtre)
  • Plusieurs fenêtres = plusieurs appels à pl.figure()

Puis affichage de plusieurs courbes juxtaposées dans une fenêtre:

import matplotlib.pyplot as pl

pl.figure()               # creation d'une figure
pl.subplot(1,2,1)         # division de la fenetre en une matrice 1x2
pl.plot(x,y1,'g--', label='$y = x^2+2x$')
                          # affichage de la courbe + style + etiquette
pl.legend(loc=0)
pl.subplot(1,2,2)
pl.plot(x,y2, 'r*-', label='$y = \sqrt{x}$')
pl.legend(loc=2)          # affichage de la légende en haut a gauche
pl.show()                 # affichage de la fenetre

Affichage d'un nuage de points

Les données ont la même forme que précédemment, mais on souhaite afficher un nuage de point

x = np.linspace(0,5,50)
y = x*x + 2*x
yb = y + np.random.randn(x.shape[0]) *3            # la fonction a tracer

pl.figure()               # creation d'une figure
pl.plot(x,yb, '+')    # simple ajout d'une fonction de style

Pour aller plus loin avec les nuages de points (tailles des points, couleurs des points,...):

pl.figure()               # creation d'une figure
pl.scatter(x,yb, 20 - (y-yb)**2) # jouer avec le rayon des points du nuage

pl.figure()               # creation d'une figure
pl.scatter(x,yb, c = np.abs(y-yb )) # jouer avec les couleurs des points du nuage

Pour aller encore plus loin dans les interactions: lien

Affichage d'une matrice

Les grosses matrices (au delà de 20x20) sont difficiles à "explorer"... Une solution consiste à les afficher dans une figure pour étudier leur allure générale:

C = np.random.rand(5,10) # grosse matrice
pl.figure()
pl.imshow(C, interpolation='nearest')                # affichage sour forme d'image
                            # les couleurs correspondent aux valeurs
pl.colorbar()               # legende
pl.show()

Histogramme

Fonction de gestion des histogrammes:

a = np.random.randn(1000)
pl.hist(a)                     # 10 catégories par défaut

Sauvegarder la figure courante

Vraiment très simple (et très utile pour les rapports)

savefig('foo.pdf')

Affichage sur des données INSEE sur le salaire en fonction du diplôme et du sexe

Données brutes disponibles ici

Données mises en forme: ici

Correspondances des lignes:

  • Aucun ou Certificat d’études primaires
  • Brevet des collèges
  • CAP ou BEP
  • Baccalauréat
  • IUT, BTS, diplôme de 1er cycle universitaire (DEUG, L1, L2) ou diplôme équivalent
  • Diplôme supérieur à Baccalauréat +2
  • Diplôme de 2ème ou 3ème cycle universitaire
  • Diplôme d'une grande école (ingénieur, commerce)

Correspondances des colonnes:

  • Moyenne des heures travaillées
  • Salaire horaire
  • 2 colonnes répétées 3 fois: Ensemble, Femmes, Homme

Chargement des données:

import numpy as np
import matplotlib.pyplot as plt

data = np.loadtxt("dataSalaire.csv", delimiter=';')

Questions

  • A l'aide de la méthode scatter, tracer les salaires moyens en fonction des diplômes pour:
    NB: dans un premier temps, on trace le salaire en fonction de l'indice de ligne
    • L'ensemble de la population (en vert)
    • Les femmes (en rose)
    • Les hommes (en bleu)
  • Ajouter des titres sur les axes (xlabel, ylabel)
  • Modifier l'axe des x pour afficher le diplôme (il suffit de suivre le code ci-dessous)
fig = plt.figure() # astuce: récupération d'un pointeur pour pouvoir modifier
p = fig.add_subplot(111)
[...]
diplomes = ["Aucun", "BEPC", "CAP/BEP", "Bac", "IUT, BTS, DEUG", ">Bac+2", "Master/Phd", "Ecole Ing/com"]

p.set_xticks(np.arange(data.shape[0])) # où positionner les étiquettes
lab = p.set_xticklabels(diplomes)
plt.xlabel(U"Diplome", fontsize=20)
plt.setp(lab, rotation=45, fontsize=10)