[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()
결과 :
답변
다른 사람들이 제안했듯이 루프에서 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
답변
위의 답변에 제공된대로 plt.axvline
및 plt.plot((x1, x2), (y1, y2))
OR 외에도 다음을 plt.plot([x1, x2], [y1, y2])
사용할 수 있습니다.
plt.vlines(x_pos, ymin=y1, ymax=y2)
에 수직선을 플롯 x_pos
에서 스패닝 y1
하는 y2
곳 값 y1
과 y2
절대 좌표 데이터이다.