matplotlib을 사용하여 수평선을 그립니다.


131

스플라인 보간법을 사용하여 시계열을 매끄럽게하고 플롯에 수평선을 추가하고 싶습니다. 그러나 내 그립에서 벗어난 문제가있는 것 같습니다. 도움이 정말 도움이 될 것입니다. 여기 내가 가진 것입니다 :

annual = np.arange(1,21,1)
l = np.array(value_list) # a list with 20 values
spl = UnivariateSpline(annual,l)
xs = np.linspace(1,21,200)
plt.plot(xs,spl(xs),'b')

plt.plot([0,len(xs)],[40,40],'r--',lw=2)
pylab.ylim([0,200])
plt.show()

[0,len(xs)]가로 선 플로팅에 문제가있는 것 같습니다 .

답변:


5

당신이 맞습니다, 나는 [0,len(xs)]당신을 버리고 있다고 생각합니다 . 원래 x 축 변수를 재사용하고 변수 xs가 포함 된 동일한 길이의 다른 numpy 배열로 플로팅합니다.

annual = np.arange(1,21,1)
l = np.array(value_list) # a list with 20 values
spl = UnivariateSpline(annual,l)
xs = np.linspace(1,21,200)
plt.plot(xs,spl(xs),'b')

#####horizontal line
horiz_line_data = np.array([40 for i in xrange(len(xs))])
plt.plot(xs, horiz_line_data, 'r--') 
###########plt.plot([0,len(xs)],[40,40],'r--',lw=2)
pylab.ylim([0,200])
plt.show()

잘만되면 문제가 해결됩니다!


19
이것은 효과가 있지만 특히 데이터에 따라 잠재적으로 매우 큰 배열을 만들 때 특히 효율적이지 않습니다. 이 방법으로 수행하려면 시작 부분과 끝 부분에 두 개의 데이터 요소가있는 것이 더 현명합니다. 여전히 matplotlib에는 이미 수평선 전용 기능이 있습니다.
BlivetWidget


31

축에 수평선을 그리려면 ax.hlines()방법 을 시도해보십시오 . 당신은 지정해야하는 y위치를 xminxmax데이터에 (실제 데이터는 x 축에 범위, 즉) 좌표입니다. 샘플 코드 스 니펫은 다음과 같습니다.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1, 21, 200)
y = np.exp(-x)

fig, ax = plt.subplots()
ax.plot(x, y)
ax.hlines(y=0.2, xmin=4, xmax=20, linewidth=2, color='r')

plt.show()

위의 스 니펫은의 축에 수평선을 그 y=0.2립니다. 수평선은에서 시작하여에서 x=4끝납니다 x=20. 생성 된 이미지는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


이것은 axhline그리는 선의 특정 x 범위가 필요할 때보 다 훨씬 편리합니다 . 'axhline'과 'hlines'의 차이점은 무엇입니까?
Jason Goal

이어 axhline상기 xmin와는 xmax축 측면들이 범위 [0, 1]에 있도록 조정에있다. 다른 좌표계의 차이점에 대해서는 여기 를 참조 하십시오 .
jdhao

이 경우 감사 xminxmax차이가 사이의 유일한 차이 axhline하고 hlines, 전 후자를 지배하지?
Jason Goal

15

사용 matplotlib.pyplot.hlines:

  • y 단일 위치로 전달 될 수 있습니다. y=40
  • y 여러 위치로 전달 될 수 있습니다. y=[39, 40, 41]
  • 당신은 같은과 그림을하려하는 경우 fig, ax = plt.subplots(), 다음 교체 plt.hlines또는 plt.axhline과 함께 ax.hlines또는 ax.axhline각각.
  • matplotlib.pyplot.axhline단 하나의 위치를 플롯 할 수 있습니다 (예를 들어 y=40)
import numpy as np
import matplotlib.pyplot as plt

xs = np.linspace(1, 21, 200)
plt.hlines(y=40, xmin=0, xmax=len(xs), colors='r', linestyles='--', lw=2)
plt.show()

여기에 이미지 설명을 입력하십시오


12

여기에 가장 upvoted 답변을뿐만 아니라, 하나는 체인 수 axhline호출 한 후 plotA의 pandasDataFrame.

import pandas as pd

(pd.DataFrame([1, 2, 3])
   .plot(kind='bar', color='orange')
   .axhline(y=1.5));

여기에 이미지 설명을 입력하십시오


2

항상 명령을 잊어 버린 사람들을위한 좋고 쉬운 방법 axhline은 다음과 같습니다.

plt.plot(x, [y]*len(x))

귀하의 경우 xs = xy = 40. len (x)가 크면 비효율적이므로 실제로 사용해야 axhline합니다.


2

plt.grid수평선을 그리는 데 사용할 수 있습니다 .

import numpy as np
from matplotlib import pyplot as plt
from scipy.interpolate import UnivariateSpline
from matplotlib.ticker import LinearLocator

# your data here
annual = np.arange(1,21,1)
l = np.random.random(20)
spl = UnivariateSpline(annual,l)
xs = np.linspace(1,21,200)

# plot your data
plt.plot(xs,spl(xs),'b')

# horizental line?
ax = plt.axes()
# three ticks:
ax.yaxis.set_major_locator(LinearLocator(3))
# plot grids only on y axis on major locations
plt.grid(True, which='major', axis='y')

# show
plt.show()

랜덤 데이터 플롯 예

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