Як намалювати вертикальні лінії на заданій ділянці в matplotlib?


259

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

Зокрема, з огляду на графік сигналу з індексом часу від 0 до 2,6 (с), я хочу намалювати вертикальні червоні лінії із зазначенням відповідного індексу часу для списку [0.22058956, 0.33088437, 2.20589566], як це зробити?

Відповіді:


423

Стандартним способом додавання вертикальних ліній, які охоплюватимуть усе вікно вашого ділянки, не вказуючи їх фактичну висоту 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
@Eric якщо 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 psych

29

Якщо хтось хоче додати а 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


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в абсолютних координатах даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.