【问题标题】:Creating a histogram that sorts array values into bins, and shows the the frequency of items in the bins创建一个直方图,将数组值分类到 bin 中,并显示 bin 中项目的频率
【发布时间】:2019-04-23 13:00:15
【问题描述】:

对于 0 到 1 之间的值数组,我想创建一个包含 5 个 bin 的直方图,其中 bin 1 显示 0-0.2 之间的频率(次数)数字出现在数组中,bin 2 显示频率0.2-0.4 之间的数字,bin 3 为 0.4-0.6,bin 4:0.6-0.8,bin 5 0.8-1。

import numpy as np
arr = np.array([0.5, 0.1, 0.05, 0.67, 0.8, 0.9, 1, 0.22, 0.25])
y, other_stuff = np.histogram(arr, bins=5)
x = range(0,5)
graph = plt.bar(x,height=y)
plt.show()

【问题讨论】:

  • 您的问题到底是什么?一个问题是如果 0 和 1 不在数据中,则它不会是您期望的 bin。您需要明确定义您的 bin(或范围),因为它们将由数据的最小值和最大值决定。
  • 如果您想使用条形图,请参见例如this answer.

标签: python arrays numpy matplotlib histogram


【解决方案1】:

我认为您正在寻找 matplotlib 的 hist 方法。

使用您的示例数组,代码如下所示:

import matplotlib.pyplot as plt

plt.hist(arr, bins=np.linspace(0,1,6), ec='black')

【讨论】:

  • 我不想指定 bin 的数量,因为 bin 的数量是可变的,在这个例子中我只有 5 个但我可以 30、40 或 1000。这张图片中的图表是我想要的一个例子,但我可能有 5 个这样的图表并排在一起,所以理想情况下我希望 y 的每个数组索引都是一个条形
  • 忽略我最后一句话中最后一个逗号后的所有内容
【解决方案2】:

这就是你所追求的吗?

import numpy
from numpy.random import random
import matplotlib.pyplot as plt
arr = random(100)
y, other_stuff = numpy.histogram(arr, bins=5)
x = numpy.linspace(0.1, 0.9, 5)
graph = plt.bar(x, height=y, width=0.2, edgecolor='black')
plt.show()

正如下面评论中所指出的,上面的 sn-p 没有在对 histogram() 的调用中定义 bin 的边缘。下面的一个纠正了这一点。

import numpy
import matplotlib.pyplot as plt
arr = numpy.array([0.5, 0.1, 0.05, 0.67, 0.8, 0.9, 1, 0.22, 0.25])
y, other_stuff = numpy.histogram(arr, bins=numpy.linspace(0, 1, 6))
graph = plt.bar(numpy.linspace(0.1, 0.9, 5), height=y, width=0.2,
                edgecolor='black')
plt.show()

【讨论】:

  • 注意!这只是看起来它工作正常。这只是巧合。您需要像在其他答案中一样定义垃圾箱。
  • 什么意思?对 histogram() 的调用根据 bins=5 返回 5 个值,对 bar() 的调用指定 bin 中心的位置(通过 x 和默认关键字 align='center')以及它们的总数宽度。我同意 hist() 的工作方式更好(并且我对答案表示赞同),但我不明白为什么我的答案只是巧合地起作用?我只是使用并改进了 OP 提供的 sn-p。
  • 如果你在 0 和 1 之间随机抽取 100 个点并将它们放入 5 个 bin 中,那么这些 bin 接近 [0,0.2), [0.2,0.4), etc 的可能性非常高。但是,这是一个通常不正确的假设,如果您采用例如,将导致错误的结果。问题中提供的数据。然后,您的方法将给出this result,这显然与@user7374610 的结果不同,您可以轻松地手动计算这些值,看看它没有正确地对这些值进行分箱。
猜你喜欢
  • 1970-01-01
  • 2019-07-21
  • 2020-03-28
  • 2019-01-18
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
相关资源
最近更新 更多