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

如何在Python中绘制峰值y值为1的直方图?

让直方图峰值Y值为1的Python实现方案

我明白你的需求啦——不想手动缩放理论曲线,而是直接让直方图的峰值Y值归一化到1,同时还要兼顾hist命令原本生成整数计数柱形的逻辑。这里给你一个清晰的实现思路和代码:

核心思路

我们不直接依赖plt.hist()的自动绘制,而是先获取直方图的原始计数和区间,再将计数除以原始峰值,这样归一化后的计数最大值就是1,最后用plt.bar()手动绘制归一化后的柱形,同时可以直接绘制无需缩放的理论曲线(如果理论曲线本身峰值不是1,也可以同步归一化)。

完整代码示例

import matplotlib.pyplot as plt
import numpy as np

# 替换成你的真实数据
data = np.random.normal(loc=0, scale=1, size=10000)

# 第一步:获取直方图的原始计数、区间信息(不直接绘制)
counts, bins, _ = plt.hist(data, bins=20)
plt.clf()  # 清除自动生成的直方图,准备手动绘制归一化版本

# 第二步:计算原始峰值并归一化计数
peak_count = counts.max()
normalized_counts = counts / peak_count  # 归一化后峰值为1

# 第三步:绘制归一化后的直方图
bin_width = bins[1] - bins[0]
plt.bar(bins[:-1], normalized_counts, width=bin_width, alpha=0.6, color='blue', label='归一化数据')

# 第四步:绘制理论曲线(这里以正态分布为例,同步归一化到峰值1)
x = np.linspace(bins.min(), bins.max(), 1000)
# 替换成你的真实理论曲线公式
theory_curve = np.exp(-(x)**2 / 2) / np.sqrt(2*np.pi)
theory_curve = theory_curve / theory_curve.max()  # 确保理论曲线峰值也是1
plt.plot(x, theory_curve, color='red', linewidth=2, label='理论曲线')

# 美化图表
plt.xlabel('数据区间')
plt.ylabel('归一化高度(峰值=1)')
plt.legend()
plt.grid(axis='y', alpha=0.3)
plt.show()

额外优化:保留原始计数参考

如果你需要同时显示原始计数的数值,可以添加一个右侧次坐标轴:

# 在绘制完主图后添加以下代码
ax1 = plt.gca()
ax2 = ax1.twinx()
# 将归一化的Y轴刻度转换为原始计数
ax2.set_ylabel('原始计数')
ax2.set_ylim(ax1.get_ylim()[0]*peak_count, ax1.get_ylim()[1]*peak_count)

关键说明

  • 用plt.hist()先获取计数而不直接绘制,是为了拿到原始的峰值数据;
  • 归一化操作counts / peak_count确保了直方图的峰值刚好为1,完全省去手动缩放的步骤;
  • 理论曲线也同步做归一化处理,这样两者的峰值都对齐到1,视觉上更匹配。

内容的提问来源于stack exchange,提问作者Allure

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:37:28