Comment tracer des lignes marquant l’indice de temps correspondant à un tracé de signal dans la représentation temporelle?
Plus précisément, étant donné un tracé de signal avec un index temporel compris entre 0 et 2.6 (s), je souhaite tracer des lignes rouges verticales indiquant l’indice temporel correspondant pour la liste [0.22058956, 0.33088437, 2.20589566]
, comment puis-je le faire?
La méthode standard pour ajouter des lignes verticales couvrant toute la fenêtre du tracé sans que vous ayez à spécifier leur hauteur réelle est plt.axvline
import matplotlib.pyplot as plt
plt.axvline(x=0.22058956)
plt.axvline(x=0.33088437)
plt.axvline(x=2.20589566)
OR
xcoords = [0.22058956, 0.33088437, 2.20589566]
for xc in xcoords:
plt.axvline(x=xc)
Vous pouvez utiliser de nombreux mots-clés disponibles pour d'autres commandes de tracé (par exemple, color
, linestyle
, linewidth
...). Vous pouvez passer des arguments de mots clés ymin
et ymax
si vous aimez les axes corrdinats (par exemple, ymin=0.25
, ymax=0.75
couvrira la moitié médiane du tracé). Il existe des fonctions correspondantes pour les lignes horizontales (axhline
) et les rectangles (axvspan
).
Pour plusieurs lignes
xposition = [0.3, 0.4, 0.45]
for xc in xposition:
plt.axvline(x=xc, color='k', linestyle='--')
Le fait d’appeler axvline dans une boucle, comme d’autres l’ont suggéré, fonctionne, mais peut être gênant car
À la place, vous pouvez utiliser les fonctions pratiques suivantes qui créent toutes les lignes en tant qu’objet de tracé unique:
import matplotlib.pyplot as plt
import numpy as np
def axhlines(ys, ax=None, **plot_kwargs):
"""
Draw horizontal lines across plot
:param ys: A scalar, list, or 1D array of vertical offsets
:param ax: The axis (or none to use gca)
:param plot_kwargs: Keyword arguments to be passed to plot
:return: The plot object corresponding to the lines.
"""
if ax is None:
ax = plt.gca()
ys = np.array((ys, ) if np.isscalar(ys) else ys, copy=False)
lims = ax.get_xlim()
y_points = np.repeat(ys[:, None], repeats=3, axis=1).flatten()
x_points = np.repeat(np.array(lims + (np.nan, ))[None, :], repeats=len(ys), axis=0).flatten()
plot = ax.plot(x_points, y_points, scalex = False, **plot_kwargs)
return plot
def axvlines(xs, ax=None, **plot_kwargs):
"""
Draw vertical lines on plot
:param xs: A scalar, list, or 1D array of horizontal offsets
:param ax: The axis (or none to use gca)
:param plot_kwargs: Keyword arguments to be passed to plot
:return: The plot object corresponding to the lines.
"""
if ax is None:
ax = plt.gca()
xs = np.array((xs, ) if np.isscalar(xs) else xs, copy=False)
lims = ax.get_ylim()
x_points = np.repeat(xs[:, None], repeats=3, axis=1).flatten()
y_points = np.repeat(np.array(lims + (np.nan, ))[None, :], repeats=len(xs), axis=0).flatten()
plot = ax.plot(x_points, y_points, scaley = False, **plot_kwargs)
return plot
legend
et/ou colors
à certaines lignes verticales, utilisez ceci:import matplotlib.pyplot as plt
# x coordinates for the lines
xcoords = [0.1, 0.3, 0.5]
# colors for the lines
colors = ['r','k','b']
for xc,c in Zip(xcoords,colors):
plt.axvline(x=xc, label='line at x = {}'.format(xc), c=c)
plt.legend()
plt.show()
Résultats:
En plus des plt.axvline
et plt.plot((x1, x2), (y1, y2))
OR plt.plot([x1, x2], [y1, y2])
prévus dans les réponses ci-dessus, on peut également utiliser
plt.vlines(x_pos, ymin=y1, ymax=y2)
pour tracer une ligne verticale sur x_pos
allant de y1
à y2
, où les valeurs y1
et y2
sont exprimées en coordonnées de données absolues.