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?

127
demandé sur Gabriel 2014-07-28 08:29:41

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

218
répondu Gabriel 2014-07-28 04:46:16

Pour plusieurs lignes

xposition = [0.3, 0.4, 0.45]
for xc in xposition:
    plt.axvline(x=xc, color='k', linestyle='--')
32
répondu Qina Yan 2016-03-18 16:12:50

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é séparé, ce qui provoque des choses très lentes lorsque vous avez beaucoup de 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 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
13
répondu Peter 2018-06-19 15:40:13

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:

mon intrigue incroyable seralouk

4
répondu seralouk 2018-07-16 13:19:56

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.

1
répondu Bazingaa 2018-09-23 16:45:44