Python怎么画直方图_hist()频数分布与bins区间数量调整

酷瑶大大_8716

酷瑶大大_8716

2026-04-10

1113人浏览

原创

直方图柱子数量不当需调整bins参数:设整数(如20)指定组数,或用数组(如np.arange(0,101,5))明确定界;避免盲目依赖自动算法(如'sturges'),小样本可试50+;频数分析用density=False(默认),概率密度对比才设True;横轴范围用range控制,边界整齐推荐显式bins数组。

python怎么画直方图_hist()频数分布与bins区间数量调整

plt.hist() 画出来的直方图柱子太少或太多,怎么调 bins

直方图柱子数量不对,本质是 bins 参数没设对。默认值(如 10 或 'auto')只适合简单数据,实际中常需手动控制。

常见错误现象:plt.hist(data) 一跑,要么糊成一团黑块(bins 太少),要么全是细碎断线(bins 太多),根本看不出分布趋势。

  • bins 可以是整数(比如 20),表示强制分 20 组;也可以是数组(比如 np.arange(0, 101, 5)),明确指定每个区间的边界
  • 用 'fd'、'scott'、'sturges' 这类字符串,让 matplotlib 自动算——但别无脑信,尤其当数据有大量重复值或长尾时,'sturges' 常严重低估 bins 数量
  • 如果数据量小(bins=10 往往过密;数据量大(>10000),bins=50 可能还不够,得试到柱子边缘清晰、不锯齿也不重叠为止

想看频数(count)还是概率密度(density),关键看 density 参数

很多人调完 bins 发现纵轴数字看不懂:明明总共 1000 个数,最高柱子却标着 0.03?这就是误用了 density=True。

使用场景:做探索性分析看“有多少个”就用频数(默认);做拟合分布或和 PDF 曲线对比才开 density=True。

  • density=False(默认):纵轴是落入该 bin 的样本个数,所有柱子面积之和 = 总样本数
  • density=True:纵轴变成概率密度,所有柱子面积之和 = 1,此时高度 = 频数 / (总样本数 × bin 宽度)
  • 注意:一旦设了 density=True,就不能直接和原始频数曲线叠在一起画,否则尺度错乱

横坐标范围不对、bin 边界不齐整,检查 range 和 bins 类型配合

比如数据是 [1.2, 1.8, 2.1, ..., 9.7],但直方图从 0 开始、到 10 结束,且 bin 边界是 0.0, 1.0, 2.0...——这种“人为对齐”会让第一组/最后一组空着,或者把本该在一个 bin 的值劈开。

Python Pep Authoring
Python Pep Authoring

依据官方 python/peps仓库规则起草、审阅、编辑或准备 Python 改进提案(PEP),用于处理 PEP 文本和元数据头部。

下载

常见错误现象:直方图左右留白过大、某些 bin 明明有数据却显示为 0、柱子宽度不一致(尤其用了非等距 bins 数组时)。

  • 用 range=(min_val, max_val) 限定横轴范围,但不会改变 bin 划分逻辑;真正控制划分的是 bins
  • 要让 bin 边界整齐(比如都落在整数上),推荐显式传入 bins=np.arange(start, stop+step, step),而不是只靠 range + 整数 bins
  • 如果数据含异常值(比如一个 1000 混在一堆 1~10 的数里),先 data = data[data 截断,再画图,否则 range 被拉长,bins 全部被稀释

和 pandas hist() 混用时,bins 行为不一致容易踩坑

pandas 的 Series.hist() 默认也用 matplotlib.pyplot.hist(),但参数透传有隐式转换——最典型的是 bins 为字符串时(如 'auto'),pandas 会先调 np.histogram_bin_edges() 算一次,再喂给 matplotlib,结果可能和你直接调 plt.hist(..., bins='auto') 不一样。

使用场景:快速探索用 df['col'].hist() 没问题;但需要复现、调试或和模型输出对齐时,务必切回原生 plt.hist() 并显式传参。

  • pandas 的 hist() 不支持 density 参数,要用 weights 手动换算(比如 weights=np.ones(len(data))/len(data))模拟 density 效果
  • 同一份数据,plt.hist(data, bins=20) 和 pd.Series(data).hist(bins=20) 柱子位置和高度几乎一样;但换成 bins='sturges' 就可能差 2–3 个 bin
  • 如果你在 Jupyter 里先跑 df.hist() 再跑 plt.hist(),记得加 plt.figure() 新建画布,否则两张图叠在一起,bins 设置互相干扰

事情说清了就结束。真正难的不是调出一张“看起来对”的直方图,而是每次换数据都要重新判断:这组数据有没有离群点?要不要截断?bin 宽度该不该随数据范围缩放?这些没法写成固定参数,只能看图说话。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1891

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5224

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1829

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

31637

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3747

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3767

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1263

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2903

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程