matplotlib直方图中的不对称性

时间:2015-03-17 15:37:52

标签: python matplotlib plot histogram

在阅读了matplotlib关于我预期的直方图的文档后,该范围忽略了较低和较高的异常值。

" range:元组,可选,默认值:无     箱子的下部和上部范围。下部和上部异常值     被忽略了。如果未提供,range为(x.min(),x.max())。范围     如果bins是序列,则无效。"

看一下以下示例:

import numpy as np
import matplotlib.pyplot as plt

numbers1 = np.arange(1.,101.)
numbers2 = np.arange(0.5,100.5)
numbers3 = np.arange(0,100)

plt.figure(figsize=(12,4))
plt.subplot(1,3,1)
plt.hist(numbers1, bins = 25, range = (25,75), normed=True)
plt.title('numbers1')
plt.ylim((0,0.035))
plt.subplot(1,3,2)
plt.hist(numbers2, bins = 25, range = (25,75), normed=True)
plt.title('numbers2')
plt.ylim((0,0.035))
plt.subplot(1,3,3)
plt.hist(numbers3, bins = 25, range = (25,75), normed=True)
plt.title('numbers3')
plt.ylim((0,0.035))

不幸的是我无法发布结果的图像......(声誉不够),但是:numbers1和numbers3的直方图的值都高于我预期的最后一个bin。

为什么会发生这种情况,是否真的应该如此?我希望他们所有人都看起来像中间人。 : - (

enter image description here

1 个答案:

答案 0 :(得分:1)

25-75范围内的所有数字都用于直方图。对于数组numbers1numbers3,由于包含25和75,因此正好是51个数字。您将这些数字强制为25个分档,这意味着将有24个高度2/51和一个高度3/51。 Matplotlib选择将73,74和75全部放在最后一个bin中并使其成为最大的。

对于numbers2,范围内只有50个数字,即25.5到74.5。因此,每个bin的高度为2/50

您可以看到,对于numbers1numbers3,当您设置范围(25, 74.99999)(25.0000001, 75)时,较高的分档会消失,因为排除了25或75,该范围内有50个数字。


您可以获取容器的限制,因为plt.hist返回值,容器和补丁。所以,如果你使用

(n, bins, p) = plt.hist(numbers1, bins = 25, range = (25,75), normed=True)

bins包含26个区间的数组。所以这是垃圾箱的所有起点加上最后一个垃圾箱的终点。使用此功能,您可以精确地推断出每个值都在哪个bin中。