Python中的二维直方图二维高斯函数拟合

问题描述

在 Python 中,我使用 np.hist2d() 函数绘制二维直方图。现在,我想为此拟合一个 2D 高斯函数。我尝试了其他方法,但它不起作用。

# Defining the 2D Gaussian function
def twoD_Gaussian(xdata_tuple,amplitude,xo,yo,sigma_x,sigma_y,theta,offset):
    (x,y) = xdata_tuple
    xo = float(xo)
    yo = float(yo)    
    a = (np.cos(theta)**2)/(2*sigma_x**2) + (np.sin(theta)**2)/(2*sigma_y**2)
    b = -(np.sin(2*theta))/(4*sigma_x**2) + (np.sin(2*theta))/(4*sigma_y**2)
    c = (np.sin(theta)**2)/(2*sigma_x**2) + (np.cos(theta)**2)/(2*sigma_y**2)
    g = offset + amplitude*np.exp( - (a*((x-xo)**2) + 2*b*(x-xo)*(y-yo) 
                            + c*((y-yo)**2)))
    return g.ravel() 

定义二维高斯函数后,我现在使用 np.histogram2d() 函数并尝试拟合数据。

plt.figure(figsize=(9,6))

xedges = np.linspace(2,13,20)
yedges = np.linspace(2,20)
xe,ye = np.meshgrid(xedges,yedges)

#plt.hist2d(x,y,bins=[xedges,yedges])

hist2d,xedges,yedges = np.histogram2d(x,bins=(xedges,yedges))
plt.imshow(hist2d,cmap=plt.cm.jet,origin='lower',extent=[xedges[0],xedges[-1],yedges[0],yedges[-1]])
plt.colorbar()

popt2d,pcov2d = curve_fit(gauss2d,(xe,ye),hist2d.ravel())

plt.xlabel('x [$ \mathrm{\mu m}$]',fontsize=12)
plt.ylabel('y [$ \mathrm{\mu m}$]',fontsize=12)
plt.title('2D position histogram',fontsize=16)
plt.savefig("2D_histogram.pdf",dpi=300,format="pdf",bBox_inches="tight",pad_inches=0.025)
plt.savefig("2D_histogram.jpeg")
plt.show() 

我之所以定义 xe 和 ye 是因为需要用到 np.meshgrid() 函数。但是我无法将它们包含在 np.histogram2d() 函数的 bin 中,因为您只能将 1D 用于 bin。

ValueError: operands Could not be broadcast together with shapes (800,) (361,) 

以上是我得到的错误。显然,(xe,ye) 和 hist2d.ravel() 的形状是不同的。但我找不到让它们保持相同形状的方法。我不知道这是唯一的问题,还是还有其他问题。提前致谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)