Python绘制简单的直方图,给定分组数据。

29

我有计数数据(共100个),每个对应一个箱子(从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()

您可以使用此答案或此答案中的代码作为绘制已分组数据直方图的示例。 - tmthydvnprt
6个回答

37

如果我正确理解了您想要实现的内容,那么以下代码应该可以给您想要的结果:

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

虽然它没有使用 hist(),但看起来你已经将数据放入了区间中,因此没有必要使用。


1
如果你想让 bar 看起来更像 hist 的输出,可以使用这个答案或这个答案中的代码作为通过 bar 绘制直方图的示例。 - tmthydvnprt

12

问题出在你的 xbins 上。目前你的 xbins:

xbins = [0, len(x)]

这将给你一个列表[0, 100]。意思是你只会看到一个范围为0到100的bin(而不是2个)。我不确定你想从直方图中获得什么信息。如果你想要两个不均匀间隔的bin,你可以使用

xbins = [0, 100, 1000]

要在一个区间内显示小于100的所有内容,并将其他内容显示在另一个区间内。另一个选项是使用整数值来获取一定数量的均匀间隔的区间。换句话说,执行:

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

其中的bins是所需直方图中的柱子数量。

顺便说一句,每当我忘记如何使用matplotlib时,我通常会去缩略图库找到一个看起来与我想要实现的东西更或少相似的示例。这些示例都有相应的源代码,因此非常有用。Matplotlib的文档也非常方便。


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()

2

我相信您遇到的问题是关于“bins”的。它不是限制列表,而是一组箱边界。

xbins = [0,len(x)]

在您的情况下,返回一个包含[0, 100]的列表,表示您希望在0和100处有一个箱边缘。因此,您将获得一个从0到100的箱子。

您需要的是:

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

这将返回:

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

这表示您想要的箱边界。


1
您可以使用matplotlib的hist实现这一点,无需使用numpy。您已经创建了xbins作为bin。在这种情况下,x将是您的权重。
plt.hist(xbins,weights=x)

0

请在Matplotlib文档中查看直方图示例。你应该使用hist函数。如果默认情况下没有得到你期望的结果,那么试着调整hist函数的参数,并在提供给hist之前准备/转换/修改你的数据。目前我不太清楚你想要实现什么,所以无法提供帮助。


尝试了一段时间后,我问了这个问题。我唯一关心的是是否可以使用hist函数实现上述代码所做的事情。 - Curious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接