¿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?

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


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


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


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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.