如何生成单词频率直方图,其中条形根据其高度排序

时间:2016-02-24 07:44:45

标签: python python-2.7 matplotlib histogram ranking

我有很长的单词列表,我想生成列表中每个单词频率的直方图。我能够在下面的代码中做到这一点:

import csv
from collections import Counter
import numpy as np

word_list = ['A','A','B','B','A','C','C','C','C']

counts = Counter(merged)

labels, values = zip(*counts.items())

indexes = np.arange(len(labels))

plt.bar(indexes, values)
plt.show()

然而,它不会按等级显示分档(即按频率显示,因此最高频率是左边的第一个分区,依此类推),即使我打印counts它为我命令{ {1}}。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:11)

您可以先排序数据然后将有序数组传递给bar,以获得所需的输出。下面我使用numpy.argsort。然后该图看起来如下(我还将标签添加到栏中):

enter image description here

以下是使用一些内联注释生成绘图的代码:

from collections import Counter
import numpy as np
import matplotlib.pyplot as plt

word_list = ['A', 'A', 'B', 'B', 'A', 'C', 'C', 'C', 'C']

counts = Counter(word_list)

labels, values = zip(*counts.items())

# sort your values in descending order
indSort = np.argsort(values)[::-1]

# rearrange your data
labels = np.array(labels)[indSort]
values = np.array(values)[indSort]

indexes = np.arange(len(labels))

bar_width = 0.35

plt.bar(indexes, values)

# add labels
plt.xticks(indexes + bar_width, labels)
plt.show()

如果您只想绘制第一个n条目,可以替换

counts = Counter(word_list)

通过

counts = dict(Counter(word_list).most_common(n))

在上面的案例中,counts将是

{'A': 3, 'C': 4}

代表n = 2

如果您想删除图表的框架并直接标记条形图,可以查看this post