Aller au contenu

Les courbes

Pour tracer une courbe simple, il faut deux listes, tableaux de même dimension. Elles correspondent aux données des axes x et y.

Exemple minimal

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

plt.plot(x, y)  # Ajout du d'une courbe
plt.show()  # Affichage d'une courbe

png

Ajout d'un titre au graphique

Pour ajouter un titre au graphique, on utilise la fonction plt.title("...").

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

plt.plot(x, y)  # Ajout du d'une courbe

plt.title("Ma première figure")  # Titre du graphique

plt.show()  # Affichage d'une courbe

png

Ajout des titres des axes

Pour ajouter un titre sur les axes, on utilise les fonctions plt.xlabel("...") et plt.ylabel("...").

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

plt.plot(x, y)  # Ajout du d'une courbe
plt.title("Ma première figure")  # Titre du graphique

plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x

plt.show()  # Affichage d'une courbe

png

Affichage de la grille

Pour afficher la grille, on utilise la fonction plt.grid(True).

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

plt.plot(x, y)  # Ajout du d'une courbe
plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma première figure")  # Titre du graphique

plt.grid(True)  # Affichage de la grille

plt.show()  # Affichage d'une courbe

png

Ajout d'une deuxième courbe et d'une légende

Pour que la légende puisse s'afficher, il faut donner un label à chaque courbe avec le paramètre label="..." dans la fonction plt.plot(...).

Par défaut, la légende se place automatique au mieux sur le graphique.

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y, label="Sinus")  # Ajout du d'une courbe avec label

plt.plot(x, y2, label='Cosinus')  # Ajout d'une deuxième courbe avec label
plt.legend()  # Affichage de la légende

plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma première figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille
plt.show()  # Affichage d'une courbe

png

On peut modifier l'emplacement de la légende avec le paramètre loc=x, xétant la position voulue.
Les différentes positions sont données dans le tableau ci-dessous.

Position Code
'best' 0
'upper right' 1
'upper left' 2
'lower left' 3
'lower right' 4
'right' 5
'center left' 6
'center right' 7
'lower center' 8
'upper center' 9
'center' 10
import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y, label="Sinus")  # Ajout du d'une courbe avec label

plt.plot(x, y2, label='Cosinus')  # Ajout d'une deuxième courbe avec label
plt.legend(loc=9)  # Affichage de la légende

plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma première figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille
plt.show()  # Affichage d'une courbe

png

Sauvegarder le graphique

Il est possible de sauvegarder le graphique sous différents formats (pdf, png, jpeg ...) avec la commande plt.savefig('Nom.pdf'). L'extension du fichier détermine automatique son format.

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y, label="Sinus")  # Ajout du d'une courbe avec label
plt.plot(x, y2, label='Cosinus')  # Ajout d'une deuxième courbe avec label
plt.legend(loc=9)  # Affichage de la légende
plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma première figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille

plt.savefig("Graphique.png", dpi=300)  # Sauvegarde en png avec un dpi de 300

plt.show()  # Affichage d'une courbe

png

Échelle semi-logarithmique et logarithmique

On peut tracer une courbe avec une échelle semi-logarithmique en utilisant la fonction plt.semilogx(x,y)

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0.1, 1000, 100)
y = np.log(x)

plt.semilogx(x, y)  # Ajout du d'une courbe
plt.ylabel('log(x)')  # Titre de l'axe y
plt.xlabel("x")  # Titre de l'axe x
plt.grid(True)  # Affichage de la grille
plt.show()  # Affichage d'une courbe

png

Cela marche aussi pour l'axe des ordonnées avec la fonction plt.semilogy(x,y).

Pour une échelle log-log on utilise la fonction plt.loglog(x,y).

Affichage des points seuls

On peut afficher uniquement les points sans les relier ensemble en rajoutant le paramètre 'o' dans la fonction plt.plot(...).

La liste des marqueurs possibles est disponible à l'adresse suivante : Marqueurs

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 50)
y = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y, '+', label="Sinus")  # Ajout du des points uniquement

plt.plot(x, y2, label='Cosinus')  # Ajout d'une deuxième courbe avec label
plt.legend(loc=9)  # Affichage de la légende
plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma première figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille
plt.show()  # Affichage d'une courbe

png

Axe secondaire

Si les données à afficher sont de dimensions différentes ou d'unités différentes, il est possible de construire un axe secondaire pour différencier ces données.

Création de deux axes y.

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 50)
y = 300*np.sin(x)
y2 = np.cos(x)

# Affichage des données de l'axe principal
fig, ax1 = plt.subplots()

color = 'tab:red'
ax1.set_xlabel('Angle (rad)')
ax1.set_ylabel('Amplitude', color=color)
ax1.plot(x, y, color=color)
ax1.tick_params(axis='y', labelcolor=color)
ax1.grid(True)

# Affichage de l'axe secondaire
ax2 = ax1.twinx()  # Création d'un deuxième axe qui partage le même axe x

