为什么matplotlib直方图的`normed`参数没有做任何事情?

时间:2017-08-25 19:21:06

标签: python matplotlib

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

  

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

     

默认为False

似乎很清楚。我已经看到它被称为密度函数,概率密度等。

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

enter image description here

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

enter image description here

但实际上它什么都不做:

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

enter image description here

而且:

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

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

matplotlib documentation甚至提供了一个名为“histogram_percent_demo”的示例,其中积分看起来会超过千分之百。

2 个答案:

答案 0 :(得分: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因此返回一个直方图,可以将其解释为概率分布。

答案 1 :(得分:0)

  1. 根据matplotlib版本3.0.2

      

    normed:布尔值,可选          不推荐使用;请改用density关键字参数。

  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