如何在matplotlib的给定图上绘制垂直线?

给定一个时间表示信号图,如何画线标记相应的时间索引?

具体来说,给定一个时间指数范围从0到2.6(s)的信号图,我想画出垂直的红线,表示列表[0.22058956, 0.33088437, 2.20589566]相应时间索引,我该怎么办?

添加垂直线的标准方法将覆盖整个绘图窗口,而不必指定它们的实际高度为plt.axvline

 import matplotlib.pyplot as plt plt.axvline(x=0.22058956) plt.axvline(x=0.33088437) plt.axvline(x=2.20589566) 

要么

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

您可以使用其他绘图命令可用的许多关键字(例如, colorlinestylelinewidth …)。 如果你喜欢坐标轴(如ymin=0.25ymax=0.75将覆盖图的中间部分),你可以传递关键字参数yminymax 。 水平线( axhline )和矩形( axvspan )有相应的function。

对于多行

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

像其他人所说的那样,在一个循环中调用axvline是有效的,但是可能是不方便的

  1. 每一行都是一个单独的绘图对象,当你有很多行时,会导致事情变得非常慢。
  2. 当你创build图例时,每一行都有一个新的条目,这可能不是你想要的。

相反,您可以使用以下便利function将所有线条创build为一个绘图对象:

 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