お困りの方へ
棒グラフや散布図を描いたら、近似曲線を付け足したくなりますよね?
この記事では、グラフの多項式近似曲線の書き方を説明します。
前準備
インポートするモジュール
この記事で示すサンプルコードに必要なモジュールは以下です。
import pandas as pd import numpy as np import matplotlib.pyplot as plt
グラフにするデータの用意
グラフに使うデータをpandas.DataFrameで用意します。
# グラフのデータ作成
df = pd.DataFrame(
data=[2, 10, 6, 30, 85, 70],
index=[0, 1, 2, 3, 4, 5],
columns=['apple'],
)
print(df)
# apple
# 0 2
# 1 10
# 2 6
# 3 30
# 4 85
# 5 70

上記グラフを描くコードです。
fig, ax = plt.subplots(1, 1, figsize=(3.2, 2.4))
df['apple'].plot(
ax=ax,
linewidth=1,
alpha=0.6,
marker='.',
label='apple',
)
ax.legend() # 凡例の表示
plt.show()
numpy.polyfitを理解する
numpy.polyfitは、与えられたデータに対して、指定された次数の多項式曲線をフィットさせる関数です。
近似式を算出する
では、用意したデータの多項式近似曲線を算出します。
1次近似直線
元データのプロットする点(x, y)のリストと次数(1)をnumpy.polyfitに渡すと、近似直線の傾きとY切片が返ってきます。
近似直線は y = 16.82857143 * x – 8.23809524 となりました。
# X軸の値のnumpy.ndarrayを作成する。 x = np.array(df.index.tolist()) print(x) print(type(x)) # [0 1 2 3 4 5] # <class 'numpy.ndarray'> # Y軸の値のnumpy.ndarrayを作成する。 y = np.array(df.values.reshape(1, 6)[0]) print(y) print(type(y)) # [ 2 10 6 30 85 70] # <class 'numpy.ndarray'> # 近似直線の算出 p1 = np.polyfit(x, y, 1) print(p1) print(type(p1)) # [16.82857143 -8.23809524] # <class 'numpy.ndarray'>

上記グラフを描くコードです。
fig, ax = plt.subplots(1, 1, figsize=(3.2, 2.4))
df['apple'].plot(
ax=ax,
linewidth=1,
alpha=0.6,
marker='.',
label='apple',
)
# 近似直線のYの値を算出する。
y1 = p1[0] * x + p1[1]
# 近似直線を描く。
ax.plot(
x,
y1,
linewidth=2,
alpha=0.6,
label='1st',
)
ax.legend() # 凡例の表示
plt.show()
2次の近似曲線
元データのプロットする点(x, y)のリストと次数(2)をnumpy.polyfitに渡すと、近似曲線の2次方程式のパラメータが返ってきます。
近似曲線は y = 2.16071429 * x2 + 6.025 * x – 1.03571429 となりました。
# 2次の近似曲線の算出 p2 = np.polyfit(x, y, 2) print(p2) print(type(p2)) # [ 2.16071429 6.025 -1.03571429] # <class 'numpy.ndarray'>

上記グラフを描くコードです。
fig, ax = plt.subplots(1, 1, figsize=(3.2, 2.4))
df['apple'].plot(
ax=ax,
linewidth=1,
alpha=0.6,
marker='.',
label='apple',
)
# 曲線を滑らかにするために、X軸の値を増やす。
xnew = np.linspace(x[0], x[-1], 100)
# 2次の近似曲線の値を算出する。
y2 = p2[0] * xnew**2 + p2[1] * xnew + p2[2]
# 2次の近似曲線を描く。
ax.plot(
xnew,
y2,
linewidth=2,
alpha=0.6,
color='green',
label='2nd',
)
ax.legend() # 凡例の表示
plt.show()
3次の近似曲線
元データのプロットする点(x, y)のリストと次数(3)をnumpy.polyfitに渡すと、近似曲線の3次方程式のパラメータが返ってきます。
近似曲線は y = – 2.60185185 * x3 + 21.67460317 * x2 – 29.62037037 * x + 6.76984127 となりました。
# 3次の近似曲線の算出 p3 = np.polyfit(x, y, 3) print(p3) print(type(p3)) # [ -2.60185185 21.67460317 -29.62037037 6.76984127] # <class 'numpy.ndarray'>

上記グラフを描くコードです。
fig, ax = plt.subplots(1, 1, figsize=(3.2, 2.4))
df['apple'].plot(
ax=ax,
linewidth=1,
alpha=0.6,
marker='.',
label='apple',
)
# 曲線を滑らかにするために、X軸の値を増やす。
xnew = np.linspace(x[0], x[-1], 100)
# 3次の近似曲線の値を算出する。
y3 = p3[0] * xnew**3 + p3[1] * xnew**2 + p3[2] * xnew + p3[3]
# 3次の近似曲線を描く。
ax.plot(
xnew,
y3,
linewidth=2,
alpha=0.6,
color='red',
label='3rd',
)
ax.legend() # 凡例の表示
plt.show()
