matplotlib在从字典中绘制时重新排列条形图

时间:2016-02-17 23:33:10

标签: python matplotlib

我正在尝试使用matplotlib从字典中构建一个条形图,但它似乎正在重新排列条形图。我该如何解决这个问题?

import numpy as np
import string

char_dict = {}

for char in string.lowercase:
    char_dict[char] = char_dict.get(char, 0) + np.random.randint(1, 10)

plt.bar(range(len(char_dict)), char_dict.values(), align = 'center')
_ = plt.xticks(range(len(char_dict)), char_dict.keys())
plt.margins(0.05, 0)

enter image description here

3 个答案:

答案 0 :(得分:1)

Python dicts没有订购:

https://docs.python.org/2/library/stdtypes.html#dict.items

  

键和值以任意顺序列出,这是非随机的,在Python实现中各不相同,并且取决于字典的插入和删除历史。

要解决此问题,您应该使用collections.OrderedDict来存储您的数据:https://docs.python.org/2/library/collections.html#ordereddict-objects

答案 1 :(得分:1)

如果您想要对值进行排序,请不要使用dict。返回可以是完全随机的。

OrderedDict(在集合库中)基本上是一个排序的字典。并且看起来/工作完全一样。

或者您可以使用两个列表作为键,一个列表作为值。

答案 2 :(得分:1)

普通词典没有订单。您可以使用Ordered dictionary。或者在绘制之前对结果进行排序:

import numpy as np
import matplotlib.pyplot as plt

input_str = 'testdstasdtaetsts'

char_dict = {}

for char in input_str.lower():
    char_dict[char] = char_dict.get(char, 0) + np.random.randint(1, 10)

result_list = sorted([[chars, counts] for chars, counts in char_dict.items()], key = lambda x: x[0])

characters = [x[0] for x in result_list]
counts = [x[1] for x in result_list]

plt.bar(range(len(char_dict)), counts, align = 'center')
_ = plt.xticks(range(len(char_dict)), characters)
plt.margins(0.05, 0)

plt.show()