如何使用matplotlib绘制collections.Counter直方图?

20

如何绘制以下计数器对象的直方图?:

w = collections.Counter()
l = ['a', 'b', 'b', 'b', 'c']
for o in l:
    w[o]+=1

Counter 的构造函数可以直接接受列表并给出计数,因此您的代码可以替换为 collections.Counter(['a', 'b', 'b', 'b', 'c'])。另外,您尝试过使用 matplotlib.pyplot.hist 吗? - MatsLindh
2
可能是在Python中使用Counter()构建直方图?的重复问题。 - rahlf23
2个回答

42

看着你的数据和尝试,我猜你想要一个条形图而不是直方图。直方图用于绘制分布情况,但这不是你所拥有的。您可以简单地将keysvalues作为plt.bar的参数使用。这样,键将自动作为x轴刻度标签。

import collections
import matplotlib.pyplot as plt
l = ['a', 'b', 'b', 'b', 'c']
w = collections.Counter(l)
plt.bar(w.keys(), w.values())

在此输入图片描述


此解决方案导致 TypeError: unhashable type: 'dict_keys' 错误。 - Leopoldo
@Leopoldo:请问您正在使用哪个版本的Python? - Sheldore
1
你能试着使用plt.bar(list(w.keys()), list(w.values()))吗? - Sheldore
Python 3.6.4。使用list转换非常好,谢谢! - Leopoldo
@Sheldore,你是怎么得到这么漂亮的条形图的?你需要调整正常的matplotlib样式吗? - duhaime
1
啊哈,with plt.style.context('fivethirtyeight'): - duhaime

6
我猜这就是你想要做的事情?你只需要添加xtick标签(请参阅matplotlib文档)。
import matplotlib.pyplot as plt
import collections

l = ['a', 'b', 'b', 'b', 'c']

count = collections.Counter(l)
print(count)

plt.bar(range(len(count)), count.values())
plt.show()

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