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


259

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

특히, 시간 인덱스가 0에서 2.6 (s) 범위 인 신호 플롯에서 목록에 해당하는 시간 인덱스를 나타내는 빨간색 세로선을 그리려면 [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당신은 축 corrdinates에 좋아하는 경우 (예를 들어 ymin=0.25, ymax=0.75플롯의 중간 반을 다룰 것입니다). 수평선 ( axhline) 및 사각형 ( axvspan)에 해당하는 기능이 있습니다 .


7
그러나 주어진 축 객체에 선을 어떻게 플롯합니까?
Eric

8
@Eric ax이 객체라면 ax.axvline(x=0.220589956)나를 위해 일하는 것 같습니다.
Joel

axvline인수 는 플롯 창을 기준으로 0에서 1 사이의 스칼라입니다. 이 질문에서 묻는 2.205와 같은 주어진 x 또는 y 위치에 선을 어떻게 그리나요?
에드워드 네드 하비

외모 좋아 stackoverflow.com/questions/16930328/...이 답을 가지고있다. plt.plot((x1,x2),(y1,y2))
에드워드 네드 하비

1
ymax와 ymin은 0과 1 사이 여야하며 0은 그림의 맨 아래이고 1은 그림의 맨 위입니다. 이 범위를 벗어난 값을 사용하는 경우 y 위치를 올바른 비율로 변환해야합니다.
Dylan Kapp

50

여러 줄

xposition = [0.3, 0.4, 0.45]
for xc in xposition:
    plt.axvline(x=xc, color='k', linestyle='--')

1
세로선에 범례를 어떻게 넣습니까?
Charlie Parker

@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.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절대 좌표 데이터이다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.