Tracer des vecteurs avec Python

On aborde dans cette rubrique la syntaxe permettant de tracer des vecteurs sur une figure.

De nombreuses activités en mécanique peuvent donner lieu à des tracés de vecteurs : vecteurs vitesse instantanée, vecteurs variation de vitesse, accélération, etc...

On commence par importer la bibliothèque pyplot qui contient les fonctions permettant de tracer des vecteurs.

1
import matplotlib.pyplot as plt

Deux fonctions permettent de tracer des vecteurs :

On exploite principalement dans ce support la fonction plt.quiver qui permet de tracer un vecteur unique ou un champ de vecteurs.

Tracé d'un vecteur unique

Les lignes de commande ci-dessous permettent de tracer un vecteur unique dans un repère orthonormé.

1
# Les trois premières lignes permettent uniquement de travailler dans un repère orthonormé.
2
# On place deux points qu'on n'affiche pas afin de délimiter l'étendue des axes
3
plt.plot(-5, -5, "None")
4
plt.plot(5, 5, "None")
5
plt.axis('equal')  # Trace un repère orthonormé
6
plt.quiver(0, 0, 4, 2, angles = 'xy', scale_units = 'xy', scale = 1)  # Tracé d'un vecteur
7
plt.show()  # On affiche la fenêtre graphique

Décryptage de la commande plt.quiver()

  • 0, 0 : coordonnées de l'origine du vecteur ;

  • 4, 2 : composantes du vecteur suivant l'axe des abscisses et l'axe des ordonnées ;

  • angles = 'xy' : choix entre 'uv' ou 'xy' : 'uv' est le choix par défaut avec la même échelle de représentation pour chaque composante du vecteur. 'xy' trace des vecteurs dont les composantes sont dans les mêmes unités que celles des axes x et y. Excepté pour tracer un vecteur déplacement, on peut omettre ce paramètre qui est de toutes façon sans effet dans un repère orthonormé ;

  • scale_units = 'xy' : échelles basées sur les unités des axes des abscisses et ordonnées. Excepaté pour un vecteur déplacement, on choisira le plus souvent scale_units = 'dots'.

  • scale = 1 : échelle du tracé, 1 pour taille réelle, 0.5 pour un facteur 2. Plus la valeur est faible, plus le vecteur représenté est long.

Représentation d'un vecteur unique dans un repère

Représentation d'un champ de vecteurs

On présente ici la méthode permettant de représenter plusieurs vecteurs en une seule ligne de commande : vecteurs vitesse instantanée sur une trajectoire, vecteurs accélération, etc...

Si les coordonnées de l'origine du vecteur et celles de ses composantes sont des listes au lieu d'être des valeurs numériques, plt.quiver permet de tracer tous les vecteurs correspondants en une seule ligne de commande.

Le court programme ci-dessous trace une trajectoire circulaire et place différentes positions au cours du temps. On trace ensuite les vecteurs vitesse instantanée \(\vec v\) et variation de vitesse \(\Delta \vec v\) aux différentes positions.

1
from math import sin, cos, pi  # Importation des fonctions mathématiques nécessaires
2
import matplotlib.pyplot as plt  # Importation de la bibliothèque graphique
3
4
R = 5  # Rayon de la trajectoire
5
V0 =15  # Valeur de la vitesse
6
alpha = [2 * i * pi / 50 for i in range(51)]  # Construction de la liste des angles repérant la position
7
x = [R * cos(a) for a in alpha]  # Liste des abscisses
8
y = [R * sin(a) for a in alpha]  # Listes de ordonnées
9
vx = [-V0 * sin(a) for a in alpha]  # Coordonnées suivant Ox de la vitesse
10
vy = [V0 * cos(a) for a in alpha]  # Coordonnées suivant Oy de la vitesse
11
Dvx = [vx[i+1] - vx[i-1] for i in range(1, 50)]  # Coordonnées suivant Ox du vecteur variation de vitesse
12
Dvy = [vy[i+1] - vy[i-1] for i in range(1, 50)]  # Coordonnée suivant Oy du vecteur variation de vitesse
13
plt.scatter(0, 0, marker = "+", color = "black")  # On place le centre de la trajectoire
14
plt.scatter(x, y, marker = "x", color = "blue")  # On place les positions successives
15
plt.quiver(x, y, vx, vy, units = "dots", color = "red", scale = 0.1, label = "Vecteurs vitesse")  # Représentation des vecteurs vitesse
16
plt.quiver(x[1:-1:], y[1:-1:], Dvx, Dvy, units = "dots", scale = 0.1, color = "green", label = "Vecteurs variation de vitesse")  # Représentation des vecteur variation de vitesse
17
plt.axis("equal")  # Pour avoir un repère orthonormé
18
plt.legend()  # Affichage de la légende
19
plt.show()  # Affichage du graphique

