Как нарисовать вертикальные линии на данном участке в matplotlib?
Учитывая график сигнала во временном представлении, как рисовать линии, маркирующие соответствующий временной индекс?
В частности, учитывая график сигнала с временным индексом в диапазоне от 0 до 2.6 (s), я хочу нарисовать вертикальные красные строки, указывающие соответствующий индекс времени для списка [0.22058956, 0.33088437, 2.20589566]
, как я могу это сделать?
Ответы
Ответ 1
Стандартный способ добавления вертикальных линий, которые будут охватывать все ваше окно графика без необходимости указывать их фактическую высоту, 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
).
Ответ 2
Для нескольких строк
xposition = [0.3, 0.4, 0.45]
for xc in xposition:
plt.axvline(x=xc, color='k', linestyle='--')
Ответ 3
Вызов 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
Ответ 4
Если кто-то хочет добавить 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()
Результаты:
![my amazing plot seralouk]()
Ответ 5
В дополнение к 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
находятся в абсолютных координатах данных.