我对来自matplotlib.pyplot.hist的normed
参数以及为什么它不会改变绘图输出感到困惑:
如果为True,则返回元组的第一个元素将是计数 归一化以形成概率密度,即
n/(len(x)'dbin)
,即 直方图的积分将总和为1 。如果stacked
也为True, 直方图的总和归一化为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
所以,我已经看到@CarstenKönig的answers提出了类似的问题,并没有要求解决方法。我的问题是,normed
的目的是什么?我是否误解了这个参数实际上做了什么?
matplotlib documentation甚至提供了一个名为“histogram_percent_demo”的示例,其中积分看起来会超过千分之百。
答案 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)
根据matplotlib版本3.0.2
normed
:布尔值,可选 不推荐使用;请改用density关键字参数。
因此,如果要密度图,请改用density=True
。
或者您可以使用seaborn.displot
,它默认情况下使用密度而不是频率来绘制直方图。
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())
[出] 1