为指数函数创建更平滑的曲线

时间:2018-12-01 19:06:56

标签: python matplotlib

我有x,y(orderHill)数据,想要平滑地拟合我的数据,但是我的曲线看起来不平滑。我正在使用curve_fit函数和matplotlib

我的代码如下:

def func(x, a, b, c):
    return a*np.exp(-b*x)+c


for i in range(len(hill_numbers)):
    Hill = np.array(hill_numbers[i])

    print Hill, order 

    popt, pcov = curve_fit(func, order, Hill, p0=(1, 1e-6, 1), maxfev=10000)


    plt.plot(order, Hill, ls="none", marker='.', color='grey')

    plt.plot(order, func(order, *popt),'-')



plt.xticks(np.arange(0, 3, step=1))


plt.xlabel('order q')
plt.ylabel('Hill numbers')
plt.show()

我有以下数据

Hill看起来像这样:

[19.        12.14       7.5426009]
[19.        12.14       7.5426009]

order

[0,1,2]
[0,1,2]

我的情节看起来像这样 enter image description here

1 个答案:

答案 0 :(得分:0)

您需要定义一个精细的x网格以绘制连续的平滑线,如下所示。例如,使用linspace作为order_fine = np.linspace(order[0], order[-1], 100),然后使用拟合系数order_fine

*popt传递到绘图函数来完成此操作
import numpy as np
hill_numbers = [[19, 12.14, 7.5426009], [19, 17.14, 15.5426009]]
order = np.array([0,1,2])

def func(x, a, b, c):
    return a*np.exp(-b*x)+c

for i in range(len(hill_numbers)):
    order_fine = np.linspace(order[0], order[-1], 100)
    Hill = np.array(hill_numbers[i])
    popt, pcov = curve_fit(func, order, Hill, p0=(1, 1e-6, 1), maxfev=10000)

    plt.plot(order, Hill, ls="none", marker='.', color='grey')
    plt.plot(order_fine, func(order_fine, *popt),'-')

enter image description here