如何在Python中对2D Histogram指定区域进行积分统计
解决2D直方图特定区间积分问题及代码冗余优化
代码冗余问题说明
你先通过np.linspace生成了自定义的分箱边界数组x_bins和y_bins,但随后又将这两个变量重新赋值为整数100,直接覆盖了之前的分箱设置,这属于冗余代码。如果想使用自定义的分箱区间(从数据最小值到指定最大值,分成100个bin),应该保留linspace的结果,而非重新赋值。
特定区间积分统计数据点的方法
plt.hist2d函数会返回四个核心值:
counts: 二维数组,每个元素对应对应bin内的数据点数量xedges: x轴方向的bin边界数组yedges: y轴方向的bin边界数组image: 绘制的图像对象
我们可以利用这些返回值,定位目标区间对应的bin位置,再对counts的对应区域求和,得到该区间内的数据点总数。
修改后的完整代码示例
import numpy as np import matplotlib.pyplot as plt # 假设E和Eint是已有的数据数组 # E = ... # Eint = ... # 定义x、y轴的分箱范围 x_min = np.min(E) x_max = 1000 y_min = np.min(Eint) y_max = 0.6 # 生成自定义分箱边界(分成100个bin) x_bins = np.linspace(x_min, x_max, 100) y_bins = np.linspace(y_min, y_max, 100) fig, ax = plt.subplots(figsize=(10,7)) # 获取hist2d的返回值,这是统计区间数据的关键 counts, xedges, yedges, im = plt.hist2d(E, Eint, bins=[x_bins, y_bins], cmap=plt.cm.RdBu) plt.colorbar() plt.show() # 定义你需要统计的目标区间,示例为x∈[200,500],y∈[0.2,0.4] target_x_low, target_x_high = 200, 500 target_y_low, target_y_high = 0.2, 0.4 # 找到目标区间对应的bin索引 x_left_idx = np.digitize(target_x_low, xedges) - 1 # 减1适配左闭右开的bin边界规则 x_right_idx = np.digitize(target_x_high, xedges) y_bottom_idx = np.digitize(target_y_low, yedges) - 1 y_top_idx = np.digitize(target_y_high, yedges) # 对目标区域的counts求和,得到数据点总数 total_points = np.sum(counts[x_left_idx:x_right_idx, y_bottom_idx:y_top_idx]) print(f"目标区间内的数据点总数:{total_points}")
代码说明
- 保留
np.linspace生成的分箱边界,确保分箱符合你最初的范围设定 - 通过
plt.hist2d的返回值获取每个bin的计数和边界信息 - 使用
np.digitize定位目标区间对应的bin位置,注意索引调整以适配bin的左闭右开规则 - 对
counts的子数组求和,直接得到目标区间内的总数据点数量
内容的提问来源于stack exchange,提问作者Moaning Salmon
相关产品推荐
相关产品推荐

