Comment dessiner des lignes verticales sur une parcelle donnée dans matplotlib?
Étant donné un tracé de signal dans la représentation du temps, comment dessiner des lignes marquant l'indice de temps correspondant?
Plus précisément, étant donné un tracé de signal avec un indice de temps allant de 0 à 2.6(s), je veux dessiner des lignes rouges verticales indiquant l'indice de temps correspondant pour la liste [0.22058956, 0.33088437, 2.20589566]
, Comment puis-je le faire?
5 réponses
La manière standard d'ajouter des lignes verticales qui couvriront toute votre fenêtre de 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)
Ou
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 le souhaitez dans les axes corrdinates (par exemple ymin=0.25
, ymax=0.75
couvrira la moitié médiane de l'intrigue). Il y a des fonctions correspondantes pour les lignes horizontales (axhline
) et rectangles (axvspan
).
Pour plusieurs lignes
xposition = [0.3, 0.4, 0.45]
for xc in xposition:
plt.axvline(x=xc, color='k', linestyle='--')
Appeler axvline dans une boucle, comme d'autres l'ont suggéré, fonctionne, mais peut être gênant car
- chaque ligne est un objet de tracé séparé, ce qui provoque des choses très lentes lorsque vous avez beaucoup de lignes.
- Lorsque vous créez la légende, chaque ligne a une nouvelle entrée, ce qui peut ne pas être ce que vous voulez.
À la place, vous pouvez utiliser les fonctions de commodité suivantes qui créent toutes les lignes comme un seul objet de tracé:
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
Si quelqu'un veut ajouter un legend
et / ou colors
à certaines lignes verticales, utilisez ceci:
import matplotlib.pyplot as plt
xcoords = [0.1, 0.3, 0.5]
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))
ou {[3] } comme indiqué dans les réponses ci-dessus, on peut également utiliser
plt.vlines(x_pos, ymin=y1, ymax=y2)
Pour tracer une ligne verticale à x_pos
étendant à partir de y1
à y2
.