[python] matplotlib에서 주어진 플롯에 수직선을 그리는 방법은 무엇입니까?

시간 표현에 신호 플롯이 주어지면 해당 시간 인덱스를 표시하는 선을 그리는 방법은 무엇입니까?

특히, 시간 인덱스가 0에서 2.6 (s) 범위 인 신호 플롯에서 목록에 해당하는 시간 인덱스를 나타내는 빨간색 세로선을 그리려면 [0.22058956, 0.33088437, 2.20589566]어떻게해야합니까?



답변

실제 높이를 지정하지 않고 전체 플롯 창을 덮을 수직선을 추가하는 표준 방법은 다음과 같습니다. 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='--')


답변

누군가가 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


답변

다른 사람들이 제안했듯이 루프에서 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


답변

위의 답변에 제공된대로 plt.axvlineplt.plot((x1, x2), (y1, y2))OR 외에도 다음을 plt.plot([x1, x2], [y1, y2])사용할 수 있습니다.

plt.vlines(x_pos, ymin=y1, ymax=y2)

에 수직선을 플롯 x_pos에서 스패닝 y1하는 y2곳 값 y1y2절대 좌표 데이터이다.


답변