python plot简单直方图给出binned数据

时间:2012-09-06 15:31:25

标签: python plot matplotlib histogram

我有计数数据(其中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()

6 个答案:

答案 0 :(得分:36)

如果我理解你想要正确实现的目标,那么以下内容可以为你提供你想要的东西:

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

它不使用hist(),但看起来您已将数据放入箱中,因此没有必要。

答案 1 :(得分:12)

问题在于你的xbins。你目前有

xbins = [0, len(x)]

将为您提供列表[0,100]。这意味着你只会看到1个bin(而不是2个)以及0以上的100以下。我不完全确定你想要的直方图。如果您想要2个不均匀间隔的垃圾箱,可以使用

xbins = [0, 100, 1000]

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

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

其中垃圾箱是所需垃圾箱的数量。

另一方面,每当我无法记住如何使用matplotlib做某事时,我通常只会转到thumbnail gallery并找到一个或多或少看起来我想要完成的示例。这些示例都附带了源代码,因此它们非常有用。 matplotlib的documentation也非常方便。

答案 2 :(得分: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()

答案 3 :(得分:2)

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

xbins = [0,len(x)]

在您的情况下返回一个包含[0, 100]的列表,表示您希望bin边缘为0,一个为100,因此您可以从0到100获得一个bin。 你想要的是:

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

返回:

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

表示您想要的bin边缘。

答案 4 :(得分:1)

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

plt.hist(xbins,weights=x)

答案 5 :(得分:0)

查看matplotlib文档中的直方图examples。您应该使用hist功能。如果它默认情况下不会产生您期望的结果,那么请使用hist的参数并准备/转换/修改数据,然后再将其提供给hist。我不清楚你想要达到什么目标,所以我现在无能为力。