Как нарисовать вертикальные линии на заданном участке в matplotlib?
учитывая график сигнала во временном представлении, как нарисовать линии, отмечающие соответствующий индекс времени?
в частности, учитывая график сигнала с индексом времени в диапазоне от 0 до 2,6(s), Я хочу нарисовать вертикальные красные линии, указывающие соответствующий индекс времени для списка [0.22058956, 0.33088437, 2.20589566], Как я могу это сделать?
5 ответов:
стандартный способ добавить вертикальные линии, которые будут охватывать все окно участка без необходимости указывать их фактическую высоту
plt.axvlineimport 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)вы можете использовать многие ключевые слова, доступные для других команд печати (например,
color,linestyle,linewidth...). Вы можете передать в Ключевое слово аргументыyminиymaxесли вам нравится в осях corrdinates (например,ymin=0.25,ymax=0.75будет охватывать среднюю половину сюжета). Есть соответствующие функции для горизонтальных линий (axhline) и прямоугольники (axvspan).
на несколько строк
xposition = [0.3, 0.4, 0.45] for xc in xposition: plt.axvline(x=xc, color='k', linestyle='--')
вызов axvline в цикле, как предлагали другие, работает, но может быть неудобно, потому что
- каждая строка-это отдельный объект графика, который заставляет вещи быть очень медленными, когда у вас много строк.
- при создании легенды каждая строка имеет новую запись, которая может быть не то, что вы хотите.
вместо этого вы можете использовать следующие функции удобства, которые создают все линии как один объект участка:
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
Если кто-то хочет добавить
legendи/илиcolorsк некоторым вертикальным линиям, затем используйте это:
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()
результаты:
в дополнение к
plt.axvlineиplt.plot((x1, x2), (y1, y2))илиplt.plot([x1, x2], [y1, y2])как указано в ответах выше, можно также использоватьplt.vlines(x_pos, ymin=y1, ymax=y2)построить вертикальную линию в
x_posначиная сy1доy2.

Comments