Python 条形图上的曲线拟合
Python curve fitting on a barplot
如何在条形图上拟合曲线?
我有一个方程,扩散方程,它有一些未知参数,这些参数使曲线更大、更高等。另一方面,我有一个来自模拟的条形图。我想在条形图上拟合曲线,并找到曲线的最佳参数,我该怎么做?
这是我通过'manual fitting'获得的,所以基本上我手动更改了几个小时的所有参数。但是有没有办法用 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 已知)
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)
如果你运行这个,它不起作用。原因是我有 16 个元素用于 ydata 和 50 个元素用于函数。发生这种情况是因为 y 从 xdata 中获取值,而 ydata 从另一组 x 值中获取值,这在这里是未知的。
谢谢
我认为这个问题是重复的。以下是使用 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')
如何在条形图上拟合曲线?
我有一个方程,扩散方程,它有一些未知参数,这些参数使曲线更大、更高等。另一方面,我有一个来自模拟的条形图。我想在条形图上拟合曲线,并找到曲线的最佳参数,我该怎么做?
这是我通过'manual fitting'获得的,所以基本上我手动更改了几个小时的所有参数。但是有没有办法用 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 已知)
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)
如果你运行这个,它不起作用。原因是我有 16 个元素用于 ydata 和 50 个元素用于函数。发生这种情况是因为 y 从 xdata 中获取值,而 ydata 从另一组 x 值中获取值,这在这里是未知的。
谢谢
我认为这个问题是重复的。以下是使用 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')