Python 为什么';matplotlib直方图的'normed'参数没有任何作用吗?

Python 为什么';matplotlib直方图的'normed'参数没有任何作用吗?,python,matplotlib,Python,Matplotlib,我被中的normed参数弄糊涂了,为什么它不改变绘图输出: 如果为True,返回元组的第一个元素将是counts 归一化以形成概率密度,即,n/(len(x)'dbin),即。, 直方图的积分总和为1。如果stacked也为真, 直方图之和标准化为1 默认值为False 看起来很清楚。我见过它叫做密度函数,概率密度,等等 也就是说,给定[0,10]中大小为1000的随机均匀分布: 指定normed=True应将y轴更改为密度轴,其中条形总和为1.0: 但实际上,它并没有这样做: r = np

我被中的
normed
参数弄糊涂了,为什么它不改变绘图输出:

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

默认值为False

看起来很清楚。我见过它叫做密度函数,概率密度,等等

也就是说,给定[0,10]中大小为1000的随机均匀分布:

指定
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对类似问题的回答,我并不要求解决问题。我的问题是,
normed
的目的是什么?我是否误解了这个参数的实际作用


matplotlib甚至给出了一个名为“直方图百分比演示”的示例,其中的积分看起来会超过千分之一。

条形图的高度不一定等于一。 它是曲线下的面积,与直方图的积分相同,等于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
因此返回一个直方图,该直方图可以解释为概率分布

  • 根据matplotlib版本3.0.2

    normed
    :布尔值,可选 不赞成;改用density关键字参数

  • 因此,如果您想要密度图,请使用
    density=True

  • 或者可以使用
    seaborn.displat
    ,默认情况下,它使用密度而不是频率绘制直方图

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

  • density=True
    保持相同的属性(曲线下的面积总和为1),更具意义和实用性

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


  • 我不认为这是不直观的。As还指出:“用于概率密度的直方图的总面积始终归一化为1。如果x轴上的间隔长度都为1,则直方图与相对频率图相同。”因此,您期望的是相对频率图,但使用
    norm=True
    时,它实际上是概率密度图。这是一个非常典型的例子,其中
    normed=True
    非常有用——将直方图与拟合的概率分布进行比较。对柱状图进行规范化可以使两个柱状图以相同的比例显示