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



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



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

680   5  

5 ответов:

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

  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

Если кто-то хочет добавить 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()

результаты:

my amazing plot seralouk

в дополнение к 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

    Ничего не найдено.