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

为什么matplotlib调用plt.hist绘制的直方图显示为直线?

问题原因

出现这个现象和bins参数设置没有关系,核心原因是**err_pct列存在占比极低但数值极大的极端离群值**:

  • 你列里的绝大多数样本都集中在非常窄的低数值区间,只有个别样本的数值比普通样本高几个数量级,这几个异常值会把Matplotlib自动生成的x轴范围拉得极宽。
  • 这种情况下哪怕你把bins设为50,99%以上的样本都会被全部压缩到最靠近原点的第一个分箱里,剩下的49个分箱几乎没有样本,视觉上就只会看到一根竖直的直线,其余x轴区域全是空白。
  • 补充:你最开始设置bins=1本身就是错误用法——这个参数值为1时只会生成1个覆盖全量数据范围的柱子,本身就会显示为一个整块(视觉上就是粗直线),但后续调大bins仍为直线就完全是离群值导致的展示问题。

err_pct列原始数据截图
bins=50时的异常直方图效果

解决方法

按以下步骤排查修复即可:

  1. 先探查数据分布,定位离群值范围
    运行以下代码输出列的统计信息,确认离群值的大小和占比:
# 输出列的计数、均值、分位数、极值
print(new_df['err_pct'].describe())
# 查看数值最大的10个样本,直接定位异常值
print(new_df['err_pct'].sort_values(ascending=False).head(10))
  1. 选择以下任意一种方式调整绘图逻辑
  • 方案1:过滤离群值后绘图(推荐,符合数据分析逻辑)
    根据业务规则去掉不合理的异常值再绘制直方图,比如如果err_pct代表误差率,正常取值不会超过1(即100%),就先过滤掉超出合理范围的值:
import matplotlib.pyplot as plt
import numpy as np

# 过滤超过合理阈值的异常值
clean_data = new_df.loc[new_df['err_pct'] <= 1, 'err_pct'].astype(float)
plt.hist(clean_data, bins=50)
plt.show()
  • 方案2:限定x轴展示范围
    如果不想丢弃离群值,可以手动设置x轴的显示区间,把视图聚焦在绝大多数正常样本的分布范围:
x = new_df['err_pct'].astype(float)
plt.hist(x, bins=50)
# 根据你实际的正常数据范围调整x轴上下限,示例为展示0到0.5区间的分布
plt.xlim(left=0, right=0.5)
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:12:17