color = 'tab:blue'
ax2.set_ylabel('Amplitude')#, color=color)  # Labelde l'axe x
ax2.plot(x, y2, color=color)
#ax2.tick_params(axis='y', labelcolor=color)
ax2.grid(True)


plt.title("Deux axes y")
fig.tight_layout()  # Amélioration de l'affichage
plt.show()

png

Barres verticales et horizontales

Il est parfois nécessaire d'afficher une barre verticale ou horizontale. Pour cela on utilise les fonctions plt.axvline(x=0, ymin=0, ymax=1) et plt.axhline(y=0, xmin=0, xmax=1).

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 50)
y = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y, '+', label="Sinus")  # Ajout du des points uniquement

plt.plot(x, y2, label='Cosinus')  # Ajout d'une deuxième courbe avec label
plt.legend()  # Affichage de la légende
plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma première figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille

plt.axvline(x=np.pi, ymin=0, ymax=1, color="red")  # Barre verticale
plt.axhline(y=-0.5, xmin=0, xmax=1, color="green")  # Barre horizontale

plt.show()  # Affichage d'une courbe

png

Sous figure ou afficher plusieurs graphiques sur la même figure

Il est possible d'afficher plusieurs graphiques côte à côte ou superposés sur la même figure grâce à la fonction plt.subplot(lcp).
Avec comme paramètre 3 chiffres compris entre 1 et 9 pour définir une matrice de graphique avec l le nombre de lignes, c le nombre de colonnes et p l'emplacement où placer le graphique.

Pour éviter les chevauchements des graphiques, on utilise en plus la fonction plt.tight_layout().

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 50)
y = np.sin(x)
y2 = np.cos(x)

plt.subplot(121) # Graphique côte à côte
plt.plot(x, y, '+', label="Sinus")  # Ajout du des points uniquement
plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma première figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille

plt.subplot(122) # Graphique superposé
plt.plot(x, y2, label='Cosinus')  # Ajout d'une deuxième courbe avec label
plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma deuxième figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille

plt.tight_layout() # Adaptation de l'affichage 
plt.show()  # Affichage d'une courbe

png

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 50)
y = np.sin(x)
y2 = np.cos(x)
y3 = np.cos(2*x)

plt.subplot(221) # Graphique matrice 2x2
plt.plot(x, y, '+', label="Sinus")  # Ajout du des points uniquement
plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma première figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille

plt.subplot(222) # Graphique matrice 2x2
plt.plot(x, y2, label='Cosinus')  # Ajout d'une deuxième courbe avec label
plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma deuxième figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille

plt.subplot(223) # Graphique matrice 2x2
plt.plot(x, y3, label='Cosinus')  # Ajout d'une troisème courbe avec label
plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma troisième figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille

plt.tight_layout() # Adaptation de l'affichage 
plt.show()  # Affichage d'une courbe

png

Personnalisation des courbes et autres options

Options d'affichage des lignes

Il est possible de modifier l'affichage des courbes en jouant sur les paramètres suivants (à inclure dans plt.plot(...):

  • lw=1 : épaisseur de ligne (par défaut : 1) ;
  • ls='-' : style de ligne -> ':', '-.', '--' (par défaut : '-' ligne continue) ;
  • marker='.' : type de marqueur pour les points -> '.', 'o', 'x', '+' ... (par défaut aucun), une liste des marqueurs possibles est disponible à l'adresse suivante : Marqueurs
import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
y2 = np.cos(x)
y3 = np.cos(2*x)

plt.plot(x, y, ls='--', label="Pointillé")  # Ajout du d'une en pointillé
# Ajout d'une courbe avec un 'x' comme marqueur
plt.plot(x, y2, marker='x', label='Marqueur')
plt.plot(x, y3, lw='2', label='Epaisseur')  # Ajout d'une courbe d'épaisseur 2

plt.legend()  # Affichage de la légende
plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma première figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille

plt.savefig("Graphique.png", dpi=300)  # Sauvegarde en png avec un dpi de 300

plt.show()  # Affichage d'une courbe

png

Couleur des lignes

On peut changer la couleur des lignes à l'aide du paramètre color='red'.

Liste de couleurs disponibles :

Alias Couleur
'b' blue
'g' green
'r' red
'c' cyan
'm' magenta
'y' yellow
'k' black
'w' white

Il est aussi possible de donner le code hexadécimal de la couleur color='#18DDFA'.
Pour trouver le code hexadécimal d'une couleur vous pouvez utiliser le site suivant : Couleurs hexa

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 50)
y = np.sin(x)
y2 = np.cos(x)

# Définition de la couleur par le nm
plt.plot(x, y, label="Sinus", color='red')
# Définition de la couleur par le code hexa
plt.plot(x, y2, label='Cosinus', color='#18DDFA')

plt.legend(loc=9)  # Affichage de la légende
plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma première figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille
plt.show()  # Affichage d'une courbe

png

Bornes de l'affichage

