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