如何用Python为两列文本数据构建100keV宽度分箱的直方图
用Python创建固定宽度(100keV)的直方图
要实现固定分箱宽度的直方图,核心是直接基于指定宽度生成分箱边界,而非通过极值计算分箱数。先明确数据单位:从你提供的数值来看,第二列能量值大概率是GeV(0.0001GeV = 100keV),以下是完整实现代码:
步骤1:导入依赖库
import numpy as np import matplotlib.pyplot as plt
步骤2:读取文本数据
# 读取文件,跳过换行转义符\,仅提取第二列的能量数据 energy_data = np.loadtxt("your_data_file.txt", comments='\\', usecols=(1,))
步骤3:生成固定宽度的分箱
# 定义分箱宽度:100keV = 0.0001GeV bin_width = 0.0001 # 若数据单位是keV,直接设为100即可 # 计算分箱边界:覆盖所有数据的最小/最大范围,步长为固定宽度 min_e = energy_data.min() max_e = energy_data.max() bins = np.arange( np.floor(min_e / bin_width) * bin_width, np.ceil(max_e / bin_width) * bin_width + bin_width, bin_width )
步骤4:绘制直方图
# 绘制直方图,添加边界线区分分箱 plt.hist(energy_data, bins=bins, edgecolor='black') # 设置坐标轴标签(可根据单位调整) plt.xlabel('Energy (keV)') plt.ylabel('Count') plt.title('Histogram with 100keV Bins') # 转换x轴刻度为keV(若原始数据是GeV) plt.xticks(bins, [f"{b * 1000000:.0f}" for b in bins]) plt.show()
可选:仅统计分箱计数(不绘图)
如果只需要获取每个分箱的计数和边界,无需绘图:
counts, bin_edges = np.histogram(energy_data, bins=bins) print("分箱边界:", bin_edges) print("各分箱计数:", counts)
关键说明
- 使用
np.arange生成固定步长的分箱是核心,这避免了你之前通过极值计算分箱数的错误(该方法仅适用于固定分箱数场景,而非固定宽度) comments='\\'参数用于处理数据中存在的换行转义符\,确保数据读取正常
内容的提问来源于stack exchange,提问作者Rhit.B
相关产品推荐
相关产品推荐

