matplotlib直方图中的不对称性

3

阅读matplotlib有关直方图的文档后,我预期range会忽略下限和上限的异常值。

"range:元组,可选参数,默认值为None 柱形图的下限和上限范围。下限和上限的异常值将被忽略。 如果没有提供,则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))

很不幸,由于声望不够,我无法发布结果的图像...但是:数字1和数字3的直方图都具有比我预期的最后一个bin高的值。

为什么会这样,它真的应该这样吗?我希望它们全部看起来像中间那个。 :-(

enter image description here

1个回答

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

对于numbers2,范围内只有50个数字,从25.5到74.5。因此,每个箱子的高度都是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 个区间的起始点,以及最后一个区间的结束点。通过使用这些信息,您可以准确地推断出每个值所在的区间。


非常感谢!Matplotlib默认会选择将所有内容放在最后一个bin中,还是可能会有其他地方结束的情况呢? - cattt84
这取决于如何定义箱子。如果您将范围设置为(25, 75.01),则每个箱子都会稍微大一些,因此第一个箱子将适合25、26和27。使用从25到75的范围并恰好具有25到75的数字,您就有了一个边缘情况,而Matplotlib显然使用最后一个箱子。 - fhdrsdg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接