Matplotlib hist函数中Normed参数的问题

Matplotlib hist函数中Normed参数的问题

在使用Matplotlib库中的pylab.hist()函数进行数据统计展示时,常常会调用该函数的normed参数进行数据归一化操作,但是有些文献中会将其称为density参数,从而引起一些混淆。本文将介绍使用normed参数进行归一化的方法,以及可能出现的问题及解决方法。

阅读更多:Matplotlib 教程

normed参数的用法

normed参数是在pylab.hist函数中进行数据归一化的重要参数,当normed参数值为1,即normed=True时,对数据进行归一化使其值域在0-1之间,这就意味着,实际数值除以区间长度,输出的面积之和等于1。例如,我们有以下样本数据:

import numpy as np
import matplotlib.pyplot as plt

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)

使用pylab.hist()函数进行统计分析展示,不使用归一化的代码如下:

n, bins, patches = plt.hist(x, bins=50, density=False, alpha=0.5, color='r')
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram')
plt.show()

此时我们得到的图像并未对数据进行归一化处理,而对该数据进行normed参数为True的归一化处理,代码如下:

n, bins, patches = plt.hist(x, bins=50, density=True, alpha=0.5, color='r')
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram')
plt.show()

可以看到,在将normed参数设置为True时,数据被归一化并且纵轴区间变换为[0,1]。

normed参数的问题

在使用Matplotlib库绘制直方图时,使用normed参数进行归一化操作时,负值及正值之和可能会不等于1,这是因为将浮点数转换成二进制储存会出现精度误差,计算可能会产生一些不是我们预期的结果。例如,我们有以下样本数据:

x = [-1.2, -0.3, 0.5, 1.2, 2.5, 3.4, 4.5]

对其进行normed参数为True的归一化处理,代码如下:

plt.hist(x, bins=20, normed=True)

此时可以看到,如果我们假设统计的概率密度函数的积分是1,(即我们使用了normed=True)则在某个区间上,似乎积分总和是大于1或小于1了,这是因为浮点数精度误差导致的。这种情况下,我们应该使用bins参数来更好的控制直方图的表现。

解决方法

解决这个问题的一个方法是手动设置bins参数,以便使得直方图中的所有条的面积之和为1。例如,在上面的例子中,代码如下:

bins=[-1.2, -0.3, 0.5, 1.2, 2.5, 3.4, 4.5, 5.6]
plt.hist(x, bins=bins, normed=True)

这个时候,和应该符合预期,所有区间的积分都等于1。

总结

Matplotlib库中的pylab.hist()函数是一种方便的快速绘制直方图的方式,而normed参数则可以进行数据的归一化。但是在使用normed参数时,可能会出现负值及正值之和不等于1的问题,这是由于浮点数的精度误差导致的。解决这个问题的方法是手动设置bins参数,以便直方图中的所有条的面积之和为1。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程