HOWTO · Matplotlib

Comment relier des points de nuage de points à une ligne dans Matplotlib

Pour relier les points d’un nuage de points dans l’ordre des données, `plot()` trace le chemin qui les relie, `scatter()` ajoute des marqueurs distincts et `show()` affiche la figure terminée. Le paramètre `zorder` permet de choisir quelle couche apparaît au premier plan.

Sur cette page

Pour relier les points d’un nuage de points dans l’ordre des données, transmettez les mêmes valeurs x et y à scatter() et plot(), puis appelez show() pour afficher la figure. scatter() dessine les marqueurs sous forme de collection indépendante, plot() trace le chemin qui relie les points dans l’ordre fourni, et show() affiche la figure terminée.

Les exemples de ce tutoriel ont été exécutés et vérifiés avec Matplotlib 3.11.2 sous Python 3.12, et chaque figure ci-dessous est le rendu produit par l’exemple juste au-dessus.

Relier les points du nuage de points dans l’ordre des données avec scatter() et plot()

Donnez aux deux fonctions les mêmes séquences de coordonnées. plot() relie chaque paire dans l’ordre fourni, donc la séquence détermine le chemin ; Matplotlib ne trie pas les points par coordonnée x. Gardez chaque valeur x associée à sa valeur y correspondante : la première valeur x va avec la première valeur y, la deuxième avec la deuxième, et ainsi de suite. Si vous triez les observations par x, réordonnez les valeurs y avec ces mêmes observations plutôt que de trier les deux listes indépendamment.

C’est important lorsque les données représentent un itinéraire, une série temporelle ou une autre séquence où l’ordre a un sens. Par exemple, des valeurs x qui passent de 1 à 3 puis reviennent à 2 produisent un chemin qui va vers la droite puis vers la gauche. Cela peut être correct pour une trajectoire. Si votre objectif est plutôt une courbe progressant de gauche à droite, triez d’abord les observations appariées. Une ligne peut aussi contenir des segments verticaux lorsque des observations voisines partagent une valeur x ; plot() les relie toujours dans l’ordre fourni.

Cet exemple superpose les marqueurs et la ligne de liaison en utilisant un seul ensemble de coordonnées :

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3, 2]

plt.scatter(x, y)
plt.plot(x, y)
plt.xlabel("x")
plt.ylabel("y")
plt.show()

Quatre points du nuage de points en (1, 2), (2, 1), (3, 3) et (4, 2) reliés dans l’ordre des données par une ligne continue.

Utiliser les mêmes entrées x et y maintient les marqueurs et la ligne alignés. Si les deux couches semblent décalées, vérifiez qu’aucune des séquences n’a été transformée ou réordonnée pour un seul des appels. Pour des données stockées dans un tableau, sélectionnez les deux colonnes à partir des mêmes lignes et dans le même ordre. L’exemple utilise l’interface pyplot et n’a donc pas besoin d’une variable de figure distincte ; avec l’interface orientée objet, créez une figure et des axes avec fig, ax = plt.subplots(), puis appelez ax.scatter(...) et ax.plot(...) sur ces axes.

Styliser la ligne et les marqueurs avec plot()

Utilisez linestyle et color pour styliser le chemin dessiné par plot(). L’exemple suivant conserve une couche scatter() distincte pour les marqueurs et trace le chemin de liaison sous forme de ligne bleue en pointillés :

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3, 2]

plt.scatter(x, y, color="blue")
plt.plot(x, y, linestyle="--", color="blue")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

Les mêmes quatre points reliés par une ligne bleue en pointillés, avec un marqueur bleu à chaque point.

Appeler scatter() et plot() séparément donne un contrôle indépendant sur la collection de points et le chemin de liaison : la taille et la couleur des marqueurs peuvent changer sans toucher à la ligne, ce qui est utile lorsque les points doivent être davantage mis en valeur alors que le chemin reste visuellement simple. Donnez aux deux appels les mêmes séquences de coordonnées pour que chaque marqueur se trouve sur son point correspondant de la ligne.

Un seul appel plot() peut aussi dessiner les deux couches à la fois grâce à une chaîne de format comme "xb-", où x sélectionne la forme du marqueur, b sélectionne le bleu et - sélectionne une ligne continue. La chaîne de format est compacte lorsqu’un seul appel doit tout dessiner ; les arguments nommés comme color, marker et linestyle sont plus clairs lorsque vous avez besoin d’autres propriétés, comme la taille du marqueur, l’épaisseur de la ligne ou la transparence. Quelle que soit l’approche choisie, show() se place après tous les appels de style et de couche, car il n’affiche la figure qu’une fois ces éléments ajoutés.

Contrôler quelle couche apparaît au premier plan avec zorder

L’élément dont le zorder est le plus élevé est dessiné au-dessus de celui dont la valeur est plus faible. Cela ne modifie que l’ordre de dessin ; les coordonnées et le chemin restent inchangés. Ce réglage compte lorsqu’une ligne épaisse traverse un marqueur et en masque le centre, ou lorsque la ligne doit rester visible au milieu de marqueurs denses.

L’exemple suivant rend la ligne volontairement épaisse et attribue aux marqueurs le zorder le plus élevé, de sorte que chaque marqueur rond reste entier là où la ligne passe en dessous :

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3, 2]

plt.plot(x, y, linewidth=6, zorder=2)
plt.scatter(x, y, s=120, zorder=3)
plt.xlabel("x")
plt.ylabel("y")
plt.show()

Une ligne épaisse reliant les quatre points, avec des marqueurs ronds plus grands dessinés par-dessus la ligne à chaque point.

Pour placer les marqueurs au-dessus de la ligne, donnez à la collection de dispersion la plus grande valeur, comme zorder=3 pour scatter() contre zorder=2 pour plot() ci-dessus. Pour placer la ligne au-dessus des marqueurs, inversez les valeurs. Utilisez une différence modeste entre les deux valeurs pour exprimer l’ordre souhaité, et définissez zorder sur les deux éléments lorsque la superposition doit être sans ambiguïté. La même comparaison s’applique à tout autre élément de graphique ajouté ensuite : l’élément avec le zorder le plus élevé est dessiné par-dessus les autres.

Faire correspondre les longueurs de x et de y pour éviter l’erreur de taille

Les deux fonctions associent les valeurs position par position, donc les deux séquences doivent avoir la même longueur. Sinon, l’appel lève une ValueError et aucune figure n’est dessinée. Cet exemple omet par erreur la dernière valeur y :

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3]

plt.scatter(x, y)
plt.plot(x, y)
plt.show()

Son exécution échoue à l’appel scatter() avec :

ValueError: x and y must be the same size

Appeler plot() seul avec les mêmes entrées échoue aussi, avec sa propre formulation du même problème : ValueError: x and y must have same first dimension, but have shapes (4,) and (3,). Pour corriger l’erreur, repérez l’observation manquante ou en trop et faites en sorte que les deux séquences décrivent à nouveau les mêmes points. Comparer len(x) et len(y) avant le tracé indique quel côté est le plus court. Lorsque les données proviennent d’un tableau, filtrez les lignes une seule fois, puis prenez les deux colonnes dans les lignes filtrées, au lieu de filtrer chaque colonne séparément et de laisser leurs longueurs diverger.

Deux séquences vides constituent un cas différent : elles sont acceptées et produisent des axes vides sans erreur. Une figure vide signifie donc généralement que les données d’entrée étaient vides, et non que les longueurs ne correspondaient pas.