web-dev-qa-db-fra.com

Comment tracer des lignes verticales sur une parcelle donnée dans matplotlib?

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?

206
Francis

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).

343
Gabriel

Pour plusieurs lignes

xposition = [0.3, 0.4, 0.45]
for xc in xposition:
    plt.axvline(x=xc, color='k', linestyle='--')
41
Qina Yan

Le fait d’appeler axvline dans une boucle, comme d’autres l’ont suggéré, fonctionne, mais peut être gênant car

  1. Chaque ligne est un objet de tracé distinct, ce qui ralentit les choses lorsque vous avez plusieurs lignes.
  2. 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 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
23
Peter

Si quelqu'un veut ajouter un 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:

my amazing plot seralouk

17
serafeim

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.

10
Sheldore