28

我有计数数据(其中 100 个),每个对应一个 bin(0 到 99)。我需要将这些数据绘制为直方图。但是,直方图会计算这些数据并且无法正确绘制,因为我的数据已经被分箱了。

import random
import matplotlib.pyplot as plt
x = random.sample(range(1000), 100)
xbins = [0, len(x)]
#plt.hist(x, bins=xbins, color = 'blue') 
#Does not make the histogram correct. It counts the occurances of the individual counts. 

plt.plot(x)
#plot works but I need this in histogram format
plt.show()
4

6 回答 6

37

如果我理解您想要正确实现的目标,那么以下内容应该可以满足您的需求:

import matplotlib.pyplot as plt
plt.bar(range(0,100), x)
plt.show()

它不使用hist(),但看起来您已经将数据放入 bin 中,所以没有必要。

于 2012-09-06T16:05:14.913 回答
12

问题出在您的 xbin 上。你目前有

xbins = [0, len(x)]

这将为您提供列表 [0, 100]。这意味着您只会看到 1 个 bin(不是 2 个)以 0 为界,以 100 为界。我不完全确定您想要从直方图中得到什么。如果你想有 2 个不均匀间隔的箱子,你可以使用

xbins = [0, 100, 1000]

在一个 bin 中显示低于 100 的所有内容,在另一个 bin 中显示其他所有内容。另一种选择是使用整数值来获得一定数量的均匀间隔的 bin。换句话说

plt.hist(x, bins=50, color='blue')

其中 bins 是所需的 bin 数量。

附带说明一下,每当我不记得如何使用 matplotlib 做某事时,我通常只会去缩略图库并找到一个看起来或多或少我想要完成的示例。这些示例都有随附的源代码,因此非常有用。matplotlib的文档也非常方便。

于 2012-09-06T16:01:16.613 回答
7

酷,谢谢!这就是我认为OP想要做的事情:

import random
import matplotlib.pyplot as plt
x=[x/1000 for x in random.sample(range(100000),100)]
xbins=range(0,len(x))
plt.hist(x, bins=xbins, color='blue')
plt.show()
于 2013-11-13T02:34:21.610 回答
2

我很确定你的问题是垃圾箱。它不是限制列表,而是 bin 边缘列表。

xbins = [0,len(x)]

在您的情况下返回一个列表,其中包含[0, 100]指示您想要一个位于 0 的 bin 边缘和一个位于 100 的 bin。所以你得到一个从 0 到 100 的 bin。你想要的是:

xbins = [x for x in range(len(x))]

返回:

[0,1,2,3, ... 99]

这表示您想要的 bin 边缘。

于 2012-09-06T16:02:51.790 回答
1

您也可以使用 matplotlib 的 hist 来实现这一点,不需要 numpy. 您基本上已经将垃圾箱创建为xbins. 在这种情况下x,将是您的权重。

plt.hist(xbins,weights=x)
于 2016-06-27T14:29:39.470 回答
0

查看 matplotlib 文档中的直方图示例。您应该使用该hist功能。如果默认情况下它没有产生您期望的结果,那么在hist将数据提供给hist. 我不太清楚你想要达到什么目标,所以在这一点上我无能为力。

于 2012-09-06T15:44:12.963 回答