【问题标题】:Why doesn't the `normed` parameter for matplotlib histograms do anything?为什么 matplotlib 直方图的 `normed` 参数不做任何事情?
【发布时间】:2018-02-03 21:42:01
【问题描述】:

我对来自 matplotlib.pyplot.histnormed 参数以及它为什么不改变绘图输出感到困惑:

如果为 True,则返回元组的第一个元素将是计数 归一化以形成概率密度,即n/(len(x)'dbin),即 直方图的积分总和为 1。如果stacked 也是 True, 直方图之和归一化为 1。

默认为假

看起来很清楚。我见过它称为密度函数、概率密度等。

即给定大小为 1000 在 [0, 10] 中的随机均匀分布:

指定 normed=True 应将 y 轴更改为密度轴,其中条的总和为 1.0:

但实际上它什么也没做:

r = np.random.uniform(size=1000)
plt.hist(r, normed=True)

此外:

print(plt.hist(r, normed=True)[0].sum())
# definitely not 1.0
10.012123595

所以,我已经看到@Carsten König 的answers 提出了类似的问题,并不要求解决方法。我的问题是,normed 的目的是什么?我是否误解了这个参数的实际作用?

matplotlib documentation 甚至给出了一个名为“histogram_percent_demo”的示例,其中积分看起来会超过 1000%。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    条形的高度之和不一定为 1。 就是曲线下的面积,和直方图的积分一样,等于一:

    import numpy as np
    import matplotlib.pyplot as plt
    r = np.random.uniform(size=1000)
    hist, bins, patches = plt.hist(r, normed=True)
    
    print((hist * np.diff(bins)).sum())
    # 1.0
    

    norm=True 因此返回一个可以解释为概率分布的直方图。

    【讨论】:

    • 我不认为这是不直观的。正如wikipeadia 还指出:“用于概率密度的直方图的总面积始终归一化为 1。如果 x 轴上的间隔长度均为 1,则直方图与相对频率图相同。 "所以你期待一个相对频率图,但norm=True 它确实是一个概率密度图。
    • Here 是一个非常典型的例子,normed=True 很有用——将直方图与拟合概率分布进行比较。规范直方图允许以相同的比例显示两个
    【解决方案2】:
    1. 根据matplotlib 3.0.2版本,

      normed :布尔值,可选 已弃用;请改用密度关键字参数。

    2. 因此,如果您想要密度图,请改用density=True

    3. 或者您可以使用seaborn.displot,它默认使用密度而不是频率来绘制直方图。

    4. normed =True 所做的是将曲线下的面积缩放为 1,如 @unutbu 所示。

    5. density=True 保持相同的属性(曲线下面积总和为 1)并且更有意义和有用。

      r = np.random.uniform(size=1000)
      hist, bins, patches = plt.hist(r, density=True)
      print((hist * np.diff(bins)).sum())
      

      [输出] 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 2021-12-20
      • 2011-07-25
      • 2015-06-30
      相关资源
      最近更新 更多