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
これは機能しますが、特にデータに応じて非常に大きな配列を作成する可能性があるため、特に効率的ではありません。このようにする場合は、最初と最後に2つのデータポイントを用意する方が賢明です。それでも、matplotlibにはすでに水平線専用の関数があります。
BlivetWidget 2015年


31

Axesに水平線を描画する場合は、ax.hlines()メソッドを試すこともできます。指定する必要がありますy位置をとxminし、xmax(つまり、実際のデータは、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()

上記のスニペットは、Axesの水平線をプロットしy=0.2ます。水平線はで始まり、x=4で終わりx=20ます。生成される画像は次のとおりです。

ここに画像の説明を入力してください


これはaxhline、描画したい線の特定のx範囲が必要な場合よりもはるかに便利です。「axhline」と「hlines」の違いは何ですか?
Jasonゴール

ではaxhlinexminおよびxmaxは軸座標の観点から、[0、1]の範囲内にあります。異なる座標系の違いについては、こちらをご覧ください。
jdhao

おかげで、もしこれxminxmaxの違いは、間の唯一の違いであるaxhlinehlines、元後者が支配的ではないでしょうか?
Jasonゴール

15

使用matplotlib.pyplot.hlines

  • y 単一の場所として渡すことができます: y=40
  • y 複数の場所として渡すことができます: y=[39, 40, 41]
  • あなたのようなものでフィギュアをプロットしている場合fig, ax = plt.subplots()は、交換するplt.hlinesplt.axhlineax.hlinesax.axhline、それぞれ。
  • matplotlib.pyplot.axhline1つの場所のみをプロットできます(例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答えに加えて、1つもできチェーンaxhline呼び出した後plotpandasさんDataFrame

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.