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을 호출하면 작동하지만 불편 할 수 있습니다.
- 각 선은 별도의 플롯 객체이므로 많은 선이있을 때 작업 속도가 매우 느려집니다.
- 범례를 만들 때 각 줄에 새 항목이 생겨서 원하는 항목이 아닐 수 있습니다.
대신 모든 선을 단일 플롯 객체로 만드는 다음 편의 기능을 사용할 수 있습니다.
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:
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.
'IT story' 카테고리의 다른 글
.so, .la 및 .a 라이브러리 파일의 차이점은 무엇입니까? (0) | 2020.04.30 |
---|---|
Java EE 란 무엇입니까? (0) | 2020.04.29 |
웹 사이트를 다시 크롤링하도록 Google에 요청하는 방법은 무엇입니까? (0) | 2020.04.29 |
node.js에 json이 필요합니까? (0) | 2020.04.29 |
jQuery에서 주어진 클래스가없는 모든 요소를 어떻게 선택할 수 있습니까? (0) | 2020.04.29 |