Matplotlib多子图布局中为直方图叠加高斯拟合曲线的实现问题
Matplotlib多子图布局中为直方图叠加高斯拟合曲线的实现问题
嘿,我完全懂你现在的困扰——在多子图布局里给直方图加高斯拟合线,结果要么拟合线没显示对,要么看起来像是把直方图覆盖了是吧?别担心,咱们来拆解下你的代码,把这个小问题解决掉。
你的代码大方向其实是对的:先画直方图再画拟合线,但有几个细节没注意到,导致拟合效果不符合预期:
- 你用了
'ro:'作为拟合线样式,红色圆点加虚线,这种样式如果和直方图柱子重叠,很容易让你误以为直方图被替换了;更关键的是,可能你的centBins范围没完全覆盖直方图的bins区间,或者拟合曲线的数值量级和直方图不匹配(毕竟你开了density=True)。 - 另外,你有没有确认
gauss_function是做了密度归一化的?如果函数输出没对应直方图的密度刻度,拟合线可能会跑到y轴视野外,看起来就像没画出来一样。
咱们来调整下代码,把这些问题都补上:
import matplotlib.pyplot as plt import numpy as np # 先确保你有正确定义高斯函数(如果还没写的话) def gauss_function(x, a, mu, sigma): # 这里加上了密度归一化项,对应直方图的density=True参数 return a * np.exp(-(x - mu)**2 / (2 * sigma**2)) / (sigma * np.sqrt(2 * np.pi)) # 替换成你自己的实际数据 # histData = ... # nBins = ... # pOpt = ... 你的拟合参数 # img, img2 = ... 你的图像数据 # plotTitle, plotTitle2 = ... 你的子图标题 fig, (ax1, ax2, ax3) = plt.subplots(ncols=3, figsize=(60,20)) # 第一个图像子图 ax1.imshow(img, cmap='viridis') ax1.set_title(plotTitle, fontsize=35) ax1.set_xticks([]) ax1.set_yticks([]) # 第二个图像子图 ax2.imshow(img2, cmap='magma') ax2.set_title(plotTitle2, fontsize=35) ax2.set_xticks([]) ax2.set_yticks([]) # 直方图+拟合线子图 # 先画直方图,同时获取bins的范围,方便后续生成拟合线的x轴 hist_counts, bins, _ = ax3.hist(histData, density=True, bins=nBins, label='Intensity Histogram') # 生成覆盖整个直方图bins范围的平滑x轴,比你原有的centBins更适配 x_fit = np.linspace(bins[0], bins[-1], 200) # 计算拟合曲线的y值 y_fit = gauss_function(x_fit, *pOpt) # 把拟合线改成更显眼的蓝色实线,避免和直方图混淆 ax3.plot(x_fit, y_fit, 'b-', linewidth=3, label='Gaussian Fit') # 加上图例,让图的可读性更强 ax3.legend(fontsize=25) ax3.set_title('Intensity Histogram', fontsize=35) # 调整刻度字体大小,和标题风格统一 ax3.tick_params(axis='both', labelsize=25) # 自动调整子图间距,避免标题、元素互相重叠 plt.tight_layout() plt.show()
再给你几个关键的优化点说明:
- 我把高斯函数加上了密度归一化项,确保它的y值和开启
density=True的直方图刻度完全匹配,不会出现拟合线跑上天或者缩成一条线的情况。 - 用
np.linspace生成了覆盖直方图全范围的平滑x轴,保证拟合线能完整覆盖直方图的所有区间,不会只显示一小段。 - 把拟合线样式改成了蓝色粗实线,比原来的红色点线更清晰,能直观看到拟合和直方图的匹配度。
- 加了
plt.tight_layout()自动调整子图间距,避免三个子图的标题挤在一起影响观感。
最后给你两个小排查技巧:
- 如果拟合线还是没显示,先打印
y_fit的最大值,和直方图的y轴最大值对比,要是差好几个数量级,肯定是归一化没做好。 - 可以临时用
ax3.set_ylim(0, 直方图y轴最大值*1.2)手动锁定y轴范围,确保拟合线和直方图都在视野里。
内容来源于stack exchange
相关产品推荐
相关产品推荐

