在阅读了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。
为什么会发生这种情况,是否真的应该如此?我希望他们所有人都看起来像中间人。 : - (
答案 0 :(得分:1)
25-75范围内的所有数字都用于直方图。对于数组numbers1
和numbers3
,由于包含25和75,因此正好是51个数字。您将这些数字强制为25个分档,这意味着将有24个高度2/51
和一个高度3/51
。 Matplotlib选择将73,74和75全部放在最后一个bin中并使其成为最大的。
对于numbers2
,范围内只有50个数字,即25.5到74.5。因此,每个bin的高度为2/50
。
您可以看到,对于numbers1
和numbers3
,当您设置范围(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中。