如何从二维直方图(2D Histogram)获取分箱计数及散点对应分箱坐标
嘿,我来帮你搞定获取散点分箱坐标和分箱计数的需求!先把你的示例代码补全,再一步步实现你要的功能:
完整实现方案
首先,我们先补全随机数据生成逻辑,再通过numpy.histogram2d获取二维直方图的核心信息——这是拿到分箱坐标和计数的关键:
import random import matplotlib.pyplot as plt import numpy as np # 生成完整的随机XY数据集 x = [random.randrange(1, 100, 1) for _ in range(10000)] y = [random.randrange(1, 100, 1) for _ in range(10000)] x_np = np.array(x) y_np = np.array(y) # 自定义二维直方图的分箱数量(比如设置10x10的网格) bin_num = 10 # 计算二维直方图:得到分箱计数、x轴分箱边界、y轴分箱边界 counts, x_bins, y_bins = np.histogram2d(x_np, y_np, bins=bin_num) # -------------------------- # 1. 获取每个散点所在的分箱坐标 # -------------------------- # 用digitize找到每个散点对应的分箱索引(注意:digitize返回1-based索引,要减1转为0-based) x_bin_indices = np.digitize(x_np, x_bins) - 1 # 修正边界值的索引越界问题:如果散点等于最大边界值,会被分到超出范围的索引,这里调整为最后一个分箱 x_bin_indices[x_bin_indices == bin_num] = bin_num - 1 y_bin_indices = np.digitize(y_np, y_bins) - 1 y_bin_indices[y_bin_indices == bin_num] = bin_num - 1 # 计算每个分箱的中心坐标(也可以按需取左下角/右上角,这里用中心做示例) x_bin_centers = (x_bins[:-1] + x_bins[1:]) / 2 y_bin_centers = (y_bins[:-1] + y_bins[1:]) / 2 # 每个散点对应的分箱中心坐标 scatter_bin_x = x_bin_centers[x_bin_indices] scatter_bin_y = y_bin_centers[y_bin_indices] # -------------------------- # 2. 获取分箱计数(直接从counts数组提取) # -------------------------- # counts是二维数组,counts[i][j]对应x第i个分箱、y第j个分箱的点数量 # 把分箱计数和每个散点绑定 scatter_bin_counts = counts[x_bin_indices, y_bin_indices] # -------------------------- # 可视化验证:散点图+2D直方图网格+分箱高亮 # -------------------------- plt.figure(figsize=(10, 8)) # 绘制基础散点图 plt.scatter(x_np, y_np, s=5, alpha=0.3, label='原始散点') # 叠加二维直方图网格 plt.hist2d(x_np, y_np, bins=bin_num, cmap='Blues', alpha=0.2) # 高亮某个散点的分箱(比如第0个散点) target_idx = 0 plt.scatter(scatter_bin_x[target_idx], scatter_bin_y[target_idx], s=100, c='red', marker='*', label=f'第{target_idx}个散点的分箱中心\n该分箱计数:{scatter_bin_counts[target_idx]}') plt.xlabel('X轴') plt.ylabel('Y轴') plt.legend() plt.colorbar(label='分箱内点数量') plt.show() # 打印部分结果做验证 print("前5个散点的分箱信息:") for i in range(5): print(f"散点{i}: 原始坐标({x_np[i]}, {y_np[i]}) → 分箱中心({scatter_bin_x[i]:.1f}, {scatter_bin_y[i]:.1f}),分箱计数:{scatter_bin_counts[i]}")
关键细节说明:
np.histogram2d返回的counts就是分箱计数的二维数组,x_bins和y_bins是分箱的边界值列表np.digitize用来匹配散点和分箱的对应关系,一定要处理边界值的索引越界问题,避免报错- 分箱坐标可以根据需求调整:如果需要左下角坐标,直接取
x_bins[:-1][x_bin_indices]和y_bins[:-1][y_bin_indices]即可
内容的提问来源于stack exchange,提问作者user9410826
相关产品推荐
相关产品推荐

