如何在 matplotlib 的水平条形图中移除空的“padding”?

12
我希望能够去除/减少 matplotlib.pyplot.barh 绘图中顶部和底部空白填充(用红色方框标出)。我该怎么做?
这是我的绘图示例: enter image description here 以下是代码:
import matplotlib.pyplot as plt
from collections import Counter
import random


values = sorted(tags_dic.values())
labels = sorted(tags_dic, key=tags_dic.get)
bars = plt.barh(range(len(tags_dic)), values, align='center')
plt.yticks(range(len(tags_dic)), labels)
plt.xlabel('Count')
plt.ylabel('POS-tags')
plt.grid(True)
random.shuffle(COLLECTION)
for i in range(len(tags_dic)):
    bars[i].set_color(COLLECTION[i])
    print COLLECTION[i]
plt.show()

随机测试数据:

tags_dic = Counter({u'NNP': 521, u'NN': 458, u'IN': 450, u'DT': 415, u'JJ': 268, u'NNS': 244, u'VBD': 144, u'CC': 138, u'RB': 103, u'VBN': 98, u'VBZ': 69, u'VB': 65, u'TO': 64, u'PRP': 57, u'CD': 51, u'VBG': 50, u'VBP': 48, u'PRP$': 26, u'POS': 26, u'WDT': 20, u'WP': 20, u'MD': 19, u'EX': 11, u'WRB': 10, u'JJS': 7, u'RP': 6, u'JJR': 6, u'RBR': 5, u'NNPS': 5, u'FW': 4, u'SYM': 1, u'UH': 1})

2
看一下 plt.ylim() - Mel
我在考虑使用 plt.ylim(min(values),max(values)),但是没有样本数据无法测试。 - Mel
好的,POS标签的最大数量可以是40,最小数量为1。但是我尝试使用ymin=1, ymax=40,结果产生了疯狂的倾斜图。我不明白yminymax代表什么。文档中也没有描述。 - minerals
1个回答

16

您可以使用plt.margins进行控制。要完全删除顶部和底部的空白,可以设置:

plt.margins(y=0)
作为旁注,我认为您的绘图脚本中也存在错误:您对字典的值进行了排序,但没有对键进行排序,因此您最终得到的标签与它们所代表的值不相符。 我认为您可以按照以下方式进行修复:
labels = sorted(tags_dic, key=tags_dic.get)
plt.yticks(range(len(tags_dic)), labels)

1
哦,打击!你说得对,我忽略了一个严重的错误。已经修改。 - minerals
这可能不是最优的做法,因为您需要对字典进行两次排序。如果您的字典超过40个条目,则可能有更有效的方法来完成它(这可能更重要)。 - tmdavison
1
是的,我们可以这样做 oddic = OrderedDict(sorted([(k,v) for k,v in tags_dic.items()], key=lambda x: x[1])) - minerals

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