Python 2.7 条形图上的Python曲线拟合

Python 2.7 条形图上的Python曲线拟合,python-2.7,matplotlib,curve-fitting,best-fit-curve,Python 2.7,Matplotlib,Curve Fitting,Best Fit Curve,如何在条形图上拟合曲线 我有一个方程,扩散方程,它有一些未知参数,这些参数使曲线变大,变高,等等。另一方面,我有一个来自模拟的条形图。我想在柱状图上拟合曲线,并找到曲线的最佳参数,我该怎么做 这是我通过“手动装配”获得的,所以基本上我手动更改了几个小时的所有参数。然而,有没有一种方法可以用python实现这一点 为了简单起见,假设我有以下代码: import matplotlib.pyplot as plt list1 = [] for i in range(-5,6): list

如何在条形图上拟合曲线

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

这是我通过“手动装配”获得的,所以基本上我手动更改了几个小时的所有参数。然而,有没有一种方法可以用python实现这一点

为了简单起见,假设我有以下代码:

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是已知的)

编辑:这与已经提出的问题和scipy文档示例不同。在后一种情况下,“扩展数据”是相同的,而在我的情况下,它可能是,也可能不是。此外,我还可以绘制此曲线拟合,这在文档中没有显示。杆的高度不是x的函数!所以我的扩展数据不是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)
如果你运行这个,它就不工作了。原因是我有16个元素用于ydata,50个元素用于函数。发生这种情况是因为y从扩展数据中获取值,而ydata从另一组x值中获取值,这在这里是未知的


谢谢

我认为这个问题是重复的。下面是使用
curve\u 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')

可能重复@lanery不,这是不同的,我没有数据,我有一个条形图,它没有从相同的x范围中获取值@爬虫类,谢谢你的链接,但是在我的例子中它不起作用,我的函数没有从同一范围的bargraph@lanery,而且我想找到参数,所以问题完全是different@Ianery,我不明白您为什么在
y=func(x,*popt)中使用
*popt
@Euler\u Salter从文档中您可能知道,
popt
是最适合数据的参数列表(
a
b
c
)。所以我用
func(x,*popt)
作为编写
func(x,popt[0],popt[1],popt[2])
的简写,其中
popt[0]
a
的最佳猜测,
popt[1]
b
的最佳猜测,
popt[3]
c
的最佳猜测。
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')