¿Cómo dibujar líneas verticales en una parcela dada en matplotlib?

259

Dado un gráfico de señal en la representación del tiempo, ¿cómo dibujar líneas que marquen el índice de tiempo correspondiente?

Específicamente, dada una gráfica de señal con un índice de tiempo que varía de 0 a 2.6 (s), quiero dibujar líneas rojas verticales que indiquen el índice de tiempo correspondiente para la lista [0.22058956, 0.33088437, 2.20589566], ¿cómo puedo hacerlo?

Francisco
fuente

Respuestas:

424

La forma estándar de agregar líneas verticales que cubrirán toda la ventana de trazado sin tener que especificar su altura real es plt.axvline

import matplotlib.pyplot as plt

plt.axvline(x=0.22058956)
plt.axvline(x=0.33088437)
plt.axvline(x=2.20589566)

O

xcoords = [0.22058956, 0.33088437, 2.20589566]
for xc in xcoords:
    plt.axvline(x=xc)

Puede usar muchas de las palabras clave disponibles para otros comandos de trazado (p color. Ej . linestyle, linewidth...). Puede pasar argumentos de palabras clave yminy, ymaxsi lo desea, en ejes se coordina (p ymin=0.25. Ej. , ymax=0.75Cubrirá la mitad central de la trama). Hay funciones correspondientes para líneas horizontales ( axhline) y rectángulos ( axvspan).

Gabriel
fuente
77
Pero, ¿cómo trazo la línea en un objeto de eje dado?
Eric
8
@Eric si axes el objeto, entonces ax.axvline(x=0.220589956)parece funcionar para mí.
Joel
Los argumentos para axvline son escalares de 0 a 1, en relación con la ventana de trazado. ¿Cómo se dibuja una línea en una posición x o y dada, como 2.205 ... que se hizo en esta pregunta?
Edward Ned Harvey
Parece que stackoverflow.com/questions/16930328/… tiene una respuesta. plt.plot((x1,x2),(y1,y2))
Edward Ned Harvey
1
Tenga en cuenta que ymax e ymin deben estar entre 0 y 1, siendo 0 la parte inferior de la gráfica y 1 la parte superior de la gráfica. Si está utilizando valores más allá de este rango, deberá traducir las posiciones y con la relación correcta.
Dylan Kapp
50

Para múltiples líneas

xposition = [0.3, 0.4, 0.45]
for xc in xposition:
    plt.axvline(x=xc, color='k', linestyle='--')
Qina Yan
fuente
1
¿Cómo ponemos una leyenda en la línea vertical?
Charlie Parker
@CharlieParker considere hacer una pregunta por separado. Esta parte de la documentación de matplotlib puede ayudarlo
Ciprian Tomoiagă
@CharlieParker Una opción adicional label='label'hace el trabajo pero debe llamar plt.legend([options])más tarde
kon psych
29

Si alguien quiere agregar ay legend/ o colorsalgunas líneas verticales, entonces use esto:


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

Resultados:

mi increíble trama seralouk

seralouk
fuente
27

Llamar a axvline en un bucle, como han sugerido otros, funciona, pero puede ser inconveniente porque

  1. Cada línea es un objeto de trazado separado, lo que hace que las cosas sean muy lentas cuando tienes muchas líneas.
  2. Cuando crea la leyenda, cada línea tiene una nueva entrada, que puede no ser lo que desea.

En su lugar, puede usar las siguientes funciones prácticas que crean todas las líneas como un único objeto de trazado:

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
Peter
fuente
15

Además de plt.axvliney plt.plot((x1, x2), (y1, y2))O plt.plot([x1, x2], [y1, y2])como se proporciona en las respuestas anteriores, también se puede usar

plt.vlines(x_pos, ymin=y1, ymax=y2)

para trazar una línea vertical en x_posque abarca desde y1a y2donde los valores y1y y2son en coordenadas de datos absolutos.

Sheldore
fuente