Как нарисовать вертикальные линии на заданном участке в matplotlib?

259

Учитывая график сигнала во временном представлении, как нарисовать линии, отмечающие соответствующий временной индекс?

В частности, учитывая график сигнала с индексом времени в диапазоне от 0 до 2,6 с, я хочу нарисовать вертикальные красные линии, указывающие соответствующий индекс времени для списка [0.22058956, 0.33088437, 2.20589566], как я могу это сделать?

Фрэнсис
источник

Ответы:

424

Стандартный способ добавить вертикальные линии, которые будут покрывать все окно графика без необходимости указывать их фактическую высоту, это 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)

Вы можете использовать многие из ключевых слов , доступных для других команд сюжетных (например color, linestyle, linewidth...). Вы можете передать ключевые аргументы yminи, ymaxесли хотите, в оси координат (например ymin=0.25, ymax=0.75охватит среднюю половину графика). Существуют соответствующие функции для горизонтальных линий ( axhline) и прямоугольников ( axvspan).

Габриель
источник
7
Но как мне нарисовать линию на заданном объекте оси?
Эрик
8
@ Эрик, если axэто объект, то, ax.axvline(x=0.220589956)кажется, работает для меня.
Джоэл
В аргументах для axvline скалярны от 0 до 1, по отношению к окну участка. Как нарисовать линию в заданной позиции x или y, например, 2.205 ..., которая была задана в этом вопросе?
Эдвард Нед Харви
Похоже, у stackoverflow.com/questions/16930328/… есть ответ. plt.plot((x1,x2),(y1,y2))
Эдвард Нед Харви
1
Обратите внимание, что ymax и ymin должны быть между 0 и 1, 0 - это нижняя часть графика, 1 - верхняя часть графика. Если вы используете значения за пределами этого диапазона, вам нужно будет перевести y-позиции с правильным соотношением.
Дилан Капп
50

Для нескольких строк

xposition = [0.3, 0.4, 0.45]
for xc in xposition:
    plt.axvline(x=xc, color='k', linestyle='--')
Кина Ян
источник
1
как поставить легенду на вертикальную линию?
Чарли Паркер
@CharlieParker подумайте над тем, чтобы задать отдельный вопрос. Эта часть документации matplotlib может вам помочь
Ciprian Tomoiagă
@CharlieParker Дополнительный вариант label='label'делает работу , но вам нужно позвонить plt.legend([options])позже
Kon псих
29

Если кто-то хочет добавить a legendи / или colorsк некоторым вертикальным линиям, используйте это:


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

Полученные результаты:

мой удивительный сюжет seralouk

seralouk
источник
27

Вызов axvline в цикле, как предлагали другие, работает, но может быть неудобным, потому что

  1. Каждая строка - это отдельный объект сюжета, который заставляет вещи работать очень медленно, когда у вас много линий.
  2. При создании легенды в каждой строке появляется новая запись, которая может не соответствовать вашей.

Вместо этого вы можете использовать следующие вспомогательные функции, которые создают все линии как один объект графика:

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

В дополнение к 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где значения y1и y2в абсолютных координатах данных.

Sheldore
источник