IT story

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

hot-time 2020. 4. 29. 08:13
반응형

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='--')

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

If someone wants to add a legend and/or colors to some vertical lines, then use this:


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()

Results:

my amazing plot seralouk


In addition to the plt.axvline and plt.plot((x1, x2), (y1, y2)) OR plt.plot([x1, x2], [y1, y2]) as provided in the answers above, one can also use

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

to plot a vertical line at x_pos spanning from y1 to y2 where the values y1 and y2 are in absolute data coordinates.

참고URL : https://stackoverflow.com/questions/24988448/how-to-draw-vertical-lines-on-a-given-plot-in-matplotlib

반응형