Python曲线拟合在一个barplot

时间:2016-06-17 17:24:19

标签: python-2.7 matplotlib curve-fitting best-fit-curve

如何在条形图上拟合曲线?

我有一个方程,扩散方程,它有一些未知参数,这些参数使曲线更大,更高等。另一方面,我有一个来自模拟的条形图。我想在条形图上拟合曲线,找到曲线的最佳参数,我该怎么做?

这是我通过'手动拟合'获得的,所以基本上我手动更改所有参数数小时。但有没有办法用python做到这一点?

Attempt of curve fitting

为简单起见,想象一下我有以下代码:

import matplotlib.pyplot as plt


list1 = []
for i in range(-5,6):
    list1.append(i)

width = 1/1.5

list2 = [0,0.2,0.6,3.5,8,10,8,3.5,0.6,0.2,0]

plt.bar(list1,list2,width)

plt.show()
T = 0.13
xx = np.arange(-6,6,0.01)
yy = 5*np.sqrt(np.pi)*np.exp(-((xx)**2)/(4*T))*scipy.special.erfc((xx)/(2*np.sqrt(T))) + np.exp(-((xx)**2)/(4*T)) 

plt.plot(xx,yy)

plt.show()

显然这里的拟合会非常困难,但无论如何,是否有任何函数或类似函数允许我找到等式的最佳系数:(其中T已知)

y = A*np.sqrt(np.pi*D)*np.exp(-((x-E)**2)/(4*D*T))*scipy.special.erfc((x-E)/(2*np.sqrt(D*T))) + 300*np.exp(-((x-E)**2)/(4*D*T)) 

编辑:这与已经提出的问题和scipy文档示例不同。在后者中,'xdata'是相同的,而在我的情况下它可能也可能不是。此外,我还可以绘制此曲线拟合,这未在文档中显示。条的高度不是x的函数!所以我的xdata不是我的ydata的功能,这与文档中的内容不同。 要了解我的意思,请尝试稍微更改文档中的代码,以便进入我的示例,试试这个:

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

xdata = np.linspace(0,4,50)
y = func(xdata, 2.5, 1.3, 0.5)
ydata = [1,6,3,4,6,7,8,5,7,0,9,8,2,3,4,5]

popt, pcov = curve_fit(func,xdata,ydata)

如果你运行它,它不起作用。原因是我有ydata的16个元素和函数的50个元素。发生这种情况是因为y从xdata获取值,而ydata从另一组x值中获取值,这是未知的。

谢谢

1 个答案:

答案 0 :(得分:2)

我坚持认为这个问题是重复的。以下是使用curve_fit的典型工作流程的简短示例。如果您仍然认为您的情况不同,请告诉我。

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

# bar plot data
list1 = range(-5, 6)
list2 = [0, 0.2, 0.6, 3.5, 8, 10,
         8, 3.5, 0.6, 0.2, 0]
width = 1/1.5

plt.bar(list1, list2, width, alpha=0.75)

# fit bar plot data using curve_fit
def func(x, a, b, c):
    # a Gaussian distribution
    return a * np.exp(-(x-b)**2/(2*c**2))

popt, pcov = curve_fit(func, list1, list2)

x = np.linspace(-5, 5, 100)
y = func(x, *popt)

plt.plot(x + width/2, y, c='g')

enter image description here