如何将 curve_fit 与 barplot 一起使用?
How to use curve_fit with barplot?
我刚开始使用 scipy.optimize
中的 curve_fit()
函数,但我无法使用它。
我有一个条形图,非常简单,我想创建一条“适合”它的曲线。
我的代码:
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
x = [i for i in range(15)]
y = [1,3,4,6,8,4,2,1,5,8,6,5,5,8,5]
plt.bar(x,y,color='yellow')
plt.show()
# that is working
curve_fit(x,y) # I want the curve to fit the barplot
# but it returns an error...
plt.show()
结果:由于 curve_fit.
而出错
如果你能帮助我,那就太好了。
- 那是bonus,不要浪费太多时间,但是你知道怎么做曲线和预测吗?例如,结果可能是:
curve_fit
您需要将拟合函数传递给curve_fit
。请注意,对于这么小的样本,您绘制的线非常过拟合,需要 high-order 多项式(即使 三次拟合也不会像那样 )。
下面是一个使用四次拟合函数的例子f_curve4
:
# curve_fit requires x and y to be arrays (not lists)
x = np.arange(15)
y = np.array([1, 3, 4, 6, 8, 4, 2, 1, 5, 8, 6, 5, 5, 8, 5])
plt.bar(x, y, color='cyan')
# fit
f_curve4 = lambda x, a, b, c, d, e: a*x**4 + b*x**3 + c*x**2 + d*x + e
popt, pcov = curve_fit(f_curve4, x, y)
plt.plot(x, f_curve4(x, *popt), '--', label='fit')
# forecast
x_new = np.arange(max(x), max(x) + 2)
plt.plot(x_new, f_curve4(x_new, *popt), 'r:', label='forecast')
polyfit
或者使用 polyfit
并直接传递 deg=N
而无需手动定义 Nth-order 拟合函数:
plt.bar(x, y, color='cyan')
# fit
f_poly4 = np.polyfit(x, y, deg=4)
x_fit = np.linspace(min(x), max(x), 100)
y_fit = np.polyval(f_poly4, x_fit)
plt.plot(x_fit, y_fit, '--', label='fit')
# forecast
x_new = np.linspace(max(x), max(x) + 1, 10)
y_new = np.polyval(f_poly4, x_new)
plt.plot(x_new, y_new, 'r:', lw=2, label='forecast')
interp1d
根据您的用例,考虑使用 interp1d
进行插值而不是拟合多项式。下面是使用三次插值函数的例子 f_interp
:
plt.bar(x, y, color='cyan')
f_interp = interpolate.interp1d(x, y, kind='cubic')
x2 = np.linspace(min(x), max(x), 100)
plt.plot(x2, f_interp(x2), '--')
我刚开始使用 scipy.optimize
中的 curve_fit()
函数,但我无法使用它。
我有一个条形图,非常简单,我想创建一条“适合”它的曲线。
我的代码:
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
x = [i for i in range(15)]
y = [1,3,4,6,8,4,2,1,5,8,6,5,5,8,5]
plt.bar(x,y,color='yellow')
plt.show()
# that is working
curve_fit(x,y) # I want the curve to fit the barplot
# but it returns an error...
plt.show()
结果:由于 curve_fit.
而出错如果你能帮助我,那就太好了。
- 那是bonus,不要浪费太多时间,但是你知道怎么做曲线和预测吗?例如,结果可能是:
curve_fit
您需要将拟合函数传递给curve_fit
。请注意,对于这么小的样本,您绘制的线非常过拟合,需要 high-order 多项式(即使 三次拟合也不会像那样 )。
下面是一个使用四次拟合函数的例子f_curve4
:
# curve_fit requires x and y to be arrays (not lists)
x = np.arange(15)
y = np.array([1, 3, 4, 6, 8, 4, 2, 1, 5, 8, 6, 5, 5, 8, 5])
plt.bar(x, y, color='cyan')
# fit
f_curve4 = lambda x, a, b, c, d, e: a*x**4 + b*x**3 + c*x**2 + d*x + e
popt, pcov = curve_fit(f_curve4, x, y)
plt.plot(x, f_curve4(x, *popt), '--', label='fit')
# forecast
x_new = np.arange(max(x), max(x) + 2)
plt.plot(x_new, f_curve4(x_new, *popt), 'r:', label='forecast')
polyfit
或者使用 polyfit
并直接传递 deg=N
而无需手动定义 Nth-order 拟合函数:
plt.bar(x, y, color='cyan')
# fit
f_poly4 = np.polyfit(x, y, deg=4)
x_fit = np.linspace(min(x), max(x), 100)
y_fit = np.polyval(f_poly4, x_fit)
plt.plot(x_fit, y_fit, '--', label='fit')
# forecast
x_new = np.linspace(max(x), max(x) + 1, 10)
y_new = np.polyval(f_poly4, x_new)
plt.plot(x_new, y_new, 'r:', lw=2, label='forecast')
interp1d
根据您的用例,考虑使用 interp1d
进行插值而不是拟合多项式。下面是使用三次插值函数的例子 f_interp
:
plt.bar(x, y, color='cyan')
f_interp = interpolate.interp1d(x, y, kind='cubic')
x2 = np.linspace(min(x), max(x), 100)
plt.plot(x2, f_interp(x2), '--')