Remarques :

  • x, y, vx, vy : listes permettant de tracer tous les vecteurs aux positions x et y et dont les composantes sont vx et vy ;

  • units = "dots" : il n'y a pas de correspondance entre les unités des axes (positions) et la vitesse, on ne choisit pas units = "xy" comme précédemment ;

  • scale = 0.1 : à ajuster pour avoir des vecteurs de longueur exploitable ;

  • Pour le tracé des vecteurs variation de vitesse : la méthode de calcul utilisée ne permet pas de calculer ce vecteur aux positions initiale et finale. Les listes Dvx et Dvy ont deux termes de moins que les listes x et y.

    x[1 :-1 :] permet de ne pas prendre en compte le terme d'indice 0 et le dernier terme de la liste.

Ajouter un vecteur échelle sur la représentation

Il s'agit d'ajouter une échelle de représentation des vecteurs sous la forme d'un vecteur étiqueté avec la valeur qu'il représente.

C'est la commande plt.quiverkey() qui permet de le faire.

Le programme ci-dessous est identique au précédent mais ajoute l'échelle de représentation.

1
from math import sin, cos, pi  # Importation des fonctions mathématiques nécessaires
2
import matplotlib.pyplot as plt  # Importation de la bibliothèque graphique
3
4
R = 5  # Rayon de la trajectoire
5
V0 =15  # Valeur de la vitesse
6
alpha = [2 * i * pi / 50 for i in range(51)]  # Construction de la liste des angles repérant la position
7
x = [R * cos(a) for a in alpha]  # Liste des abscisses
8
y = [R * sin(a) for a in alpha]  # Listes de ordonnées
9
vx = [-V0 * sin(a) for a in alpha]  # Coordonnées suivant Ox de la vitesse
10
vy = [V0 * cos(a) for a in alpha]  # Coordonnées suivant Oy de la vitesse
11
Dvx = [vx[i+1] - vx[i-1] for i in range(1, 50)]  # Coordonnées suivant Ox du vecteur variation de vitesse
12
Dvy = [vy[i+1] - vy[i-1] for i in range(1, 50)]  # Coordonnée suivant Oy du vecteur variation de vitesse
13
plt.scatter(0, 0, marker = "+", color = "black")  # On place le centre de la trajectoire
14
plt.scatter(x, y, marker = "x", color = "blue")  # On place les positions successives
15
v = plt.quiver(x, y, vx, vy, units = "dots", color = "red", scale = 0.1, label = "Vecteurs vitesse")  # Représentation des vecteurs vitesse (v pour pouvoir définir l'échelle)
16
Dv=plt.quiver(x[1:-1:], y[1:-1:], Dvx, Dvy, units = "dots", scale = 0.1, color = "green", label = "Vecteurs variation de vitesse")  # Représentation des vecteur variation de vitesse
17
plt.quiverkey(v, 0.9, 0.85, 10, label=r"$10\ \mathrm{m \cdot s^{-1}}$", coordinates = "axes")  # Dessin d'un vecteur donnant l'échelle des tracés
18
plt.axis("equal")  # Pour avoir un repère orthonormé
19
plt.legend()  # Affichage de la légende
20
plt.show()  # Affichage du graphique

Modifications nécessaires pour le tracé de l'échelle :

  • v = plt.quiver(x, y, vx, vy,... : définit et trace le champ de vecteurs v, nécessaire pour utiliser quiverkey ;

  • plt.quiverkey(v, 0.9, 0.85, 10, label=r"$10\ \mathrm{m \cdot s^{-1}}$", coordinates = "axes") :

    • v : champ de vecteurs dont on veut tracer l'échelle ;

    • 0.9, 0.85 associé à coordinates = "axes" : position du vecteur échelle par rapport aux axes 0, 0 pour le bord inférieur gauche, 1, 1 pour le bord supérieur droit ;

    • 10 : longueur de l'échelle ;

    • label : légende de ce vecteur sous forme de chaîne de caractères, ici en syntaxe latex.