matrices - libreria matplotlib python
¿Cómo dibujar líneas verticales en una trama dada en matplotlib? (3)
Dada una representación gráfica de la señal en el tiempo, ¿cómo dibujar líneas que marquen el índice de tiempo correspondiente?
Específicamente, dado un diagrama de señal con í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?
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 (por ejemplo, color
, linestyle
linewidth
, linewidth
...). Puede pasar argumentos de palabras clave ymin
e ymax
si lo desea en ejes corrdinates (por ejemplo, ymin ymin=0.25
, ymax=0.75
cubrirá la mitad central de la gráfica). Hay funciones correspondientes para líneas horizontales ( axhline
) y rectángulos ( axvspan
).
Llamar a axvline en un ciclo, como otros han sugerido, funciona, pero puede ser inconveniente porque
- Cada línea es un objeto de trazado separado, lo que hace que las cosas sean muy lentas cuando tienes muchas líneas.
- Cuando crea la leyenda, cada línea tiene una nueva entrada, que puede no ser la que desea.
En su lugar, puede usar las siguientes funciones de conveniencia que crean todas las líneas como un único objeto de trazado:
import matplotlib.pyplot as plt
import numpy as np
def axhlines(ys, **plot_kwargs):
"""
Draw horizontal lines across plot
:param ys: A scalar, list, or 1D array of vertical offsets
:param plot_kwargs: Keyword arguments to be passed to plot
:return: The plot object corresponding to the lines.
"""
ys = np.array((ys, ) if np.isscalar(ys) else ys, copy=False)
lims = plt.gca().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 = plt.plot(x_points, y_points, scalex = False, **plot_kwargs)
return plot
def axvlines(xs, **plot_kwargs):
"""
Draw vertical lines on plot
:param xs: A scalar, list, or 1D array of horizontal offsets
:param plot_kwargs: Keyword arguments to be passed to plot
:return: The plot object corresponding to the lines.
"""
xs = np.array((xs, ) if np.isscalar(xs) else xs, copy=False)
lims = plt.gca().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 = plt.plot(x_points, y_points, scaley = False, **plot_kwargs)
return plot
Para líneas múltiples
xposition = [0.3, 0.4, 0.45]
for xc in xposition:
plt.axvline(x=xc, color=''k'', linestyle=''--'')