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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:33:34