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

如何为plt.hist的分类数据指定固定分箱及顺序?

解决plt.hist分类数据固定分箱及顺序的问题

要实现批量绘制的直方图都使用统一分箱、固定顺序,哪怕数据集里没有对应类别也要保留分箱,直接用plt.hist处理分类数据无法满足需求,换用以下方法更可靠:

核心思路

先手动统计全局固定分箱的频次(空类别频次设为0),再用plt.bar绘制——bar可以直接指定x轴的所有类别,完美匹配需求。

代码示例

import matplotlib.pyplot as plt
import numpy as np
from collections import Counter

# 定义全局统一的分箱和顺序,所有直方图都沿用这个配置
fixed_bins = ['foo_0', 'foo_1', 'foo_2', 'foo_3']

# 生成示例数据集(可替换为你的实际数据)
data = [f'foo_{i}' for i in np.random.randint(4, size=10)]

# 统计每个固定分箱的频次,无对应类别的自动补0
category_counts = [Counter(data).get(bin_name, 0) for bin_name in fixed_bins]

# 绘制直方图(效果与plt.hist一致,但能严格控制分箱)
plt.bar(fixed_bins, category_counts)
plt.xlabel('类别')
plt.ylabel('频次')
plt.title('统一分箱的分类直方图')
plt.show()

批量绘制扩展

如果要批量处理多组数据,只需循环重复「统计频次+绘制」步骤,所有图表的x轴分箱和顺序完全一致:

# 示例:3组不同的数据集
datasets = [
    [f'foo_{i}' for i in np.random.randint(3, size=10)],  # 仅包含foo_0、foo_1、foo_2
    [f'foo_{i}' for i in np.random.randint(1,4, size=8)], # 仅包含foo_1、foo_2、foo_3
    [f'foo_{i}' for i in np.random.randint(4, size=12)]
]

plt.figure(figsize=(12, 4))
for idx, data in enumerate(datasets, 1):
    counts = [Counter(data).get(bin, 0) for bin in fixed_bins]
    plt.subplot(1, 3, idx)
    plt.bar(fixed_bins, counts)
    plt.title(f'数据集{idx}')
    plt.ylabel('频次')

plt.tight_layout()
plt.show()

为什么之前的方法无效

直接在数据集开头添加固定类别,会让每个类别至少被统计一次,导致频次数据失真;且这种方式并非保留空分箱的正确逻辑——正确做法是基于全局分箱去统计现有数据的频次,空类别补0。

内容的提问来源于stack exchange,提问作者Malcolm Slaney

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:31:17