HOWTO · Matplotlib
Comment tracer une ligne arbitraire dans Matplotlib
Tracez des segments de droite finis dans Matplotlib avec plot(), hlines(), vlines() et LineCollection.
Sur cette page
Pour tracer un seul segment de droite fini dans Matplotlib, transmettez les coordonnées de ses deux extrémités à Axes.plot(). Utilisez hlines() ou vlines() lorsque le segment est horizontal ou vertical, et utilisez LineCollection lorsque vous avez de nombreux segments indépendants. Ces API utilisent des coordonnées de données ; axhline(), axvline() et axline() répondent à un autre besoin, celui d’une ligne qui s’étend sur les axes ou qui est infinie.
Les exemples utilisent Python avec Matplotlib. Installez Matplotlib avec python -m pip install matplotlib s’il n’est pas déjà disponible. Chaque exemple exécutable enregistre un fichier PNG afin de pouvoir être vérifié dans un environnement non interactif ; remplacez savefig() par plt.show() si vous souhaitez une fenêtre interactive.
Tracer un segment fini avec plot()
Pour un segment allant de (x1, y1) à (x2, y2), donnez à plot() une séquence de deux valeurs x et une séquence de deux valeurs y. Matplotlib relie les valeurs qui occupent les mêmes positions : la première paire x/y forme une extrémité et la seconde paire forme l’autre.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([3, 5], [1, 6], color="tab:green", marker="o")
ax.set(xlabel="x", ylabel="y", title="Finite segment with plot()")
fig.savefig("plot-segment.png", dpi=120)
print("saved: plot-segment.png")
saved: plot-segment.png
Les marqueurs rendent les deux extrémités visibles. Ajoutez d’autres paires de valeurs uniquement si vous voulez créer une polyligne : plot() relie les points consécutifs au lieu de créer des segments indépendants.
Tracer des segments horizontaux ou verticaux finis
Utilisez hlines(y, xmin, xmax) pour un segment horizontal et vlines(x, ymin, ymax) pour un segment vertical. La coordonnée maintenue constante est le premier argument ; les deux autres arguments sont les extrémités finies en coordonnées de données.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.hlines(3, 2, 5, color="tab:red")
ax.vlines(6, 1, 5, color="tab:green")
ax.set(xlim=(0, 7), ylim=(0, 6), xlabel="x", ylabel="y")
fig.savefig("horizontal-vertical-segments.png", dpi=120)
print("saved: horizontal-vertical-segments.png")
saved: horizontal-vertical-segments.png
Le segment rouge va ici de (2, 3) à (5, 3), tandis que le segment vert va de (6, 1) à (6, 5). Des limites explicites rendent la plage de données prévue claire et évitent de prendre une ligne coupée pour un segment plus court.
Ne remplacez pas une ligne de référence qui s’étend sur les axes
axhline() et axvline() sont utiles comme lignes de référence, mais elles s’étendent sur les axes dans une direction au lieu d’utiliser deux extrémités en coordonnées de données. De même, axline() représente une ligne infinie passant par des points ou définie par une pente. N’utilisez ces API que si ce comportement correspond au besoin du graphique.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
segment = ax.hlines(3, 2, 5, color="tab:red")
reference = ax.axhline(3, color="0.35", linestyle="--")
assert segment.get_segments()[0].tolist() == [[2.0, 3.0], [5.0, 3.0]]
assert reference.get_transform() is ax.get_yaxis_transform()
print("hlines endpoints: [2.0, 3.0] to [5.0, 3.0]")
print("axhline uses axes-relative x coordinates")
hlines endpoints: [2.0, 3.0] to [5.0, 3.0]
axhline uses axes-relative x coordinates
L’assertion montre la limite : hlines() conserve des extrémités finies en coordonnées de données, tandis que axhline() utilise des coordonnées relatives aux axes pour son étendue horizontale. Cette distinction compte lors d’un zoom, d’un changement de limites ou de l’exportation d’un graphique.
Tracer de nombreux segments indépendants avec LineCollection
Lorsque vous avez besoin de nombreux segments disjoints, créez une LineCollection à partir d’une séquence de segments à deux points et ajoutez-la à un axe. Appeler autoscale() après add_collection() permet aux axes d’inclure la collection ; définissez plutôt des limites explicites si la plage d’affichage fixe fait partie du graphique.
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
segments = [[(1, 10), (6, 9)], [(1, 7), (3, 6)]]
collection = LineCollection(segments, colors=["tab:red", "tab:green"])
fig, ax = plt.subplots()
ax.add_collection(collection)
ax.autoscale()
ax.set(xlabel="x", ylabel="y", title="Two independent segments")
fig.savefig("line-collection.png", dpi=120)
print("segments: 2")
print("saved: line-collection.png")
segments: 2
saved: line-collection.png
LineCollection convient bien à de nombreux segments, car il les regroupe dans une seule collection. Il ne relie pas la fin d’un segment au début du suivant, ce qui constitue la différence essentielle avec le passage d’une séquence de points plus longue à plot().
Choisir l’API adaptée à la géométrie
Choisissez plot() pour un segment ou un chemin connecté, hlines() et vlines() pour des segments finis alignés sur les axes, et LineCollection pour un ensemble de segments disjoints. Préférez axhline() ou axvline() uniquement pour un repère qui s’étend sur les axes, et souvenez-vous que axline() est infini.
Pour connaître les paramètres et les options de style, consultez les documentations officielles de plot(), hlines(), vlines() et LineCollection. Les exemples ci-dessus ont été exécutés avec Matplotlib 3.11.2 dans le conteneur Polyglot local enregistré.