我有以下列表:
[6, 4, 0, 0, 0, 0, 0, 1, 3, 1, 0, 3, 3, 0, 0, 0, 0, 1, 1, 0, 0, 0, 3, 2, 3, 3, 2, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 2, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 0, 0, 0, 2, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 3, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 2, 2, 3, 2, 1, 0, 0, 0, 1, 2]
我想用python绘制每个实体的频率,并对其进行幂律分析。
但我无法想象我如何用伊莱贝尔绘制列表,频率和列表上数字的X标签。
我想用频率创建一个dict并绘制字典的值,但是这样,我就不能把数字放在xlabel上。
有什么建议吗?
最佳答案
我认为你对字典的看法是正确的:
>>> import matplotlib.pyplot as plt
>>> from collections import Counter
>>> c = Counter([6, 4, 0, 0, 0, 0, 0, 1, 3, 1, 0, 3, 3, 0, 0, 0, 0, 1, 1, 0, 0, 0, 3, 2, 3, 3, 2, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 2, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 0, 0, 0, 2, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 3, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 2, 2, 3, 2, 1, 0, 0, 0, 1, 2])
>>> sorted(c.items())
[(0, 50), (1, 30), (2, 9), (3, 8), (4, 1), (5, 1), (6, 1)]
>>> plt.plot(*zip(*sorted(c.items()))
... )
[<matplotlib.lines.Line2D object at 0x36a9990>]
>>> plt.show()
这里有几件有趣的东西。
zip(*sorted(c.items()))
将返回类似于[(0,1,2,3,4,5,6),(50,30,9,8,1,1,1)]
的内容。我们可以使用*
操作符解包,以便plt.plot
看到2个参数--(0,1,2,3,4,5,6)
和(50,30,9,8,1,1,1)
。分别用作绘图中的x
和y
值。对于数据的拟合,
scipy
在这里可能会有所帮助。具体来说,请看下面的examples。(其中一个例子甚至使用了幂律)。