Il est possible de réduire les bornes des axes abscisses et des ordonnées avec les fonctions plt.xlim(min,max) et plt.ylim(min,max).

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

plt.plot(x, y)  # Ajout du d'une courbe
plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma première figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille

plt.ylim(0, 1)  # On limites l'axe des ordonnées
plt.xlim(0, np.pi)  # on limite l'axe des abscisses

plt.show()  # Affichage d'une courbe

png

Personnalisation des étiquettes des axes

On peut personnaliser les étiquettes des axes en donnant une liste avec les fonctions plt.xticks(...)et plt.ytixks(...).

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

plt.plot(x, y)  # Ajout du d'une courbe
plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Nom")  # Titre de l'axe x
plt.title("Ma première figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille

# Changement des étiquettes de l'abscisse par des prénoms
plt.xticks(np.arange(2*np.pi), ('Tom', 'Dick',
                                'Harry', 'Sally', 'Sue', 'Pietro', 'Sandy'))

plt.show()  # Affichage d'une courbe

png

Affichage des étiquettes en écriture scientifique

Pour de grands nombres, il est parfois nécessaire de changer le mode d'affichage des étiquettes et de le passer en écriture scientifique. Pour cela, on utilise la fonction plt.ticklabel_format(axis='both', style='sci', scilimits=(0,0)), avec les paramètres suivant :

  • axis='x' : l'axe sur lequel appliquer le changement d'affichage -> 'x', 'y' ou 'both' ;
  • style='sci : pour appliquer l'écriture scientifique ;
  • scilimiter=(m,n) : limitation de l'écriture scientifique à l'extérieur de l'intervalle de 10^m à 10^n, on peut mettre (0,0)pour l'appliquer à toutes les valeurs.
import matplotlib.pyplot as plt
import numpy as np

# Création des données à afficher
x = np.arange(start=0, stop=10000, step=100)
y = np.random.rand(len(x))
y = x*y

# Affichage
plt.plot(x, y, 'ro', markersize=10)
plt.grid(True)
plt.title("Affichage classique")
plt.show()

png

import matplotlib.pyplot as plt
import numpy as np

# Création des données à afficher
x = np.arange(start=0, stop=10000, step=100)
y = np.random.rand(len(x))
y = x*y

# Affichage
plt.plot(x, y, 'ro', markersize=10)
plt.grid(True)
plt.title("Affichage scientifique")

plt.ticklabel_format(axis='both', style='sci', scilimits=(0, 0))

plt.show()

png

Zoom sur une partie du graphique

Il est possible d'inclure dans un graphique un effet de zoom sur une partie du graphique pour mettre en évidence un élément.

L'emplacement du zoom est défini par un numéro, voir le tableau ci-dessous :

Position Code
'upper right' 1
'upper left' 2
'lower left' 3
'lower right' 4
'right' 5
'center left' 6
'center right' 7
'lower center' 8
'upper center' 9
'center' 10
from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes, mark_inset
import matplotlib.pyplot as plt
import numpy as np

# Création des données à afficher
x = np.arange(start=0, stop=10000, step=100)
y = np.random.rand(len(x))
y = x*y

# Création des éléments d'axe et figure
fig, ax = plt.subplots()

# Affichage du graphique de base
plt.plot(x, y, 'ro', markersize=5)
plt.grid(True)
plt.title("Effet de zoom")

# Zoom
# Facteur de zoom: 3, location: en haut à gauche
axins = zoomed_inset_axes(ax, 3, loc=2)

axins.scatter(x, y, label='Zoom', color='green') # On dessine le graphique zoomé
axins.set_xlim(0, 2000)  # Limite de l'axe x
axins.grid(True)
axins.set_ylim(0, 1000)  # Limite de l'axe y
plt.xticks(visible=False) # On cache les ticks sur x
plt.yticks(visible=False) # On cache les ticks sur y

# Effet de cadre sur le zoom
mark_inset(ax, axins, loc1=3, loc2=4, fc="None", ec="0.1")

plt.show()

png

Annotations sur le graphique

Il est possible d'ajouter des annotations sur le graphique avec la fonction plt.annotate(s,(x,y)).

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau pour le tracé
x = np.linspace(0, 2*np.pi, 50)
y = np.sin(x)

plt.plot(x, y, '+', label="Sinus")  # Ajout du des points uniquement
plt.ylabel('Amplitude')  # Titre de l'axe y
plt.xlabel("Angle (rad)")  # Titre de l'axe x
plt.title("Ma première figure")  # Titre du graphique
plt.grid(True)  # Affichage de la grille
plt.axvline(x=np.pi, ymin=0, ymax=1, color="red")  # Barre verticale
plt.axhline(y=-0.5, xmin=0, xmax=1, color="green")  # Barre horizontale

plt.scatter(0.5,-0.5) # Ajout d'un point
plt.annotate("Barre horizontale",(0,-0.4)) # Ajout d'une annotation


plt.show()  # Affichage d'une courbe

png