You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

再给你几个关键的优化点说明:

  1. 我把高斯函数加上了密度归一化项,确保它的y值和开启density=True的直方图刻度完全匹配,不会出现拟合线跑上天或者缩成一条线的情况。
  2. 用np.linspace生成了覆盖直方图全范围的平滑x轴,保证拟合线能完整覆盖直方图的所有区间,不会只显示一小段。
  3. 把拟合线样式改成了蓝色粗实线,比原来的红色点线更清晰,能直观看到拟合和直方图的匹配度。
  4. 加了plt.tight_layout()自动调整子图间距,避免三个子图的标题挤在一起影响观感。

最后给你两个小排查技巧:

  • 如果拟合线还是没显示,先打印y_fit的最大值,和直方图的y轴最大值对比,要是差好几个数量级,肯定是归一化没做好。
  • 可以临时用ax3.set_ylim(0, 直方图y轴最大值*1.2)手动锁定y轴范围,确保拟合线和直方图都在视野里。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 08:35:30