如何在Matplotlib中通过分箱获取数据分布并绘制热力图?
如何将试验数据数组转换为分布热力图
需求说明
你有一个二维数组data1,其中:
- 列:对应不同的相关常数
correls - 行:对应每个相关常数的试验次数
repeats - 数组值为0-1的小数,需要为每个相关常数统计20-30个分箱的分布,并以热力图形式展示(已用直方图实现,需转换为热力图)
解决方案步骤
核心思路是先计算每个相关常数对应数据的分箱分布,得到一个分箱×相关常数的二维数组,再用这个数组绘制热力图。
1. 计算分箱分布数据
使用numpy.histogram对每一列数据统计分箱频次,可选择归一化(转为频率)让分布更具可比性:
import numpy as np # 假设已定义correls、repeats,且data1已填充试验数据 num_bins = 30 # 设置分箱数量 bins = np.linspace(0, 1, num_bins + 1) # 生成0到1的分箱边界 # 初始化分布数组:行=分箱,列=相关常数 dist_data = np.zeros((num_bins, len(correls))) # 遍历每个相关常数对应的列,计算分布 for col_idx in range(len(correls)): # 获取当前列的所有试验数据 column_data = data1[:, col_idx] # 统计分箱频次 bin_counts, _ = np.histogram(column_data, bins=bins) # 归一化为频率(频次/总试验次数),也可以直接用bin_counts dist_data[:, col_idx] = bin_counts / len(repeats)
2. 绘制分布热力图
用seaborn.heatmap或matplotlib.imshow绘制,以下是seaborn的示例:
import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(12, 7)) # 绘制热力图 sns.heatmap( dist_data, xticklabels=correls, # X轴标签为相关常数 # Y轴标签为分箱区间,保留两位小数 yticklabels=[f"{bins[i]:.2f}~{bins[i+1]:.2f}" for i in range(num_bins)], cmap="YlGnBu", # 选择合适的配色 cbar=True, cbar_kws={"label": "归一化频率"}, # 色条标签 annot=False # 不需要单元格标注则设为False,需要则改为True ) # 调整图表样式 plt.xlabel("相关常数") plt.ylabel("数据分箱区间") plt.title("各相关常数对应试验数据的分布热力图") plt.yticks(rotation=0) # 让Y轴标签水平显示,提升可读性 plt.tight_layout() plt.show()
关键说明
dist_data是热力图的核心输入,每一列对应一个相关常数的分箱分布,行对应分箱区间- 归一化步骤可根据需求选择:若试验次数相同,直接用频次
bin_counts也能反映分布差异;归一化后更适合跨相关常数的分布对比 - 热力图的颜色深浅直观展示了每个分箱内数据的占比(或数量),每一列就是该相关常数的完整分布特征
内容的提问来源于stack exchange,提问作者soapeater
相关产品推荐
相关产品推荐

